Portalsでツールチップとドロップダウンメニューを作る
Portalsを使って、overflow-hiddenコンテナの外側にツールチップやドロップダウンをレンダリングします
「Portalsでツールチップとドロップダウンメニューを作る」はCoddyKit上の無料React Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。
ようこそ
オーバーフローの問題
配置戦略
const rect = triggerRef.current.getBoundingClientRect();
const top = rect.bottom + window.scrollY + 8;
const left = rect.left + window.scrollX;Tooltipコンポーネント
function Tooltip({ content, children }) {
const [visible, setVisible] = useState(false);
const [pos, setPos] = useState({ top: 0, left: 0 });
const ref = useRef();
const show = () => {
const r = ref.current.getBoundingClientRect();
setPos({ top: r.bottom + window.scrollY + 4,
left: r.left + window.scrollX });
setVisible(true);
};
return (
<span ref={ref} onMouseEnter={show} onMouseLeave={() => setVisible(false)}>
{children}
{visible && createPortal(
<div style={{ position:'absolute', top: pos.top, left: pos.left }}
className="tooltip">{content}</div>,
document.body
)}
</span>
);
}スクロールとリサイズ時に位置を更新する
useEffect(() => {
if (!visible) return;
const update = () => setVisible(false);
window.addEventListener('scroll', update, true);
window.addEventListener('resize', update);
return () => {
window.removeEventListener('scroll', update, true);
window.removeEventListener('resize', update);
};
}, [visible]);ドロップダウンメニューの構成
外側のクリックを検知するハンドラー
useEffect(() => {
if (!open) return;
const handler = (e) => {
if (!menuRef.current?.contains(e.target) &&
!triggerRef.current?.contains(e.target)) {
setOpen(false);
}
};
document.addEventListener('mousedown', handler);
return () => document.removeEventListener('mousedown', handler);
}, [open]);ドロップダウンのキーボード操作
配置ライブラリを使う
import { useFloating, flip, shift } from '@floating-ui/react';
const { refs, floatingStyles } = useFloating({
middleware: [flip(), shift()],
});アクセシビリティ: ツールチップのARIA
<button aria-describedby="tip1">Hover me</button>
{visible && createPortal(
<div id="tip1" role="tooltip">Helpful text</div>,
document.body
)}確認問題
復習
コース完了
よくある質問
「Portalsでツールチップとドロップダウンメニューを作る」レッスンは無料ですか?
はい。「Portalsでツールチップとドロップダウンメニューを作る」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。
「Portalsでツールチップとドロップダウンメニューを作る」で何を学びますか?
Portalsを使って、overflow-hiddenコンテナの外側にツールチップやドロップダウンをレンダリングします ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
React Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「Portalsでツールチップとドロップダウンメニューを作る」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このReact Academyレッスンでコードを書いて実行できますか?
はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- React Portalsとは?
- Portalsでモーダルコンポーネントを構築する
- モーダルのフォーカスとキーボードトラップを扱う
- Portalsでツールチップとドロップダウンメニューを作る