Files
react-test/docs/data/material/components/tooltips/tooltips.md

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

199 lines
6.2 KiB
Markdown
Raw Normal View History

2025-12-12 14:26:25 +09:00
---
productId: material-ui
title: React Tooltip component
components: Tooltip
githubLabel: 'scope: tooltip'
materialDesign: https://m2.material.io/components/tooltips
waiAria: https://www.w3.org/WAI/ARIA/apg/patterns/tooltip/
githubSource: packages/mui-material/src/Tooltip
---
# Tooltip
<p class="description">Tooltips display informative text when users hover over, focus on, or tap an element.</p>
When activated, Tooltips display a text label identifying an element, such as a description of its function.
{{"component": "@mui/docs/ComponentLinkHeader"}}
## Basic tooltip
{{"demo": "BasicTooltip.js"}}
## Positioned tooltips
The `Tooltip` has 12 **placement** choices.
They don't have directional arrows; instead, they rely on motion emanating from the source to convey direction.
{{"demo": "PositionedTooltips.js"}}
## Customization
Here are some examples of customizing the component.
You can learn more about this in the [overrides documentation page](/material-ui/customization/how-to-customize/).
{{"demo": "CustomizedTooltips.js"}}
## Arrow tooltips
You can use the `arrow` prop to give your tooltip an arrow indicating which element it refers to.
{{"demo": "ArrowTooltips.js"}}
## Distance from anchor
To adjust the distance between the tooltip and its anchor, you can use the `slotProps` prop to modify the [offset](https://popper.js.org/docs/v2/modifiers/offset/) of the popper.
{{"demo": "TooltipOffset.js"}}
Alternatively, you can use the `slotProps` prop to customize the margin of the popper.
{{"demo": "TooltipMargin.js"}}
## Custom child element
The tooltip needs to apply DOM event listeners to its child element.
If the child is a custom React element, you need to make sure that it spreads its props to the underlying DOM element.
```jsx
const MyComponent = React.forwardRef(function MyComponent(props, ref) {
// Spread the props to the underlying DOM element.
return (
<div {...props} ref={ref}>
Bin
</div>
);
});
// ...
<Tooltip title="Delete">
<MyComponent />
</Tooltip>;
```
If using a class component as a child, you'll also need to ensure that the ref is forwarded to the underlying DOM element. (A ref to the class component itself will not work.)
```jsx
class MyComponent extends React.Component {
render() {
const { innerRef, ...props } = this.props;
// Spread the props to the underlying DOM element.
return (
<div {...props} ref={innerRef}>
Bin
</div>
);
}
}
// Wrap MyComponent to forward the ref as expected by Tooltip
const WrappedMyComponent = React.forwardRef(function WrappedMyComponent(props, ref) {
return <MyComponent {...props} innerRef={ref} />;
});
// ...
<Tooltip title="Delete">
<WrappedMyComponent />
</Tooltip>;
```
## Triggers
You can define the types of events that cause a tooltip to show.
The touch action requires a long press due to the `enterTouchDelay` prop being set to `700`ms by default.
{{"demo": "TriggersTooltips.js"}}
## Controlled tooltips
You can use the `open`, `onOpen` and `onClose` props to control the behavior of the tooltip.
{{"demo": "ControlledTooltips.js"}}
## Variable width
The `Tooltip` wraps long text by default to make it readable.
{{"demo": "VariableWidth.js"}}
## Interactive
Tooltips are interactive by default (to pass [WCAG 2.1 success criterion 1.4.13](https://www.w3.org/TR/WCAG21/#content-on-hover-or-focus)).
It won't close when the user hovers over the tooltip before the `leaveDelay` is expired.
You can disable this behavior (thus failing the success criterion which is required to reach level AA) by passing `disableInteractive`.
{{"demo": "NonInteractiveTooltips.js"}}
## Disabled elements
By default disabled elements like `<button>` do not trigger user interactions so a `Tooltip` will not activate on normal events like hover. To accommodate disabled elements, add a simple wrapper element, such as a `span`.
:::warning
In order to work with Safari, you need at least one display block or flex item below the tooltip wrapper.
:::
{{"demo": "DisabledTooltips.js"}}
:::warning
If you're not wrapping a Material UI component that inherits from `ButtonBase`, for instance, a native `<button>` element, you should also add the CSS property _pointer-events: none;_ to your element when disabled:
:::
```jsx
<Tooltip title="You don't have permission to do this">
<span>
<button disabled={disabled} style={disabled ? { pointerEvents: 'none' } : {}}>
A disabled button
</button>
</span>
</Tooltip>
```
## Transitions
Use a different transition.
{{"demo": "TransitionsTooltips.js"}}
## Follow cursor
You can enable the tooltip to follow the cursor by setting `followCursor={true}`.
{{"demo": "FollowCursorTooltips.js"}}
## Virtual element
In the event you need to implement a custom placement, you can use the `anchorEl` prop:
The value of the `anchorEl` prop can be a reference to a fake DOM element.
You need to create an object shaped like the [`VirtualElement`](https://popper.js.org/docs/v2/virtual-elements/).
{{"demo": "AnchorElTooltips.js"}}
## Showing and hiding
The tooltip is normally shown immediately when the user's mouse hovers over the element, and hides immediately when the user's mouse leaves. A delay in showing or hiding the tooltip can be added through the `enterDelay` and `leaveDelay` props.
On mobile, the tooltip is displayed when the user longpresses the element and hides after a delay of 1500ms. You can disable this feature with the `disableTouchListener` prop.
{{"demo": "DelayTooltips.js"}}
## Accessibility
(WAI-ARIA: https://www.w3.org/WAI/ARIA/apg/patterns/tooltip/)
By default, the tooltip only labels its child element.
This is notably different from `title` which can either label **or** describe its child depending on whether the child already has a label.
For example, in:
```html
<button title="some more information">A button</button>
```
the `title` acts as an accessible description.
If you want the tooltip to act as an accessible description you can pass `describeChild`.
Note that you shouldn't use `describeChild` if the tooltip provides the only visual label. Otherwise, the child would have no accessible name and the tooltip would violate [success criterion 2.5.3 in WCAG 2.1](https://www.w3.org/WAI/WCAG21/Understanding/label-in-name.html).
{{"demo": "AccessibilityTooltips.js"}}