While React Portals are commonly used for modals, they’re just as valuable for lightweight UI elements like tooltips and popovers. Tooltips often need to escape container boundaries (like overflow: hidden) and stack correctly above all other content. That’s exactly where React Portals shine.

In this article, we’ll use a portal to render a tooltip outside the parent component’s DOM tree — avoiding layout bugs and z-index conflicts.


Step 1: Set Up a Portal Root

Just like with modals, create a separate DOM node for your tooltip content in public/index.html:


  

This is where the tooltip will be mounted via a portal.


Step 2: Create the Tooltip Component

Let’s build a tooltip that renders via ReactDOM.createPortal and positions itself near a target element using getBoundingClientRect().

import React, { useEffect, useRef, useState } from "react";
import ReactDOM from "react-dom";

const tooltipRoot = document.getElementById("tooltip-root");

export default function Tooltip({ targetRef, text, visible }) {
  const [position, setPosition] = useState({ top: 0, left: 0 });
  const tooltipRef = useRef(null);

  useEffect(() => {
    if (visible && targetRef.current) {
      const rect = targetRef.current.getBoundingClientRect();
      setPosition({
        top: rect.bottom + window.scrollY + 8,
        left: rect.left + window.scrollX + rect.width / 2,
      });
    }
  }, [visible, targetRef]);

  if (!visible) return null;

  return ReactDOM.createPortal(
    
{text}
, tooltipRoot ); }

Step 3: Style the Tooltip

Add basic styles for the floating tooltip:

.tooltip {
  position: absolute;
  transform: translateX(-50%);
  background: #222;
  color: #fff;
  padding: 6px 10px;
  border-radius: 4px;
  font-size: 0.875rem;
  white-space: nowrap;
  pointer-events: none;
  z-index: 1000;
}

This ensures the tooltip is small, centered above the target, and doesn't block pointer events.


Step 4: Use the Tooltip

Now let’s use it in a component:

import React, { useRef, useState } from "react";
import Tooltip from "./Tooltip";

function TooltipExample() {
  const btnRef = useRef();
  const [hovered, setHovered] = useState(false);

  return (
    
); }

When the button is hovered, the tooltip appears — positioned outside the normal DOM flow, thanks to the portal.


Why Use Portals for Tooltips:

  • 🚫 Avoid clipping inside scrollable or overflow-hidden containers
  • 🧼 Keeps z-index and stacking predictable
  • 📦 Lightweight and easily reusable

Summary

React Portals aren’t just for full-screen modals — they’re perfect for tooltips, dropdowns, and overlays that need to “break out” of the DOM layout. By positioning your tooltip with getBoundingClientRect() and rendering it in a portal, you get precise control over placement and styling — without DOM headaches.


For a much more extensive guide on getting the most out of React portals, check out my full 24-page PDF file on Gumroad. It's available for just $10:

Using React Portals Like a Pro.

If this was helpful, you can also support me here: Buy Me a Coffee