ツールチップには遅延が必要で、その後にスキップする必要がある

2026/08/26 1:35

ツールチップには遅延が必要で、その後にスキップする必要がある

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

本記事は、「warm page」というUX パターンを紹介し、一般的なツールチップのタイミング問題に対する洗練された解決策として提案している。以前、開発者たちはゼロ遅延のツールチップは瞬間的ではあるが高速な移動時にカクつきを引き起こす一方、固定遅延は操作を重く感じさせるというジレンマに直面していた。この新しいアプローチは、実際のユーザーの動き速度に基づいて表示・非表示の遅延を動的に調整することで、レスポンシブネスと滑らかなパフォーマンスのバランスをとる。React の

useRef
を共有ステートのために利用し、高コストな画面更新をトリガーすることなくデータを管理することで、ロゴなど隣接する要素間でカーソルが素早く移動した際に意図しないトリガーを防いでいる。提供された動画では、この改善を示すために、もろい元の挙動と磨かれた結果を対比させている。AI ツールはこのような機能のための機能性のコードを生成することはできるが、これらの微妙なインタラクションの詳細を質のために洗練するには人間の洞察が必要不可欠である。また、チームは特定の監査スキルを使用してプロジェクト内で類似の問題を発見することもできるし、完全に JavaScript を使用しない場合は
transition-delay
を使用する純粋な CSS バージョンを実装することも望ましい。著者は明確に述べているが、ここで示された観点は Coinbase のそれとは異なるものである。

本文

ブラウザにおける重要なマイクロインタラクション:ツールチップの「ウォームアップ」パターン解説

問題的背景と課題

製品開発において、質問一覧ページの企業ロゴにホバーすると企業名を表示するツールチップを実装していますが、以下の現象に悩まされていました。

  • 問題点: カーソルを移動させるだけで、軌跡上にある要素に瞬間的にツールチップが表示されてしまう。
  • 原因: ツールチップの表示遅延(Delay)を
    0ms
    に設定していたためである。
  • 試行錯誤: 解決のために
    200ms
    の遅延を追加したが、これが新たな UX 問題を招いた。
    • 同じ質問に複数の企業が表示される場合、ロゴ間を移動すると毎回遅延が発生する。
    • これにより操作が重く感じられ、ユーザーエクスペリエンス(UX)が低下した。

解決策:2 つのタイムゾーンと状態管理

本稿では、ブラウザのツールバーなどに見られる微小だが重要なインタラクションパターンを解説します。以下の 3 つのステップで問題が解決されます。

  1. 開示遅延: ユーザーがロゴにホバーすると、ツールチップは開くまで 200ms 待機する。
  2. ウォームウィンドウ(Warm Window): ツールチップが閉じると、300ms の「ウォーム」状態が始まる。この間に次のホバーがあった場合、待機なしで即座に表示する。
    • このタイマーが終了すると、ページは再び「コールド」状態に戻る。
    • ステップがないと、最初のツールチップによる遅延設定が永続的に無効化される。

フローの概要

状態遷移アクション結果ページの状態
ホバー
onMouseEnter
が発火
200ms 待機 → ツールチップ開く**「ウォーム」**へ移行
移動(コールド時)クールダウン中に別のロゴへ移動即座にツールチップが開く「ウォーム」状態維持
移動(コールド後)クールダウン終了して再度ホバー200ms 待機 → ツールチップ開く**「コールド」**に戻る
[ホバー] 
   ↓ 200ms 待機
[ツールチップが開く] (ページは「ウォーム」状態へ)
   ↓ カーソルを離す
[ツールチップが閉じる] 
   ↓ 300ms のクールダウン期間に入る
   ├─ クールダウン中に別のホバー → 即座に開く(ウォーム維持)
   └─ クールダウン終了 → ページは「コールド」に戻り、200ms 待機再開

コードの実装方法(React による実例)

当サイトでは RadixMotion を使用してツールチップを構築していますが、以下のシンプルな React バージョンでこのパターンをデモします。

ステップ 1: ロゴにホバーした場合 (
onMouseEnter
)

ロゴ上でイベントが発火すると、以下の関数が呼び出されます。コンポーネントはまず「ページはウォームか?」と確認し、ウォームなら即座に表示します。そうでなければタイマーを起動します。

function handleEnter() {
  // `tooltips` は useContext 変数で、コンポーネント間で `isWarm` 状態を共有しています。
  if (tooltips.isWarm) {
    show();
    return;
  }
  
  // `openTimer` は useRef で保持されており、`.current` で値を設定・アクセスします。
  openTimer.current = setTimeout(show, tooltips.openDelay);
}

ステップ 2: ツールチップが開く場合 (
show
関数)

ツールチップの開閉を処理する

show
関数は以下の処理を行います。

  1. tooltips.isWarm
    の値を状態変数
    instant
    にコピーします(CSS アニメーションスキップ用)。
  2. ツールチップを開きます (
    setOpen(true)
    ).
  3. プロバイダーに「ツールチップが開いている」と通知し、ページを「ウォーム」状態とマークします。
function show() {
  setInstant(tooltips.isWarm);
  setOpen(true);
  tooltips.markOpened();
}

CSS との連携

instant
フラグ(データ属性)を付与することで、ページがウォーム状態の場合はアニメーションなしで即座に表示します。

/* アニメーションをスキップするスタイル */
.tooltip[data-instant="true"] {
  transition-duration: 0ms;
}

ステップ 3: ロゴから離れる場合 (
onMouseLeave
)

ロゴ上でイベントが発火した際、以下の処理を行います。

  1. 起動されたタイマーを停止 (
    clearTimeout
    )。
  2. ツールチップが開いていない場合は即座に返却(閉じる也不需要)。
  3. ツールチップが開いている場合のみ、閉じてプロバイダーに通知し、クールダウンタイマーを開始する。
function handleLeave() {
  clearTimeout(openTimer.current);
  
  // もしツールチップが開いていないなら、何もしない
  if (!open) return; 
  
  setOpen(false);
  setInstant(false);
  
  // クールダウン期間を開始(プロバイダー側で行う)
  tooltips.markClosed(); 
}

注意点: カーソルがロゴを横切る時間が遅延時間(200ms)より短い場合、タイマーは破棄されツールチップは表示されません。この挙動により、誤って開いてしまうのを防ぎます。

ステップ 4: プロバイダーの共有状態 (
TooltipProvider
)

全体のパターンを機能させるための共有状態(Ref を使用)です。ページは「ウォーム」か「コールド」かのいずれかを保持します。

const warm = useRef(false);
const cooldownTimer = useRef(null);

// クールダウンタイマーのクリーンアップ処理
useEffect(() => () => clearTimeout(cooldownTimer.current), []);

const tooltips = useMemo(
  () => ({
    openDelay, // 開示遅延 (例: 200ms)
    
    // ページがウォームかどうかを判定する(React の状態ではない Ref)
    isWarm: () => skipWhenWarm && warm.current,
    
    // ツールチップが開かれた通知
    markOpened() {
      warm.current = true;
      clearTimeout(cooldownTimer.current); // 進行中のクールダウンを破棄
    },
    
    // ツールチップが閉じられた通知
    markClosed() {
      clearTimeout(cooldownTimer.current);
      cooldownTimer.current = setTimeout(() => {
        warm.current = false;
      }, warmFor); // クールダウン期間(例: 300ms)
    },
  }),
  [openDelay, warmFor, skipWhenWarm]
);

重要ポイント:

  • isWarm
    は React の状態ではなく Ref です。これにより、ツールチップの再レンダリングを防ぎ、パフォーマンスを維持できます。
  • markOpened
    ではクールダウンタイマーを破棄することで、連続した移動(ウォーム状態)を実現しています。

タイマーの数値設定について

最適な数値は以下のバランスから決定されます。

数値理由
開示遅延: 200ms150ms 未満だと誤発火を防げず、250ms 超えると操作が不自然になるため。バランスが良い。
ウォームウィンドウ: 300ms次のトリガーへの移動をカバーしつつ、数秒後のホバーにも待機させるための長さ。
閉じる遅延: 0msカードルから離れる行為は明確であり、待つ必要がないため。

判断力と感性の重要性

AI にツールチップの作成を依頼しても、機能面は完備します。しかし、以下の点を理解してください。

  • 品質の違い: 作動する製品と洗練された製品の差は、細部の挙動(アニメーションやタイミング)に現れます。
  • 人間の役割: AI から適切なガイドが必要であり、最終的なリリース判断は人間が行う責任があります。
  • スキルの活用: 色、アクセシビリティ、タイポグラフィなど、他のエンジニアのスキルを取り入れることで、ご自身の判断力を発展させることができます。

「堅実な出力」は生成できますが、「本番環境で利用可能か」という品質感は、経験や感性によって決定されます。

紹介する Claude スキル

直面した問題を解決するための Claude スキル を提供します。以下のコードをコピーして、ご自身のコードベースの監査にご利用ください。


名前: tooltip
説明: 意図しないカーソルの移動でツールチップが開かれるのを防ぐため、遅延とウォーム状態のロジックを実装する。

スキル詳細:ツールチップのタイミング

クリックは常に意図的行為ですが、ホバーはそうではありません。
カーソルは画面を移動しながら必要な場所へ行き、その過程で要素の上を通過するため、
ホバー単独ではユーザーがツールチップを開きたいかどうかを判断できません。
この 200ms が、その判断基準となります。

```css
.tooltip {
  transition-delay: 200ms;
}

**本記事の表現は著者の見解であり、Coinbase の立場を反映するものではありません。**

同じ日のほかのニュース

一覧に戻る →

2026/08/26 6:39

Python の事前宣言定数は少し奇妙です

## Japanese Translation: Python は 6 つのプリデークレードされた項目を持っています:`True`, `False`, `None`, `__debug__`, `Ellipsis`(`...`), および `NotImplemented`。これらはしばしば「定数」と呼ばれますが、その挙動は大きく異なります。 このうち 4 つ(`True`, `False`, `None`, `__debug__`)は通常の識別子ではなく特別な構文的トークンです。そのため: • `x.True` などの式は `SyntaxError` を発生させます。 • 他の文脈では構文上問題がないにもかかわらず、これらに直接代入または削除を行うことは `SyntaxError` を引き起こします(例:`__debug__ = 67` または `del __debug__`)。 • オブジェクト上の属性経由でのアクセス(例:`obj.__debug__`)は無効ではありませんが、`builtins` 内のエントリを変更する(`getattr`/`setattr` を通じて)ことは、構文的トークンの挙動には影響しません。 対照的に、`Ellipsis` と `NotImplemented` は通常のビルトイン関数に近い動作を示します: • 代入によってグローバルにシャドウ化されることが可能です(例:`NotImplemented = 67`)。 • `builtins` 内の値を変更してもモジュールレベルでの名前には影響しますが、構文的トークン(`...` または `NotImplemented` という識別子)そのものには変更はありません。 さらに、`__debug__` は通常 `True` ですが、Python を `-O` フラグで実行すると `False` になります。これら 6 つの項目を区別する exact な設計理由、特になぜ 4 つだけが構文的トークンとして特別扱いされ、残りの 2 つは通常のビルトインとして扱われるのかは、現在も不明です。

2026/08/25 22:01

Apple、M6 と M5 Ultra を発表する

## Japanese Translation: 8 月 25 日(2026 年)、カリフォルニア州クアパティーノでアップルは、地域のアートフィシャルインテリジェンスを変革することを目的とした革命的なシリコンチップを発表しました。頭部のイノベーションは、Mac mini 向けの新しい **M6 チップ**であり、画期的な **2 ナノメートル製造プロセス**を特徴としています。このチップは、12 コア CPU(2 つのスーパークコア、4 つのパフォーマンスコア、および 6 つのエフィシェンシーコアから構成)、ニューラルアクセラレータを備えた 12 コア GPU、そして最大 32GB の統一メモリを高速で最大 170GB/s の速度でサポートします。 新しい Mac Studio とペア付けられているのは、アップルの最初のクワッドダイアーキテクチャであり、高度なウルトラフュージョン技術を利用した **M5 Ultra**です。これは、最大 36 コアの CPU コアと最大 80 コアの GPU コアで構成され、1.2TB/s の帯域幅で驚くべき 512GB の統一メモリをサポートする大規模なスケーラビリティを提供します。M5 Ultra は、AI における M3 Ultra に比べて最大 4.5 倍のパーク GPU コンピューティングを提供するため、大きなパフォーマンスの向上が期待されます。両方のチップは、高解像度のビデオ編集や複雑なエージェントワークフローを可能にする先進的なグラフィック機能を備えており、第 3 世代レイトレーシングとハードウェア加速メッシュシェーディングが含まれています。 これらのアップグレードにより、「Apple Intelligence」(2026 年秋の macOS 27 で、Apple Beta Software プログラムを通じて利用可能)がユーザーデバイスの上で完全に動作し、数百億パラメータを持つ最先端 AI モデルをクラウドサーバーに依存せずにホストできるようになります。新しい開発者フレームワークにより、Xcode や Core ML のようなツールを使用して大規模言語モデルのローカルでの微調整が可能となり、英語、中国語、日本語、韓国語を含む複数の言語で利用できる強力なプライバシー重視のオンデバイス AI 計算への決定的なシフトを示しています。

2026/08/25 23:06

OpenAI Jalapeño:Nvidia Blackwell より優れている

## Japanese Translation: OpenAI は、Broadcom との協力による約 16 ヶ月の開発(2024 年中盤から開始)を経て、「Jalapeño」という推論専用の ASIC を発表しました。LLM の推論のためにゼロから設計された Jalapeño は、過剰な特殊化ではなく極限までのハードウェア・ソフトウェアのコデザインと一般化に依存しており、推定的デコードや特定のワークロード調整を必要とせず、あらゆるモデル推論シナリオで高い性能を実現しています。 InferenceX スイートを用いた独立したベンチマーク(Hot Chips で実施)により、Jalapeño はトークン毎ワットあたりで Nvidia、AMD、Google のチップを上回ることが確認されました。TSMC の N3P プロセスで作製され、HBM4 メモリを備えるこのチップは、GPU に見られる固定されたレイテンシを排除するために順序変換コアと L1 キャッシュを採用し、MXFP 数値形式およびウェイト定数型シンタリック配列を用いて性能の急激な低下を防いでいます。OpenAI の独自プログラミング言語「Gluon」は、高効率を実現するために直接永続スレッドにマッピングされたハンドチューニング済みカーネルを可能にしています。 システムアーキテクチャは、CPU ホストラック(「Katsu」、AMD EPYC プロセッサ搭載)と ASIC ラック(「Vindaloo」、トレイあたり 16 チップ)から構成されます。この設計により、ハイブリッド銅線/光ネットワークを活用して最大 2,048 ユニットまで柔軟にグローバルなスケールアップが可能です。2025 年 11 月にタプトアウト(A0 ステッピング)され、初版はすぐにデプロイが可能で、タプトアウト直後にスループットの大幅な向上が実現されています。現在ファブ内にある将来の B0 ステッピングでは、効率性が約 25% 向上しており、Nvidia の Rubin チップに比べて優れた消費電力性能を提供します。生産は 2027 年に段階的に増産され、多くの出力は翌年の後半に期待されており、OpenAI パートナーが信頼性データを収集する期間としては 1 月までとされています。