UIXHERO

Hover Card(ホバーカード)

リンクやアバターにホバーした時にユーザー情報・記事プレビュー・リポジトリ情報などをリッチなカード形式で表示するUIコンポーネント。TooltipとPopoverとの使い分け・ホバー遅延・キーボードアクセシビリティの設計を解説する。

2026年3月3日
更新: 2026年9月3日
20
by Dengen Yosho(DGYS)

ユーザーのアバターやリンクにホバーした時に、ユーザープロフィール・記事プレビュー・リポジトリ情報などをリッチなカード形式で表示するコンポーネント。Twitterのユーザー名ホバー・GitHubのリポジトリリンクホバーが典型例。Tooltipより情報量が多く、Popoverよりも受動的(クリック不要で表示)なのが特徴。

この記事を読むと、Tooltip・Popoverとの明確な使い分け・ホバー遅延(300〜500ms)の設計・キーボードユーザーへのフォールバック設計・フォーカス時にも表示する実装が自分でできるようになります。


1. UI例(Preview / Live)

実装で見る(GunjoUI)

この部品を、デザインシステム GUNJO の実装で確かめられます。

2. 定義(Definition)

ユーザーのアバター・ハンドルネーム・記事リンクなどにホバーした時に、その対象に関連するリッチなプレビュー情報をカード形式で表示するUIコンポーネント。Tooltipより情報量が多く(アバター・フォロワー数・プロフィール文など)、Popoverよりも受動的(クリック不要で表示)。

Tooltip / Popover / Hover Cardの関係

表示トリガーコンテンツインタラクション
Tooltipホバー/フォーカス短いテキスト(1〜2行)不可
Hover Cardホバー/フォーカスリッチなカード(画像・複数行)可(ボタン・リンク含む)
Popoverクリック設定・フォーム可(フォームも含む)

Hover CardはTooltipとPopoverの中間——ホバーで表示されるが、Tooltipより情報量が多くインタラクティブな要素(フォローボタンなど)を含める。


3. 使い分け(When to use / When NOT to use)

3.1 When to use

  • ユーザーのアバター/ハンドル名にホバーした時のプロフィールプレビュー(SNS・チームツール)
  • 記事・コンテンツのリンクにホバーした時のプレビュー(タイトル・サムネイル・要約)
  • GitHubリポジトリリンクにホバーした時のスター数・説明のプレビュー
  • ページ遷移前にコンテンツの概要を先に見せたい場面

3.2 When NOT to use

  • 必須の情報を表示する → モバイルでホバーできず情報にアクセスできない
  • 短いテキスト(1〜2行)のみ → Tooltipで十分
  • フォーム・複雑な設定 → Popoverを使う
  • 主要なコンテンツとして機能させる → 独立したページ・Cardコンポーネントを使う

3.3 代替UI(Alternatives)

  • 短いテキストの補足 → Tooltip
  • クリックで開くインタラクティブパネル → Popover
  • コンテンツを常時表示 → Card
  • ページ全体のコンテンツ → リンク先ページ

4. 設計判断の核(Decision Principles)

Hover Cardの核は「ホバー遅延」と「カード上でのホバー維持」——遅延なしで即時表示するとUIが騒がしくなり、カード上にカーソルを移動すると閉じる実装ではカード内のボタンを押せない。

判断の優先順位:① ホバー(300〜500ms)→ ② カード上でのホバー維持 → ③ フォーカス時の表示(キーボード対応)→ ④ 閉じる遅延(200〜300ms)

  • 表示遅延(300〜500ms)を必ず設ける:カーソルがUI上を通過するたびにHover Cardが表示されると画面が騒がしくなる。setTimeout で意図的なホバーとカーソル通過を区別する
  • カード上にカーソルを移動しても閉じない:ユーザーがカード内のボタン(フォローボタンなど)をクリックしようとカーソルを移動すると、カードが閉じてしまう設計は典型的な失敗。onMouseEnter カードでタイマーをクリアする
  • 閉じる遅延(200〜300ms)を設ける:トリガーからカーソルが外れた瞬間に即座に閉じると、カード上にカーソルを移動する前に閉じてしまう。閉じる遅延でカードへの移動を可能にする
  • フォーカス時にも表示する:ホバーのみで表示するとキーボードユーザーがHover Cardの情報にアクセスできない。onFocus でも表示して、onBlur で非表示にする

5. 状態設計(States)

5.1 必須状態(Required)

  • Hidden(非表示):デフォルト状態
  • Visible(表示中):ホバー/フォーカス後の表示遅延が経過した後

5.2 条件付き状態(Conditional)

  • Loading:カードのコンテンツをサーバーから取得中(スケルトン表示)
  • Error:コンテンツ取得失敗
状態必須何を伝えるか
Hidden通常状態(Hover Cardは非表示)
Visibleリッチなプレビュー情報
Loadingコンテンツ取得中

6. バリエーション設計(Variants)

コンテンツの種類によって使い分ける。

バリアントコンテンツ使用例
ユーザープロフィールアバター・名前・bio・フォロワー数SNS・チームツール
記事プレビュータイトル・サムネイル・要約・読了時間ブログ・ドキュメント
リポジトリ情報スター数・説明・言語・最終更新GitHub風ツール
商品プレビュー画像・価格・評価ECサイト

禁止パターン:Hover Cardにスクロールが必要なほど大量のコンテンツを詰め込む → 読み切れないうちにカーソルが外れてカードが閉じる。Hover Cardは「概要を一瞬で把握する」ためのもので、詳細はリンク先ページで見せる。


7. パターン集(Good / Bad / How to fix)

7.0 よく崩れる設計パターン(3つ)

  • 即時表示(遅延なし)onMouseEnter で即座にカードを表示し、リスト上をスクロールするたびに次々とHover Cardが表示されてUIが煩雑になる
  • カード上に移動すると閉じる:トリガーの onMouseLeave で即座に閉じる実装になっており、ユーザーがカード内の「フォロー」ボタンをクリックしようとするとカードが閉じてしまう
  • フォーカス対応なし:ホバーのみで表示し、キーボードユーザーがTabキーでリンクにフォーカスしてもHover Cardが表示されず、プレビュー情報にアクセスできない

7.1 Bad(典型3つ)

  • onMouseEnter={() => setVisible(true)} で遅延なし即時表示。長いリストをスクロールするたびにHover Cardが乱立する
  • トリガーの onMouseLeavesetVisible(false) が即時実行され、カード上にカーソルを移動する前に閉じてしまう
  • onFocus の実装がなく、キーボードでリンクにフォーカスしてもHover Cardが表示されない

7.2 Good(対になる3つ)

  • onMouseEntersetTimeout(400ms) の表示タイマーを設定し、onMouseLeave でタイマーをクリアする。意図的なホバーのみカードを表示する
  • onMouseLeavesetTimeout(300ms) の閉じるタイマーを設定し、カード自体の onMouseEnter でそのタイマーをクリアする。カード上にカーソルを移動してもカードが閉じない
  • onFocus={() => setVisible(true)}onBlur={() => setVisible(false)} を追加してキーボードフォーカス時にも表示する

7.3 How to fix(手順)

  1. showTimer / hideTimer の2つの useRef を用意し、表示・非表示を独立したタイマーで管理する
  2. トリガーの onMouseEnter で表示タイマー(400ms)を設定し、onMouseLeave で非表示タイマー(300ms)を設定する
  3. カード自体の onMouseEnter で非表示タイマーをクリアし、onMouseLeave で再度非表示タイマーを設定する
  4. トリガーに onFocus / onBlur を追加してキーボード対応を実装する

8. ルール(Must / Better)

Must(守らないと壊れる)

Better(品質が跳ねる)


9. アクセシビリティ要件(必須)

Keyboard

  • Tab でトリガー要素にフォーカスした時にHover Cardを表示する
  • Tab でカード内のインタラクティブ要素(ボタン・リンク)にフォーカスを移す
  • Escape でHover Cardを閉じる
  • フォーカスがトリガー要素から外れたらHover Cardを閉じる

Focus

  • キーボードフォーカス時(onFocus)にHover Cardを表示する
  • カード内にフォーカス可能な要素がある場合、Tabキーでフォーカスを移せる

Screen Reader

<!-- トリガー -->
<a
  href="/users/hikaru"
  aria-describedby="hovercard-hikaru"
>
  @hikaru
</a>

<!-- Hover Card -->
<div
  id="hovercard-hikaru"
  role="tooltip"
>
  Hikaru Tanaka・プロダクトデザイナー・891フォロワー
</div>

Hover Cardがインタラクティブな要素(ボタン・リンク)を含む場合は role="tooltip" でなく role="dialog" を検討する。ただしダイアログにするとフォーカス管理が複雑になるため、Popoverへの昇格を検討する。

Touch / Pointer

  • タッチデバイスではホバーが機能しないため、Hover Cardのコンテンツはタップ先のリンクページで表示する
  • どうしてもモバイルでHover Cardを表示したい場合は、長押し(500ms)で表示し閉じるボタンを設ける

Contrast / Readability

  • Hover Card内のテキストとのコントラストは4.5:1以上
  • カードの影(box-shadow)は背景に十分なをもたせてカードの境界を分かりやすくする

10. 実装メモ(Implementation Notes)

  • shadcn/ui の HoverCard@radix-ui/react-hover-card ベースで、表示遅延(openDelay)・閉じる遅延(closeDelay)・カード上でのホバー維持・フォーカス対応・Floating UIの位置計算がすべて実装済み。新規実装より HoverCard を使うのが最速
  • openDelay / closeDelay のデフォルト値は @radix-ui/react-hover-card では 700ms / 300ms。ユーザーの体感に合わせて openDelay={400} / closeDelay={200} 程度が自然
  • コンテンツをAPIから取得する場合、Hover Cardが開いた時にfetchを開始する(onOpenChange コールバック)。スケルトンUIを先に表示してデータが届いたら差し替えるとが向上する
  • カード内の「フォローボタン」など認証が必要なアクションは、未ログイン時に「ログインして続ける」へのリンクに切り替えるなど、状態に応じたコンテンツ出し分けを実装する

11. 関連リンク


12. まとめ

Hover Cardの設計で最重要なのは「ホバー遅延」と「カード上でのホバー維持」の2点です。迷ったら 4. 設計判断の核 に戻り、300〜500msの表示遅延・カード上でのタイマーキャンセル・フォーカス時の表示の3点を確認してください。shadcn/ui の HoverCard を使えば openDelay / closeDelay の設定だけでこれらは解決されます。Tooltip・Popover・Hover Cardの選択基準は「ホバーで開く・テキストのみ」→ Tooltip、「ホバーで開く・リッチなカード」→ Hover Card、「クリックで開く・インタラクティブ」→ Popoverというシンプルな分類で覚えてください。

更新のお知らせ

サイトに載せていない実例や、新しい記事のお知らせはこちらで出しています。

読んだ内容を、自分の画面に当てるとき

UIXHEROは、記事を書くほかに、画面の検品・判定、デザインシステムの構築、実装と改善の伴走を受けています。何を頼めばいいか決まっていない段階の相談も、同じ窓口で受けます。

UIXHEROに頼めることを見る

※ 記事の内容についての質問や、書いてほしいテーマの要望も同じ窓口で受けています

記事をシェア

メールでお知らせを受け取る

最終更新: 2026年9月3日

この記事を書いた人

Dengen Yosho(DGYS)

Dengen Yosho(DGYS)

UI/UXデザイナー兼デザインエンジニア デザイン歴25年以上 情報設計〜UIデザイン〜React/TypeScriptによる実装までを一気通貫で担当 大手企業のDXプロジェクトや決済アプリ領域で、デザインリードとして改善と構築を経験 現在はフリーランスとして、プロダクトのUI/UX改善とデザインシステム構築を支援 長年の実務の中で感じてきたのは、 「良いUI」はセンスではなく、再現可能な判断の積み重ねであるということ UIXHEROは、 心理学や行動科学の知見を、現場で使える設計言語に翻訳するための場所 関心領域は「ユーザーの行動が変わるUI」 人の認知・注意・意思決定の構造を理解し、 “なぜそのUIが機能するのか”を言語化することを目指している

あわせて読みたい

この記事に関連する記事をご紹介します

Bar Chart(棒グラフ)

カテゴリごとの量を棒の長さで比べるチャート。ゼロ基線の扱い、並び順、縦横の選び方、しきい値の見せ方という設計判断と、色だけに頼らないアクセシビリティ要件を解説する。

2026年8月27日
18

Donut Chart(ドーナツチャート)

中央をくり抜いた円で構成比を示すチャート。中央に置く値の選び方、円グラフとの使い分け、リングの太さ、凡例の作りという設計判断と、色だけに頼らないアクセシビリティ要件を解説する。

2026年8月27日
17

Gauge Chart(ゲージチャート)

1つの値を範囲の中に置いて示す半円のチャート。範囲の両端に意味があるかという条件、しきい値の帯の設計、色だけで良否を伝えない書き方という設計判断とアクセシビリティ要件を解説する。

2026年8月27日
16

もっと深く知りたいですか?

ここに掲載されていないトピックについても、リクエストがあれば解説記事を追加します。 わかりにくい点や、具体的な事例について知りたいことがあれば教えてください。

リクエストを送る