コンテンツにスキップ

ツールチップ

hc-tooltip は、popover 要素をトリガーを説明する小さなラベルとして スタイルします。トリガーは aria-describedby でツールチップを参照する ため、トリガーがフォーカスを受けるとスクリーンリーダーが説明を読み上げ ます。installTooltip() がホバー、フォーカス、Escape での視覚的な 表示 / 非表示を処理します。

別名: ヒント、吹き出し。

プリミティブ必要バージョン
HTML popoverChrome 114、Edge 114、Firefox 125、Safari 17
CSS Anchor PositioningChrome 125、Edge 125、Firefox 147、Safari 26

Anchor Positioning のないブラウザは getBoundingClientRect ベースの 配置フックへフォールバックするため、ツールチップは引き続きトリガーの 上に現れます。popover がサポートされる環境ならどこでもツールチップは 機能します。

新しい popover="hint" ではなく popover="manual" を使うのは、2026 年 5 月時点で Safari に hint サポートがなかったためです。manual + JS トグルは、 popover をサポートするすべてのブラウザで hint のセマンティクス — 別々のツールチップが互いを解散させず共存する — に一致します。

Save document (Ctrl+S)
Move to trash
import { installTooltip } from '@hypermedia-components/core';
installTooltip();

installTooltip() は冪等で、アンインストーラを返します。ゼロ設定の @hypermedia-components/core/behaviors エントリが自動インストールし、 htmx でスワップされた内容も自動で拾います。

  • 作者が付けていなければ、ツールチップ要素に属性を自動付与します: popover="manual"(表示 / 非表示の完全な JS 制御)と role="tooltip"(スクリーンリーダーのセマンティクス)。
  • aria-describedby でツールチップを参照するすべてのトリガーを配線 します — 1 つのツールチップが複数のトリガーに仕えられます。
  • 対応する anchor-name(アクティブなトリガー)と position-anchor(ツールチップ)を注入し、CSS Anchor Positioning で ツールチップがトリガーの上に着地します。別の共有トリガーがホバー / フォーカスされたらアンカーを結び直します。
  • 表示 / 非表示のタイミング:
    • mouseenter300 ms の遅延後に表示(業界標準の「ホバーの 意図」しきい値)。
    • mouseleave100 ms の猶予後に非表示(遅延中なら保留中の 表示をキャンセル)。
    • focus即座に表示(キーボードユーザーには遅延なし — APG のガイダンス)。
    • blur → 即座に非表示。
    • フォーカス中の Escape → フォーカスを動かさずに非表示。

ツールチップはデフォルトでトリガーのに置かれます。インスタンス 単位で data-side(top / right / bottom / left)と任意の data-align(start / center / end、デフォルト center)で 上書きします。小さなポインタには data-arrow を足します。

<button aria-describedby="hint">Help</button>
<div class="hc-tooltip" id="hint" data-side="right" data-arrow>
Appears to the right
</div>

配置は、サポートされる環境では CSS Anchor Positioning (position-area)を、そうでなければデフォルト配置と同じ JS フォールバックを使います — data-side / data-align が両パスを 同一に駆動します。共有の機構 — 両パス、矢印、--hc-anchored-* の オフセット / 矢印ノブ — は 基礎 → アンカー配置に ドキュメントがあります。この機構は 2026 年に Baseline へ到達し、古い エンジンには JS フォールバックがあります。

title 属性ではなく本物の説明を

Section titled “title 属性ではなく本物の説明を”

title 属性から描画されるブラウザのネイティブツールチップは スタイルできず、プラットフォーム間で挙動が一貫せず、タッチデバイス では現れません。hc-tooltip + aria-describedby パターンを選んで ください。どうしても title を残すなら、ビヘイビアは衝突しません — しかしブラウザがあなたのツールチップの上に自身のツールチップを 描画するので、取り除いてください。

  • ツールチップは常にトリガーから aria-describedby="<tooltip-id>" で参照してください。視覚的な ツールチップが描画されているかにかかわらず、トリガーがフォーカスを 得るとスクリーンリーダーがツールチップのテキストを読み上げます。
  • ツールチップは短いテキストラベル専用です。インタラクティブな コンテンツ(ボタン、フォームフィールド)が必要なら、代わりに ポップオーバーダイアログを使って ください。ツールチップの面は pointer-events: none なので クリックをインターセプトできません。
  • トリガーがフォーカスを保つ間、ツールチップは到達可能であり続け なければなりません — タイマーで隠さないでください。ビヘイビアは フォーカス保持中に自動解散しません。閉じるのは Escapeblurmouseleave だけです。
  • タッチデバイスにはホバーイベントがありません。ビヘイビアは 長押し → 表示をポリフィルしません。トリガーのアクセシブルな名前が 本質的な意味を運び、ツールチップはそれを補強する、という前提で 設計してください。

component トークン(component.tokens.json):

トークンパス用途
tooltip.bg / fg面とテキストの色。慣例に従いデフォルトはライト上のダーク。
tooltip.radius角丸。
tooltip.padding-x / padding-y内側のパディング。
tooltip.font-sizeテキストサイズ。
tooltip.max-width折り返しまでの上限。
tooltip.offsetトリガーとツールチップの距離。
生成される CSS 変数を表示
--hc-tooltip-bg | -fg | -radius
--hc-tooltip-padding-x | -padding-y | -font-size
--hc-tooltip-max-width | -offset
  • ポップオーバー — より豊かな一時コンテンツのための素のポップオーバー面。
  • メニュー — popover + アンカー配置の構造を共有するアクションメニュー。
  • ダイアログ — モーダルな代替。

レシピでの利用: データグリッドの一括操作エラー