動きの設計
その動きが何を説明しているのかを言えないなら、動かしません。動きの役目は3つしかありません。
図の中身を文字で読む
- 動きは装飾ではなく説明。何を説明しているかを言えないなら、動かさない。
- 1. どこへ行ったかを繋ぐ
- 一覧の1件 詳細の見出し
- 同じ要素が育ったと分かれば、画面が切り替わったと感じない
- 2. 原因と結果を結ぶ
- 保存する 保存しました
- 押した位置から出てくれば、 その操作の結果だと分かる
- 無関係な場所に唐突に出すと、読み手は原因を探す
- 3. 見るべき場所を指す
- 動いているものは1つだけ。
- 2つ以上が同時に動くと、どちらも見られない
- スタッガー=開始時刻を少しずつずらす
- 同時(1枚の面に見える) 40〜60msずつ遅らせる(順序が読める)
- 項目が多いほど最後の要素の待ち時間が伸びる。
- 10件を超えるなら、ずらし幅を詰めるか
- 上位の数件だけに掛ける。
- 0ms 0ms 0ms 50 100 150
- スクロール量に画面が追従する演出は、読み手から速度の制御を奪う。長い文章では特に嫌われる。
ひと目で#
その動きが何を説明しているかを言えないなら、動かさない。
- マイクロインタラクション
- 1つの操作に返す小さな反応。押した手応え、切り替わりの確認
- 状態遷移
- 前の状態と次の状態をつないで、同じものだと分からせる
- 出入りのアニメーション
- 現れる方向と消える方向で、そのものの居場所を示す
- スタッガー
- 始まる時刻をずらして、順序と件数を伝える
- コレオグラフィ
- 複数の要素の動きを組み立てて、視線の順番を作る
- パララックス
- 前景と背景を違う速さで動かして、奥行きを作る
動きが果たすのは3つだけ#
| 役割 | 具体例 |
|---|---|
| 位置をつなぐ | 一覧の項目が広がって詳細になる |
| 因果を示す | 押したボタンの位置から通知が出る |
| 注意を向ける | 見てほしい1か所だけが動く |
使い分け#
| こういうとき | やること |
|---|---|
| 押した反応を返したい | 100ms前後の小さな変化。色か影か縮小 |
| メニューを開く | 開くきっかけになった要素を起点に広がる |
| 一覧を表示する | 上のほうの数件だけスタッガー。全件にはかけない |
| 削除する | 隙間が詰まるところまで見せる |
| 読み物のページ | 動かさない。スクロールの主導権を渡す |
件数が待ち時間を決める#
1枚ごとの設計が同じでも、何枚に時差をかけるかで合計は変わります。1枚240ms・時差60msで12件に順番をつけると、最後の1枚が止まるのは900ms後です。
図の中身を文字で読む
- ✕ 一覧の全件に時差をつける ○ 先頭の数件で止める
- 12件 × 60ms。1枚の入場は 240ms 時差は最初の3件だけ
- 4件目からは時差をかけない。
- 画面の外にあるものは動かさない
- 600ms
- 最後の1枚は 360ms で止まる
- 600ms を超えると待ち時間
- 最後の1枚が止まるのは 900ms 後
- 時間 240ms・時差 60ms のとき。1枚ごとの設計が同じでも、件数が合計の待ち時間を決める。
時差をかけるのは、最初の画面に見える数件までにします。画面の外にあるものは、そもそも動かす必要がありません。
よく使う3種(フェード入場・アコーディオン開閉・トースト出現)の完成コードは よく使う動き3種 にまとめました。
間違えやすいところ#
- 動きを飾りとして足す待ち時間だけが増える
- 同時に複数を動かすどれも見られない。動くものは1つ
- 出てくるときに全要素をスタッガーさせる最後の要素を待つ時間が長くなる
- スクロール量に画面を追従させる読み手から速さの制御を奪う
- パララックスを強くかける酔いを起こす。前景と背景の速さの差は小さく
- 操作の前に動きを置く操作のあとに見せる。前に置くと待ち時間になる
- 動きだけで状態を伝える動きが止まったあとにも残る表現を添える
直す例#
架空の案件を1つ例にとります。どこを見て、何をどう直すかを書きます。
不動産サイトの物件一覧です。「もっと見る」で12件が足され、12件すべてに60msずつの時差が付いています。1枚の入場は240msなので、最後の1枚が止まるのは900ms後です。押した人は、増えた分を上から順に眺めるのではなく、いちばん下まで一気にスクロールします。動きは、その人が見ていない場所で終わります。
時差をかけるのは先頭の3枚までにします。4枚目からは遅延を付けず、同時に出します。合計は360msに縮み、「増えたのはここから」という説明は残ります。
もう1つ、動く対象を「今回足された分」に限ります。既に読んだ12件まで動き直すと、どこまで読んだかを見失います。
確認する#
- 時差をかけた最後の要素が、600ms 以内に止まる
- 動いているのが「今回変わった分」だけで、元からあった要素は静止している
- その動きが何を説明しているかを1文で言える(言えないものは消す)
使えるパターン#
このページで扱う語#
このページで扱う語を並べる本文では太字3 語
語の名前から引くなら用語索引へ。
- モーションデザイン
- 画面上の動きを設計すること。装飾ではなく、変化を理解させるための手段。
- キネティックタイポグラフィ
- 文字そのものを動かし、意味や感情を動きで表現する手法。
- スクロールテリング
- スクロールの進行に合わせて内容が展開していく、物語型の表現。
この話が要る場面#
このページが答えになる、現場の困り事です。困り事の側から探すと、同じ場所に着きます。
その動きが何を説明しているのかを一言で言えないなら、入れない。
一言で説明できなければ入れない
40〜60msずつ遅らせる。ただし上位の数件だけ。全件に掛けると最後の要素の待ち時間が伸びる。
このコードで動いている見本です
動くものは1つに絞る。2つ以上が同時に動くと、どちらも見られない。
動くものは1つ。他は opacity だけ
この場面のほかの困り事と、そのまま貼れる部品は動かすにまとめてある。逆引きには全188件。
入場を組み立てる#
この値は作業台で決められます。和文の予約ページに載せて、幅と明暗を替えて確かめてから CSS を持ち帰る: 動きの曲線と時間
カード3枚の入場を、時間・移動距離・時差の3つで設計します。再生で実物のカード列が動き、生成した CSS には動きを減らす設定への対応まで含まれます。
最後のカードが止まるまで 360ms
概要
最初に現れます
料金
二番目に続きます
事例
三番目に続きます
一覧の全件に時差をかけず、最初の画面に見える数件で止めます。
:root { --ease-out: cubic-bezier(0.16, 1, 0.3, 1); }
@keyframes card-in {
from { opacity: 0; transform: translateY(12px); }
to { opacity: 1; transform: none; }
}
.card { animation: card-in 240ms var(--ease-out) backwards; }
.card:nth-child(2) { animation-delay: 60ms; }
.card:nth-child(3) { animation-delay: 120ms; }
@media (prefers-reduced-motion: reduce) {
.card { animation: none; }
}
この道具は JavaScript で動きます。無効の場合は、下の既定値のコードをそのまま使ってください。
出典#
- Material Design 3「Motion / Transitions」
- Nielsen Norman Group「Animation for Attention and Comprehension」