60fpsパフォーマンスのためのGPUアクセラレーションCSSトランジション

どのCSSプロパティがGPUアクセラレーションされるかと、スムーズな60fpsパフォーマンスのためのトランジションの構造化方法を学びます。will-changeとコンポジットレイヤーを解説。

Performance Tips

詳細な説明

GPUアクセラレーションされたトランジション

すべてのCSSトランジションがパフォーマンスの面で等しいわけではありません。transformopacityのようなプロパティはGPUコンポジタースレッドで実行され、スムーズな60fpsアニメーションを可能にします。他のプロパティは高コストなレイアウトやペイント操作をトリガーします。

3つのレンダリングフェーズ

  1. レイアウト(リフロー)— 要素の位置とサイズを再計算
  2. ペイント — ピクセルを塗りつぶす(色、ボーダー、シャドウ)
  3. コンポジット — GPUによりレイヤーが組み立てられる

パフォーマンス層

プロパティ コスト
コンポジットのみ transformopacity 最も安い — GPUがすべてを処理
ペイント + コンポジット colorbackground-colorbox-shadowborder-color 中程度 — 再描画が必要
レイアウト + ペイント + コンポジット widthheightpaddingmargintopleft 高コスト — リフローをトリガー

最適化された例

/* Good: コンポジットレイヤーのプロパティのみ */
.card {
  transition: transform 0.3s ease-out, opacity 0.3s ease;
}

.card:hover {
  transform: translateY(-8px) scale(1.02);
  opacity: 0.95;
}

will-changeの使用

will-changeプロパティは、プロパティがアニメーションすることをブラウザにヒントし、事前に要素を独自のコンポジターレイヤーに昇格させることを可能にします:

.card {
  will-change: transform, opacity;
  transition: transform 0.3s ease-out;
}

注意: will-changeを過度に使用すると、昇格された各要素が独自のGPUレイヤーを取得するため、メモリ消費が増加します。実際にアニメーションする要素にのみ適用し、可能であればアニメーション完了後に削除してください。

レイアウトスラッシングの回避

多くの兄弟要素のレイアウトに影響するwidthheighttopなどのプロパティをトランジションさせないでください。代わりに、サイズ変更にはtransform: scale()を、位置変更にはtransform: translate()を使用してください。

ユースケース

GPUアクセラレーションの理解は、モバイルデバイス、多数のアニメーション要素を持つ複雑なダッシュボード、パフォーマンスが重要なシングルページアプリケーションでスムーズなトランジションを構築するために不可欠です。

試してみる — CSS Transition Generator

フルツールを開く