アニメーションを多用した魅力的なウェブサイトでは、CSSアニメーションが頻繁に使われます。
しかし正しく実装しないとパフォーマンスの低下を招くことも。

アニメーションが「カクカク」する場合、たいていGPUでなくCPUで処理されていて、リペイントが発生している可能性があります。
こんなときはGPUアクセラレーションを利用することで、よりなめらかで快適な動作を実現することができます。

GPUアクセラレーションとは?
通常の演算処理を行うCPUではなく、グラフィック処理に特化したGPU(Graphics Processing Unit)を利用して、特定の操作(アニメーションや動画再生、3Dレンダリングなど)を高速化する技術です。CPUの負担を軽減し、滑らかな表示が可能になります。
リペイント
ブラウザが特定箇所を再描画すること。
たとえばCSSで色や背景が変わると、その要素はリペイントが発生します。リペイントはPCに負荷がかかり、パフォーマンスの低下やカクつきの原因になるため、GPUアクセラレーションを使ったテクニックが推奨されています。

というわけで。
今日はCSSの「will-change」プロパティを使ってGPUアクセラレーションを行う方法を紹介します。

GPUを使うための「will-change」プロパティ

「will-change」プロパティを使用することで、ブラウザに対して変化するプロパティを事前に予告して伝え、GPU処理を最適化します。

例1(transformを予告する場合):

.example {
	will-change: transform;
	transition: transform 1s linear;
}

例2(opacityを予告する場合):

.example:hover {
	 will-change: opacity;
	 opacity: 0.5;
}

「will-change」を使用すると、GPUによりなめらかにアニメーション処理されやすくなります。

「will-change」の使用上の注意点

will-changeを多用するとレイヤーを過剰に作成することになるため、逆にパフォーマンスの低下を招きます。

また、will-changeを使用する場合、なるべくアニメーションの直前に付与するようにしてください。will-changeを恒久的に定義した場合、不要なGPUメモリを専有することになります。

やってはいけないNG行為

*:hover {
	will-change: all;
}

すべての要素にwill-changeを指定することは厳禁です。

また、過去、CSSハック的に「transform3d」を使ってGPUアクセラレーションを促す方法も流行りましたが、「will-change」のほうが信頼性が高く、パフォーマンスの最適化にも適しています。


基本的にはCSSに1行を書き加えるだけなのでとても簡単です。
ぜひお試しください。