ShipNative
PricingBlogFAQContact
Build my app
ShipNative
PricingBlogFAQContact
Build my app
GuideOctober 2026 · 7 min read · By Saurabh Singh

React Native Tooltip: Libraries, Positioning, and Why There Is No Hover

On the web a tooltip is one CSS rule and a title attribute. In React Native it is a small engineering problem: there is no hover, no built-in component, and the view you want to float over everything else is, by default, clipped by its own parent. This is the working reference: the three real options in 2026, a tooltip you can paste and own, and the two layout traps that make tooltips disappear on Android.

First decide what you actually want

“Tooltip” covers three different things in a mobile app, and picking the wrong one is the most common mistake:

  • An on-demand hint. A small bubble that explains one control when the user taps an info icon. This is the classic tooltip and the subject of this post.
  • A popover. A bubble with real content: a short menu, a date picker, a confirmation. Same positioning problem, bigger box, different library.
  • A coach mark. A sequence of hints with a dimmed backdrop that runs once on first launch. Different problem entirely; use an onboarding library.

One more thing worth saying plainly: a tooltip is never the only way to learn what a control does. Screen reader users will not perform your long-press. Put the same text in accessibilityHint on the control, and treat the tooltip as the visual version of it.

The options, honestly

OptionTypePlatformsPick it forThe cost
react-native-walkthrough-tooltipJS, renders in a ModaliOS · Android · WebArrow, auto-placement, dimmed backdrop, works in Expo GoContent area is small by design; one tooltip open at a time
react-native-popover-viewJS, renders in a ModaliOS · AndroidArbitrary children, anchors to a ref or a rect, good dismiss handlingHeavier; placement logic can fight you near screen edges
react-native-copilot / rn-tourguideJS, onboardingiOS · AndroidMulti-step walkthrough with spotlight and next/skip for freeWrong tool for a single on-demand hint
DIY: Pressable + measureInWindow + ModalJS, yoursiOS · Android · WebNo dependency, exactly your design, 60 linesYou handle edge flipping and the arrow yourself

If you want the library answer: react-native-walkthrough-tooltip. It wraps the anchor, measures it, renders the bubble in its own Modal so nothing can clip it, and flips placement when the anchor is near an edge. The API is small:

import Tooltip from 'react-native-walkthrough-tooltip';

function BudgetHint() {
  const [open, setOpen] = useState(false);

  return (
    <Tooltip
      isVisible={open}
      placement="top"
      onClose={() => setOpen(false)}
      content={<Text>Rolls over unspent money to next month.</Text>}
    >
      <Pressable
        onPress={() => setOpen(true)}
        accessibilityLabel="What does rollover mean"
        accessibilityHint="Rolls over unspent money to next month"
        hitSlop={8}
      >
        <Ionicons name="information-circle-outline" size={18} />
      </Pressable>
    </Tooltip>
  );
}

Note the hitSlop. An 18-point icon is below the 44-point minimum touch target on both platforms, and a tooltip that is hard to open is a tooltip nobody reads.

A tooltip you own, in 60 lines

For one or two hints in an app, a dependency is more code than the feature. The pattern below is what the libraries do internally: measure the anchor in window coordinates, open a transparent Modal, and place the bubble relative to the measured rect.

// Tooltip.tsx
import { useRef, useState } from 'react';
import { Modal, Pressable, Text, View, StyleSheet, useWindowDimensions } from 'react-native';

type Rect = { x: number; y: number; width: number; height: number };

export function Tooltip({ text, children }) {
  const anchor = useRef<View>(null);
  const [rect, setRect] = useState<Rect | null>(null);
  const { width: screenW } = useWindowDimensions();

  const open = () => {
    // measureInWindow gives window coords, which is what a Modal uses.
    // measure() gives coords relative to the parent, which is useless here.
    anchor.current?.measureInWindow((x, y, width, height) => {
      setRect({ x, y, width, height });
    });
  };

  const bubbleW = 220;
  // Center under the anchor, then clamp so it never leaves the screen.
  const left = rect
    ? Math.min(Math.max(8, rect.x + rect.width / 2 - bubbleW / 2), screenW - bubbleW - 8)
    : 0;

  return (
    <>
      <Pressable ref={anchor} onPress={open} hitSlop={8} accessibilityHint={text}>
        {children}
      </Pressable>

      <Modal visible={!!rect} transparent animationType="fade" onRequestClose={() => setRect(null)}>
        {/* Full-screen backdrop: a tap anywhere dismisses. */}
        <Pressable style={styles.backdrop} onPress={() => setRect(null)}>
          {rect && (
            <View style={[styles.bubble, { top: rect.y + rect.height + 8, left, width: bubbleW }]}>
              <Text style={styles.text}>{text}</Text>
            </View>
          )}
        </Pressable>
      </Modal>
    </>
  );
}

const styles = StyleSheet.create({
  backdrop: { flex: 1 },
  bubble: {
    position: 'absolute',
    backgroundColor: '#1f1f1f',
    borderRadius: 10,
    paddingVertical: 10,
    paddingHorizontal: 12,
    // Both platforms: Android reads elevation, iOS reads shadow*.
    elevation: 6,
    shadowColor: '#000',
    shadowOpacity: 0.25,
    shadowRadius: 10,
    shadowOffset: { width: 0, height: 4 },
  },
  text: { color: '#fff', fontSize: 14, lineHeight: 20 },
});

Two things this version deliberately skips. It always opens below the anchor; if your hint sits near the bottom of the screen, compare rect.y to the window height and set bottom instead of top. And it has no arrow. An arrow is a rotated 10-point square positioned at the anchor center, and in practice most apps skip it on mobile because the bubble is close enough to its control to read.

On the New Architecture, measureInWindow still works and is still the right call for this job. If you are already on Reanimated, the measure() worklet gives you the same rect synchronously on the UI thread, which only matters if the tooltip has to follow a moving anchor.

The two traps that eat tooltips

Android clips every child to its parent. On iOS a view can overflow its parent and still be visible. On Android overflow: 'visible' is only partly honoured and a bubble that pokes out of a card, a row, or a header gets cut at the edge. This is the reason every serious tooltip library renders into a Modal. Do not fight it with zIndex; the parent boundary wins.

zIndex does not cross siblings with elevation. Inside a ScrollView, a tooltip rendered by item three will be drawn under item four if item four has an elevation or comes later in the tree. Again the fix is to leave the tree: Modal, or a Portal host mounted at the app root such as @gorhom/portal, which is what you want when a Modal’s own window is a problem, for example when the tooltip has to appear above a bottom sheet that is itself a Modal.

One Modal-specific gotcha: a React Native Modal is a separate native window, so a tooltip inside it will sit above your toast host and your bottom sheet. Usually that is what you want. When it is not, Portal is the answer.

When to skip the tooltip entirely

If a control needs a tooltip to be understood, the first fix to try is a better label. A line of helper text under a form field is read by everyone, costs no gesture, and needs no measuring. Tooltips earn their place for dense screens where helper text on every control would double the height: a settings page, a stats dashboard, a pricing table.

This is also the default in apps generated with ShipNative: inline helper text first, an info-icon tooltip built on the Modal pattern above only where the screen is too dense for it. If you describe a screen that needs one, say which control and what the hint should say, and you get the Pressable, the measured rect, and the accessibilityHint together.

Frequently Asked Questions

Does React Native have a built-in tooltip component?

No. React Native core has no Tooltip, and there is no hover event on a touch screen to trigger one. You either install a library such as react-native-walkthrough-tooltip or react-native-popover-view, or build one yourself from a Pressable, measureInWindow, and a transparent Modal.

What is the best tooltip library for React Native in 2026?

react-native-walkthrough-tooltip is the common default: pure JavaScript, works in Expo Go, draws an arrow, and positions itself around the anchor. react-native-popover-view is the better pick when the tooltip needs real content such as a menu or a form, because it handles arbitrary children and dismiss gestures well. For a one-off hint, a Modal you write yourself is less code than either dependency.

Why is my tooltip cut off or hidden behind other views?

Because it is rendered inside the component it belongs to. On Android every View clips its children, so a tooltip that extends past its parent is cut at the parent edge, and inside a ScrollView or a card with elevation it sits under siblings regardless of zIndex. Render the tooltip through a Modal or a Portal so it lives at the root of the view hierarchy, and position it with coordinates you measured from the anchor.

How do I trigger a tooltip on mobile without hover?

Tap or long-press. The convention most apps use is a small info icon that opens the tooltip on tap and closes it on the next tap anywhere. Long-press on the control itself works for power users but is undiscoverable, so do not make it the only path. For accessibility, also set accessibilityHint on the control so screen reader users get the same explanation without the gesture.

Should I use a tooltip or a coach mark for onboarding?

A tooltip explains one control on demand. A coach mark, or walkthrough, is a sequence of tooltips with a dimmed backdrop that runs once on first launch. If you need the sequence, use a library built for it such as react-native-copilot or rn-tourguide rather than chaining tooltips by hand, because the step ordering, the spotlight cutout, and the skip button are the hard parts.

→

React Native Modal: Which One to Use

Why a Modal is the right container for anything that floats over the screen.

Read guide →
→

React Native Toast: Which Library, and How

The other floating UI piece, and the same root-mount lesson.

Read guide →

Ship a real React Native app today

Describe, preview, and export Expo code, free to start.

Build with ShipNative
ShipNative

Build mobile apps with AI. Describe it, try it on your phone, own the code.

Features

Text to App AIApp Generator from ScreenshotPRD to Mobile AppDesign References

Tools

All free toolsApp Cost CalculatorApp Name GeneratorApp Store Keyword ToolReact Native Components

Blog

All blog postsHow to Build an App Without CodingBest AI Tools for Real Mobile AppsExpo EAS App Store ChecklistLovable, Cursor & v0 for MobileBest AI App Builders in 2026React Native AI App Builder Guide
© 2026 ShipNative
PrivacyTermsAboutFAQPricingDiscordShipNative - Featured on Startup FameFeatured on Twelve ToolsFeatured on TinyShelfShipNative - Launched on Fazier