60fpsパフォーマンスのためのGPUアクセラレーションCSSトランジション
どのCSSプロパティがGPUアクセラレーションされるかと、スムーズな60fpsパフォーマンスのためのトランジションの構造化方法を学びます。will-changeとコンポジットレイヤーを解説。
Performance Tips
詳細な説明
GPUアクセラレーションされたトランジション
すべてのCSSトランジションがパフォーマンスの面で等しいわけではありません。transformとopacityのようなプロパティはGPUコンポジタースレッドで実行され、スムーズな60fpsアニメーションを可能にします。他のプロパティは高コストなレイアウトやペイント操作をトリガーします。
3つのレンダリングフェーズ
- レイアウト(リフロー)— 要素の位置とサイズを再計算
- ペイント — ピクセルを塗りつぶす(色、ボーダー、シャドウ)
- コンポジット — GPUによりレイヤーが組み立てられる
パフォーマンス層
| 層 | プロパティ | コスト |
|---|---|---|
| コンポジットのみ | transform、opacity |
最も安い — GPUがすべてを処理 |
| ペイント + コンポジット | color、background-color、box-shadow、border-color |
中程度 — 再描画が必要 |
| レイアウト + ペイント + コンポジット | width、height、padding、margin、top、left |
高コスト — リフローをトリガー |
最適化された例
/* 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レイヤーを取得するため、メモリ消費が増加します。実際にアニメーションする要素にのみ適用し、可能であればアニメーション完了後に削除してください。
レイアウトスラッシングの回避
多くの兄弟要素のレイアウトに影響するwidth、height、topなどのプロパティをトランジションさせないでください。代わりに、サイズ変更にはtransform: scale()を、位置変更にはtransform: translate()を使用してください。
ユースケース
GPUアクセラレーションの理解は、モバイルデバイス、多数のアニメーション要素を持つ複雑なダッシュボード、パフォーマンスが重要なシングルページアプリケーションでスムーズなトランジションを構築するために不可欠です。