便利なJavaScriptライブラリが登場! CSSのプロパティの値の変更を検出できる -CSSStyleObserver

DOMツリーに加えられた変更を検出する機能としてMutationObserverが便利ですが、CSSのプロパティの値は検出できません。

最近ではCSSアニメーションを使用したWebサイトやスマホアプリも増え、プロパティ値の変更に応じてコールバックを実行する必要があるかもしれません。CSSのプロパティの値の変更を検出するための新しいライブラリを紹介します。

CSSのプロパティの値の変更を検出できる新しいライブラリ- CSSStyleObserver

Introducing @bramus/style-observer, a MutationObserver for CSS
by Bramus!

下記は各ポイントを意訳したものです。
※当ブログでの翻訳記事は、元サイト様にライセンスを得て翻訳しています。

はじめに

MutationObserverの欠点は(私見ですが)、CSSのプロパティの値の変更を検出できないことです。

その欠点は埋めるために私はそれを可能にするライブラリを作成しました、@bramus/style-observerです。これによりCSSのプロパティの計算値の変更にJavaScriptによるコールバックができます。

このライブラリは、requestAnimationFrameに依存せず、個別にアニメーションするプロパティ(カスタムプロパティも含む)をサポートする点で、これまでの試みとは異なります。これを実現するために、ライブラリはCSS Transitionとtransition-behavior: allow-discrete;を利用しています。

ライブラリのデモ

さっそくデモを見てましょう。

ドキュメント(あらゆる場所)をクリックする度にbackground-colorがランダムなカラーに変更されます。@bramus/style-observerでは、各変更に応じてコールバックが実行されます。このコールバックはNotyfを使用して、通知パネルに新しい計算値を表示しています。

See the Pen
@bramus/style-observer demo
by coliss (@coliss)
on CodePen.

ライブラリのインストール

@bramus/style-observerを入手するには、NPM(または使用しているパッケージマネージャ)経由でインストールしてください。

ライブラリの使い方

下記のコードは、ライブラリの使い方を示したものです。各セクションの機能についてはインラインコメントを参照してください。

ライブラリの仕組み

@bramus/style-observerは、CSS Transitionとtransition-behavior: allow-discrete;を利用しています。

@bramus/style-observerで監視する各プロパティには、短いCSS Transitionが適用されます。このトランジションは0.001ミリ秒という非常に短いtransition-durationに設定され、transition-timing-functionstep-startに設定されているため、トランジションはすぐに開始されます。

このトランジションをキャッチするために、ライブラリはCSSStyleObserverに渡されたコールバックを呼び出すtransitionstartイベントリスナーも設定します。

CSSでは通常、トランジションは補間可能なプロパティに対してのみ発生します。これには個別にアニメーション化するプロパティは含まれません。transition-behaviorのおかげで、個別にアニメーション化するプロパティ(カスタムプロパティを含む)でトランジション(およびそのイベント)を設定できるようになりました。これはtransition-behavior: allow-discrete;monitored要素に宣言することで実現できます。

ライブラリのサポートブラウザ

@bramus/style-observerは、CSS Transitionをサポートするブラウザであれば動作します。個別にアニメーションするプロパティを監視するにはtransition-behavior: allow-discrete;のサポートも必要です。
実際には、下記のブラウザをサポートしています。

  • Chrome/Edge 117+
  • Firefox 129+
  • Safari 18+

なお、カスタムプロパティのトランジションには、すべてのブラウザにバグがあることに注意してください。

カスタムプロパティのトランジションに関する注意事項

カスタムプロパティのトランジションに関しては、すべてのブラウザに多くのバグがあるのが現状です。

たとえば、Chromeは現在、https://crbug.com/360159391にあるように未登録のカスタムプロパティに対してトランジョンのイベントはトリガーされません。このバグは、@propertyを使用してカスタムプロパティを登録することで回避できます。

Safariは現在、特定の構文でChromeの回避策を使用すると、トランジションのループから抜け出せなくなるようです。これはカスタムプロパティが登録されていない場合やカスタムプロパティが文字列("<string>", "*"など)の場合に発生します。他の構文、たとえば"<number>"や"<custom-ident>"など他の構文はSafariで問題を起こしません(同時にChromeのバグも回避できます)。

そして、Firefoxは現在、登録されたカスタムプロパティが補間可能な型を持つ構文を使用することを好みません。

これらの注意事項は、下記ページにまとめました。

つまり、現在@bramus/style-observerでカスタムプロパティを監視する唯一のクロスブラウザな方法は、"<custom-ident>"という構文でプロパティを登録することです。

"<custom-ident>"の値は数値で始めることができないので、この型を使用して数値を保存することはできません。

sponsors

top of page

©2024 coliss