目次
animation-timelineを活用したスクロール監視のCSS化(JavaScript不要)
animation-timelineを使用することで、従来 JavaScriptのscrollイベントで計算していたスクロール進捗の監視処理を、CSS のみで完結させることができます。
ただし、全てのブラウザに対応しているわけではありません(対応状況は以下を参照)。
実装手順
以下の手順で実装します。
- ラベルCSSを追加(スクロール連動設定)
以下のコードをstyle.cssに追加します。
/* カスタムプロパティの登録 */ @property --per { syntax: '<percentage>'; inherits: true; initial-value: 0%; } /* スクロール変化用キーフレーム */ @keyframes scroll-progress { from { --per: 0%; } to { --per: 100%; } } /* スクロール位置とカスタムプロパティの連動設定 */ .go-to-top-button { animation: scroll-progress auto linear; animation-range: 0% 100%; animation-timeline: scroll(root); } - ラベルCSSを追加(ボタン表示)
以下のコードをstyle.cssに追加します。
.go-to-top-button { background-color: transparent; &::before { --my-color: #eee; /* 未通過(ベース)の色 */ --my-progress: #ff0000; /* 進捗率の色 */ background-image: conic-gradient( var(--my-progress) 0% var(--per), var(--my-color) var(--per) 100% ); border-radius: 100%; content: ''; display: block; height: 100%; mask: radial-gradient(circle, transparent 50%, #000 54%); position: absolute; width: 100%; } }
実装のポイント
- @property による型定義
--perを単なる文字列ではなく<percentage>型として明示することで、ブラウザが連続的な数値として補間(スムーズに変化)できるようになります。
またinherits: trueにより、親要素で更新された--perの値を::beforeなどの子・擬似要素へ自動で継承できます。
- animation-timeline: scroll()による時間軸の置換
通常の時間経過(秒数)ではなく、scroll(root)を指定してビューポート(画面全体)のスクロール位置をアニメーションの進行度として直接利用します。
- @keyframesによる変数の自動再計算
スクロール位置に応じて0%から100%まで--perの値がリアルタイムに変化します。
JavaScript 側でwindow.addEventListener('scroll', ...)を監視・計算する処理が不要になり、すべての処理がブラウザの描画エンジン(GPUアクセラレーション含む)で完結します。

