CSSはプロパティを変更します:いつ使用しないか
will-change
CSSプロパティは一般的に誤解されているか、正しく使用されていません。この短い投稿では、CSSアニメーションとトランジションを可能な限りパフォーマンスの高いものにするために、プロパティをわかりやすく説明します。
意志の変化とは何ですか?
一言で言えば、will-change
プロパティは、どのプロパティと要素が操作される可能性が高いかを事前にブラウザに通知する方法です。 この情報を使用して、ブラウザーは必要になる前に最適化を行うことができ、よりスムーズなエクスペリエンスを実現できます。
この例は、要素にtransform
を適用している場合、次のようにブラウザに通知できます。
will-change: transform;
次のように複数の値を宣言することもできます。
will-change: transform, opacity;
値を変更します
will-change
は、次の4つの値をとることができます。
- auto-ブラウザは最適化を適用します
- scroll-position-作成者が近い将来に要素のスクロール位置をアニメーション化または変更することを期待していることを示します
- contents -作成者が、近い将来、要素のコンテンツについて何かをアニメーション化または変更することを期待していることを示します。
- custom-indent -作成者が、近い将来、要素の指定された名前でプロパティをアニメーション化または変更することを期待していることを示します。
ここで注目する値はcustom-indent
です。 transform
、opacity
など。
いつ使用するか-変更しますか?
MozillaのMDNで述べられているように、will-change
は最後の手段として使用する必要があります。
will-change
の使用法を悪用すると、パフォーマンスが低下します。これは、私たちが望んでいることとは正反対です。 アニメーション/トランジションがスムーズで鮮明な場合は、will-change
を使用する必要はありません。 ブラウザはwill-change
を使用せずにすでに最適化を行っています。
これをしないでください!
will-change
を使用するときによくある間違いは、次のとおりです。
.my-element:hover { will-change: opacity; transition: opacity .25s ease-in-out; }
これは良いことよりも害を及ぼしています。will-change
は未来形なので、アニメーションが行われているときに適用しないでください。
ここでのwill-change
のより良い使用法は、will-change
をmy-element
の親に次のように配置することです。
.parent-element:hover { will-change: opacity; } .my-element:hover { transition: opacity .25s ease-in-out; }
これにより、ブラウザはこの変更を最適化するために事前に知ることができます。 アニメーションがぎくしゃくしたりちらついたりする場合は、これを最後の手段として使用することを忘れないでください。
意志変更の削除
要素の変更が完了したら、Mozillaはwill-change
を削除することをお勧めします。 そのため、JavaScriptでwill-change
を設定して、削除できるようにすることもお勧めします。 CSSスタイルシートでwill-change
が設定されている場合、削除できません。
コード的には、これは非常に単純で、次のようになります。
const el = document.querySelector('.parent-element') el.addEventListener('mouseenter', addWillChange) el.addEventListener('animationend', removeChange) const addWillChange = () => { this.style.willChange = 'opacity' } const removeChange = () => { this.style.willChange = 'auto' }
上記のコードは非常に単純です。ホバーしたときにwill-change
をparent-element
に追加し、animationend
イベントが発生したときに、[を削除します。 X156X]。
スタイルシートでwill-change
を設定すると、状況によっては意味があります。 このような状況は、複数回相互作用する可能性のある要素であり、ボタンの波及効果やサイドバーのスライドアウトなどの可能性があります。 一般に、スタイルシートにはほんの一握りのwill-change
プロパティが必要であり、残りはJavaScriptを使用して設定するのが理想的です。
結論
これはwill-change
の簡単な紹介でした。さらに深く掘り下げたい場合は、このトピックに関するSaraSoueidanのすばらしい記事をチェックすることをお勧めします。
読んでくれてありがとう!