ToolHub
View All Posts

CSS アニメーションガイド:トランジション、キーフレームとパフォーマンス

CSS アニメーションのために界面注入生命,提供する视觉フィードバック、引导用户注意する力かつ创造させる人難忘の体验。做て良のアニメーション感觉当然直观;做て差のアニメーションできるをもたらす卡顿、分散用户注意する力,甚至引发身体不适。このガイドではたからトランジションとキーフレームのベース知识まで高级パフォーマンス最適化とアクセシビリティ性のすべての内容,させるあなた掌握作成するストリーム畅、あり目的かつ包容のアニメーションの知识。

CSS トランジションとアニメーション

CSS 提供するた两種類作成する动效の異なる机制:トランジションとアニメーション。理解する何时使用毎種類机制は有効入行 CSS アニメーション工作のベース。

CSS トランジション

トランジションのために CSS 属性两个ステートの間の变化追加するアニメーション。あなた定義するする必要があるアニメーションの属性、アニメーション継続的に時間とイージング曲线,ブラウザ自动処理する起始值と終了する值の間の補間。トランジション由ステート变化トリガーする,如ホバーする、フォーカスする、类追加するまたは JavaScript 属性より改。

.button {
  background: #3b82f6;
  transform: scale(1);
  transition: background 0.3s ease, transform 0.2s ease;
}

.button:hover {
  background: #2563eb;
  transform: scale(1.05);
}

トランジション非常に適合する簡単の两态アニメーション。それ们必要とする最も少のコード,易于理解する,かつでブラウザ中信頼できる実行する。制限するはそれ们だけで两个值の間做アニメーション——あなたできない定義する中间步骤。

CSS アニメーション(キーフレーム)

アニメーション使用 @keyframes 规すなわち定義する任意数量步骤のスタイル变化序列。とトランジション異なる,アニメーションできる状態に依存しない变化実行する、なし限循环、反へ播放と一時停止する。それ们させるあなた精密に制御するアニメーションの毎一帧。

@keyframes pulse {
  0% {
    transform: scale(1);
    opacity: 1;
  }
  50% {
    transform: scale(1.05);
    opacity: 0.8;
  }
  100% {
    transform: scale(1);
    opacity: 1;
  }
}

.pulse-element {
  animation: pulse 2s ease-in-out infinite;
}

どちらを使用すべきか

シナリオトランジションを使用アニメーションを使用
ホバーエフェクトいいえ
フォーカス状態いいえ
表示切替かもしれない
マルチステップシーケンスいいえ
ループアニメーションいいえ
状態に依存しないいいえ
エントランスアニメーションかもしれない

キーフレーム構文詳細分析

@keyframes 规すなわちは CSS アニメーションの核心。十分に理解する其構文できる释放多步アニメーション序列のすべて力量。

パーセントベースのキーフレーム

キーフレーム使用から 0% まで 100% の百分比值定義する,表示アニメーション時間线上の入度。あなたできるに基づいて必要とする定義する任意数量のキーフレーム,ブラウザでそれ们の間入行補間:

@keyframes bounce {
  0%, 100% {
    transform: translateY(0);
  }
  25% {
    transform: translateY(-20px);
  }
  50% {
    transform: translateY(0);
  }
  75% {
    transform: translateY(-10px);
  }
}

多个キーフレームできるを通じて逗号分隔百分比值来共享同一つのスタイル块,如上面例中の 0%, 100%。これに対して戻る起始ステートのアニメーションとてもあり用。

アニメーションのショートハンドプロパティ

animation 简写属性する八个子属性组コンポジット一つの声明。顺序のために:name、duration、timing-function、delay、iteration-count、direction、fill-mode と play-state。

.element {
  animation: slideIn 0.5s ease-out 0.2s 1 forwards running;
}

/* Equivalent longhand */
.element {
  animation-name: slideIn;
  animation-duration: 0.5s;
  animation-timing-function: ease-out;
  animation-delay: 0.2s;
  animation-iteration-count: 1;
  animation-direction: normal;
  animation-fill-mode: forwards;
  animation-play-state: running;
}

アニメーションのフィルモード

animation-fill-mode 属性制御するアニメーション実行する前後適用するどのスタイル。これは最も常られる误解のアニメーション属性の一つ:

イージング関数

イージング関数(もと呼ばれる定时函数)定義するアニメーションの加速する曲线。それ们決定するアニメーションは缓遅開始するそれから加速する、高速開始するそれから减速,それとも従うより複雑のパターン。正しくのイージング関数させるアニメーション感觉当然;間違いのイージング関数させるアニメーション感觉机械または突兀。

ビルトインイージング関数

3次ベジェ曲線

cubic-bezier() 函数させるあなたを通じて精密に制御する定義するカスタマイズするイージング曲线。それ受け取る四个参数表示3次ベジェ曲線の制御する点:cubic-bezier(x1, y1, x2, y2)。x 值表示時間(0 まで 1),y 值表示入度(できる超出 0-1 実装するたことがある冲效果)。

.element {
  /* Smooth deceleration - great for entrances */
  transition: transform 0.3s cubic-bezier(0.0, 0.0, 0.2, 1.0);

  /* Smooth acceleration - great for exits */
  transition: transform 0.2s cubic-bezier(0.4, 0.0, 1, 1);

  /* Material Design standard easing */
  transition: transform 0.3s cubic-bezier(0.4, 0.0, 0.2, 1);
}

ステップ関数

steps() 函数作成する离散の逐帧アニメーション,そして非平滑補間。これに対して精灵图アニメーションまたは作成する「打字」效果とてもあり用:

@keyframes typing {
  from { width: 0; }
  to { width: 100%; }
}

.typing-effect {
  animation: typing 3s steps(40, end);
  overflow: hidden;
  white-space: nowrap;
}

パフォーマンス最適化

ストリーム畅のアニメーション必要とする达まで毎秒 60 帧 (fps),これは以下を意味します毎帧必須で 16.67 ミリ秒内完了する。未できる満たす此预算できるをもたらす可见の卡顿——画面抖动、丢帧と用户体验下降。理解するブラウザレンダリングパイプラインは编写高パフォーマンスアニメーションの閉键。

レンダリングパイプライン

時に CSS 属性变化时,ブラウザ最も多を経て三个阶段来更新する表示する:

  1. スタイル:確認するどの CSS 规すなわち適用する于どの元素。
  2. レイアウト:計算する各元素の大小と位置。由 width、height、margin、padding、top、left、font-size と其彼いくつ何属性の变化トリガーする。
  3. ペイント:のために各元素填充ピクセル。由 color、background、box-shadow、border-radius と其彼视觉属性の变化トリガーする。
  4. コンポジット:按正しく顺序コンポジット已ペイントの层。だけがこれ一步で GPU 上実行する。由 transform と opacity の变化トリガーする。

だけトリガーするコンポジット步骤のアニメーションのパフォーマンス最良,なぜならそれ们完全スキップするたレイアウトとペイント。これすぐにはなぜ transform と opacity は高パフォーマンス CSS アニメーションの黄色金標準。

コンポジター専用プロパティ

属性レイアウトをトリガー?ペイントをトリガー?GPUコンポジット?
transformいいえいいえ
opacityいいえいいえ
filterいいえ時々
top / leftいいえ
width / heightいいえ
margin / paddingいいえ
background-colorいいえいいえ
box-shadowいいえいいえ

使用 will-change

will-change 属性告诉ブラウザどの属性预期できる变化,許可するそれを通じてする元素向上させるまで自己のコンポジター层来提前最適化する。しかし,それすべき谨慎使用:

/* Apply will-change just before the animation */
.element:hover {
  will-change: transform;
}

/* Remove it after the animation completes */
.element {
  transition: transform 0.3s ease;
}

will-change の常见間違いを含むする其適用する于あまりにも多元素(各コンポジター层消耗 GPU メモリ)と永久予約それ(浪费资源)。良の做法はでアニメーション開始する前を通じて JavaScript 追加する will-change,でアニメーション終了する後削除するそれ。

使用 Transform の代わりに代レイアウト属性

最も効果的のパフォーマンス最適化は用 transform の代わりに代レイアウトをトリガーの属性:

パフォーマンス规すなわち:もしあなたできる用 transform または opacity 実装する同じの视觉效果,常に优先使用それ们,そしていいえレイアウトをトリガーまたはペイントの属性。これ一原すなわちできる消除大多数のアニメーションのパフォーマンス问题。

常见アニメーションパターン

某些アニメーションパターンで Web 界面中繰り返し出现。掌握これらのパターンのためにあなた提供するた大多数の常见 UI アニメーション需求のツール包。

1. フェードイン

最もシンプルかつ最も通用のエントランスアニメーション。元素から透明トランジションまで不透明:

@keyframes fadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}

.fade-in {
  animation: fadeIn 0.4s ease-out forwards;
}

2. スライドアップフェードイン

一種のより动态の入场效果,組み合わせる垂直移动と透明度变化。これ创造た元素から下方まで达の感觉:

@keyframes slideUpFade {
  from {
    opacity: 0;
    transform: translateY(20px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.slide-up {
  animation: slideUpFade 0.5s cubic-bezier(0.4, 0, 0.2, 1) forwards;
}

3. ホバースケール

ホバーする时微妙のスケーリング増やす提供するたさせる人満意の交互フィードバック:

.card {
  transition: transform 0.2s ease, box-shadow 0.2s ease;
}

.card:hover {
  transform: translateY(-4px) scale(1.02);
  box-shadow: 0 12px 24px rgba(0, 0, 0, 0.15);
}

4. スタッガードリストアニメーション

時に项目リスト出现时,のために各项目設定する交誤のアニメーションレイテンシできる作成する引导视线のカスケード效果:

.list-item {
  opacity: 0;
  transform: translateY(10px);
  animation: slideUpFade 0.3s ease-out forwards;
}

.list-item:nth-child(1) { animation-delay: 0.0s; }
.list-item:nth-child(2) { animation-delay: 0.05s; }
.list-item:nth-child(3) { animation-delay: 0.1s; }
.list-item:nth-child(4) { animation-delay: 0.15s; }
.list-item:nth-child(5) { animation-delay: 0.2s; }

に対して动态リスト,使用 JavaScript に基づいて各项目的インデックス設定する animation-delay,またはCSSカスタムプロパティの使用:style="animation-delay: calc(var(--i) * 0.05s)"。

5. ローディングスピナー

平滑の连续旋转は经典の読み込む指示器:

@keyframes spin {
  to { transform: rotate(360deg); }
}

.spinner {
  width: 24px;
  height: 24px;
  border: 3px solid rgba(255, 255, 255, 0.2);
  border-top-color: #3b82f6;
  border-radius: 50%;
  animation: spin 0.8s linear infinite;
}

アニメーションのアクセシビリティ:prefers-reduced-motion

かつ非すべての用户すべて受益于アニメーション。に対して患あり前庭障碍、运动敏感または某些认知状况の人,アニメーションかもしれないをもたらす头晕、恶心または癫痫发作。prefers-reduced-motion 媒体クエリする許可するあなた尊重用户系统レベルのモーション削減設定。

モーション削減の実装

推奨するの方法はさせるアニメーション正未設定するモーション削減設定の用户有効化:

/* Default: no animation for users who prefer reduced motion */
.element {
  opacity: 1;
  transform: none;
}

/* Only animate for users who have no motion preference */
@media (prefers-reduced-motion: no-preference) {
  .element {
    animation: slideUpFade 0.5s ease-out forwards;
  }
}

または,あなた可思う設定モーション削減の用户無効化特定アニメーション:

.element {
  animation: slideUpFade 0.5s ease-out forwards;
}

@media (prefers-reduced-motion: reduce) {
  .element {
    animation: none;
    opacity: 1;
    transform: none;
  }

  /* Keep functional transitions but shorten duration */
  * {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
}

残すものと削除するもの

時に用户設定モーション削減时,かつ非すべてのアニメーションすべてすべきられる削除する。传达意味またはステートの機能性アニメーション应予約,だけは簡素化する:

アニメーションライブラリ

だが CSS アニメーション処理する大多数の UI 需求,JavaScriptアニメーションライブラリ提供するた高级機能,如に基づく物理の运动、スクロールする閉联アニメーションと複雑序列のオーケストレーション。

CSSファーストのライブラリ

JavaScriptアニメーションライブラリ

JavaScript と CSS の使い分け

CSS に使用される対応ステート变化の簡単声明式アニメーション。JavaScript に使用される:に基づく物理の运动(弹簧、动量)、スクロールする閉联アニメーション、を持つ精密に時間制御するの複雑序列、実行する时計算するの动态アニメーション参数,または必要とするもってプログラミング方式一時停止する、反转またはドラッグするのアニメーション。

アニメーションのデバッグ

アニメーション bug かもしれないとても微妙かつ難もって诊断。正しくのデバッグツールと技术させるたことがある程より一層効率的。

Chrome DevTools アニメーションパネル

Chrome DevTools を含む专门のアニメーションパネル,提供する強力のデバッグ機能:

パフォーマンスプロファイリング

使用 Chrome DevTools 中の Performance パネル识别アニメーション卡顿:

よくあるデバッグシナリオ

を使用中ですか CSS?無料の CSS ツール来フォーマットする、圧縮すると最適化するあなたのスタイル表もってに使用される生产環境。

CSS フォーマットするツールCSS 圧縮するツール

よくある質問

使用すべき CSS トランジションそれとも CSS アニメーション?

CSS トランジションに使用されるから A 点まで B 点の簡単ステート变化,如ホバーエフェクト、フォーカス状態と表示切替。CSS アニメーション(キーフレーム)に使用される複雑のマルチステップシーケンス、ループアニメーションまたは必要とする状態に依存しない变化実行するのアニメーション。トランジションより簡単;アニメーション提供するより多制御する。

どの CSS 属性できる安全に做アニメーションもって保証するパフォーマンス?

アニメーションのパフォーマンス最良の属性は transform と opacity,なぜならそれ们できる完全由 GPUコンポジット器処理する,なし需レイアウトをトリガーまたはペイント。width、height、margin と top など其彼属性できるレイアウトをトリガー重計算する,開销とても大。常に优先使用 transform: translateX() そして非 left,使用 transform: scale() そして非 width/height 变化。

どのようにのために正アニメーション敏感の用户提供するアクセシビリティ支持する?

使用 prefers-reduced-motion 媒体クエリするのためにで操作する系统中有効化「モーション削減」設定するの用户無効化または簡素化するアニメーション。する非必する必要があるアニメーション包裹で @media (prefers-reduced-motion: no-preference) 中,かつのために設定モーション削減の用户提供する即時ステート变化として後备。

とは will-change,いつ使用すべき?

will-change は一つの CSS 属性,へブラウザヒントする来どの属性できる变化,許可するそれ提前最適化する。谨慎使用,仅で观察までパフォーマンス问题时ようやく使用。でアニメーション開始する前適用する,アニメーション終了する後削除する。過度の使用 will-change できる浪费 GPU メモリ,実際にはかもしれない损害パフォーマンス。

どのようにデバッグ CSS アニメーション?

Chrome DevTools 提供するた強力のアニメーションデバッグツール。開くアニメーションパネル(でより多ツールメニュー中)查看すべての活动アニメーション、拖动時間线、リアルタイム変更する継続的に時間とレイテンシ、するアニメーション减速まで 1/4 速度。あなたまだできる使用 Performance パネル识别アニメーション卡顿とレイアウト抖动。