Autor: rioyi | Lectura: 4 minutos | Nov 29, 2024
En este tutorial, te guiaré para crear un componente Tooltip sencillo pero funcional, que podrás personalizar y usar en tus propios proyectos.
npx create-react-app tooltip-example
src/Tooltip.jsx
import React, { useState, useEffect, useRef } from "react";
import ReactDOM from "react-dom";
const Tooltip = ({ children, content }) => {
const [visible, setVisible] = useState(false);
const [position, setPosition] = useState({ top: 0, left: 0 });
const tooltipRef = useRef(null);
const triggerRef = useRef(null);
return (
<>
<div
ref={triggerRef}
onMouseEnter={() => setVisible(true)}
onMouseLeave={() => setVisible(false)}
style={{ display: "inline-block" }}
>
{children}
</div>
{visible &&
ReactDOM.createPortal(
<div
ref={tooltipRef}
style={{
position: "absolute",
top: position.top,
left: position.left,
backgroundColor: "black",
color: "white",
padding: "8px",
borderRadius: "4px",
zIndex: 1000,
}}
>
{content}
</div>,
document.body
)}
</>
);
};
export default Tooltip;
useEffect(() => {
const updatePosition = () => {
if (triggerRef.current && tooltipRef.current) {
const triggerRect = triggerRef.current.getBoundingClientRect();
const tooltipRect = tooltipRef.current.getBoundingClientRect();
setPosition({
top: triggerRect.top - tooltipRect.height - 8, // Espacio de 8px
left: triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2,
});
}
};
if (visible) {
updatePosition();
window.addEventListener("resize", updatePosition);
window.addEventListener("scroll", updatePosition);
}
return () => {
window.removeEventListener("resize", updatePosition);
window.removeEventListener("scroll", updatePosition);
};
}, [visible]);
<div
ref={tooltipRef}
style={{
position: "absolute",
top: position.top,
left: position.left,
backgroundColor: "black",
color: "white",
padding: "8px",
borderRadius: "4px",
zIndex: 1000,
boxShadow: "0px 4px 6px rgba(0,0,0,0.1)",
}}
>
{content}
</div>
className="absolute z-50 bg-black text-white text-sm rounded py-1 px-2 shadow-lg"
import React from "react";
import Tooltip from "./Tooltip";
const App = () => {
const name = "Rioyi"
return (
<div style={{ padding: "100px" }}>
<Tooltip key={index}
content={
<div>
<strong>{name}</strong>
</div>
}>
<button style={{ padding: "8px 16px" }}>Pasa el cursor aquí</button>
</Tooltip>
</div>
);
};
export default App;
¡Considera invitarme un café para apoyarme a manter los servidores!