モーション
このキットは意図的にほとんど動きません: ハイパーメディアアプリの モーションは状態変化の説明のためにあり、装飾のためではありません。 動くものはひとつの小さなスケールを参照するので、オーバーレイも コントロールもひとつのシステムとして感じられます。
デュレーションとイージングはセマンティックトークンです
(--hc-motion-* カスタムプロパティとして発行されます):
| トークン | 値 | 用途 |
|---|---|---|
--hc-motion-duration-fast | 120ms | ホバー / 押下のフィードバック、小さな状態反転(レーティングの星)。 |
--hc-motion-duration-base | 200ms | オーバーレイの出入り(ダイアログ、ドロワー、トースト)、パネルの表出、プログレスバーの更新。 |
--hc-motion-duration-slow | 320ms | 長い距離を動く大きなサーフェス(全高シート)。ほぼ不要。 |
--hc-motion-easing-standard | ease | 画面に留まるプロパティ変化(色、その場の translate)。 |
--hc-motion-easing-enter | cubic-bezier(0, 0, 0.2, 1) | 入ってくる要素 — 速く始まり、静かに着地(減速)。 |
--hc-motion-easing-exit | cubic-bezier(0.4, 0, 1, 1) | 出ていく要素 — 加速して去る(目は退出を追いません)。 |
ローダーはこのスケールに乗りません: スピナー、スケルトンの シマー、不確定プログレスは独自の長い周期を保ちます — それらは 「まだ動作中」を伝えるもので、状態変化ではないからです。
何がこのスケールを使うか
Section titled “何がこのスケールを使うか”- ダイアログはフェード + 着地で出入りします
(
--hc-dialog-duration、enter/exit イージング、@starting-style+transition-behavior: allow-discrete)。 - ドロワーは
--hc-drawer-duration+ standard イージングで スライドします。 - トーストのスナップバック / フライアウトは
--hc-toast-durationを使います。 - レーティングとプログレスの遷移は fast / base を参照します。
コンポーネントのデュレーションは個別に上書き可能なままです
(--hc-dialog-duration: 150ms;)— 既定はスケールです。
- 注意を引くためではなく、状態変化を動かす。 入る・出る・移動 する要素は動かしてよい。クリックを誘うための点滅やバウンドは させない。
- 1 パターンにつき 1 プロパティセット。 オーバーレイは フェード / 着地、パネルはスライド、フィードバックは色。1 要素に 3 つの効果を重ねない。
- 退出は入場より速く感じさせる。 exit イージングを使う — ユーザーはもう去ると決めています。見せ続けない。
prefers-reduced-motionを尊重する。 キットの遷移はすべて この設定下で0msになります。アプリ側のモーションも同様に:
@media (prefers-reduced-motion: reduce) { .my-panel { transition-duration: 0ms; }}- 機能をモーションに依存させない。 htmx のスワップは遷移が 再生されてもされなくても着地しなければなりません — キットの遷移は すべて表示専用であり、アプリの遷移もそうあるべきです。
アプリ CSS でスケールを使う
Section titled “アプリ CSS でスケールを使う”.my-panel { transition: opacity var(--hc-motion-duration-base) var(--hc-motion-easing-enter);}スケールの上書きは、すべての利用箇所を一度にリタイミングします:
:root { --hc-motion-duration-base: 160ms; /* きびきびしたアプリに */}