便利なJavaScriptライブラリが登場! CSSのプロパティの値の変更を検出できる -CSSStyleObserver
Post on:2024年10月8日
DOMツリーに加えられた変更を検出する機能としてMutationObserverが便利ですが、CSSのプロパティの値は検出できません。
最近ではCSSアニメーションを使用したWebサイトやスマホアプリも増え、プロパティ値の変更に応じてコールバックを実行する必要があるかもしれません。CSSのプロパティの値の変更を検出するための新しいライブラリを紹介します。
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(または使用しているパッケージマネージャ)経由でインストールしてください。
1 |
npm install @bramus/style-observer |
ライブラリの使い方
下記のコードは、ライブラリの使い方を示したものです。各セクションの機能についてはインラインコメントを参照してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// CSSStyleObserverクラスをインポートする import CSSStyleObserver from "@bramus/style-observer"; // 監視するプロパティの名前の配列 // 通常のプロパティとカスタムプロパティの両方で、1つ以上になります const properties = ['background-color']; // プロパティを追跡するCSSStyleObserverを作成 // プロパティの計算値が変わるたびに、渡されたコールバックが実行されます // ここで、コールバックは通知に新しい計算値を表示します const cssStyleObserver = new CSSStyleObserver( properties, (values) => { showNotification(values['background-color']); } ); // CSSStyleObserverインスタンスに<body>要素を監視させる cssStyleObserver.attach(document.body); // ドキュメントをクリックするたびに背景色を変更します document.documentElement.addEventListener('click', (e) => { document.body.style.setProperty('background-color', randomBackgroundColor()); }); |
ライブラリの仕組み
@bramus/style-observer
は、CSS Transitionとtransition-behavior: allow-discrete;
を利用しています。
@bramus/style-observer
で監視する各プロパティには、短いCSS Transitionが適用されます。このトランジションは0.001ミリ秒という非常に短いtransition-duration
に設定され、transition-timing-function
はstep-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