トップへ戻るボタンにスクロール量を表示する方法

Cocoonカスタマイズ集
この記事は約15分で読めます。
記事内に広告が含まれています。

記事に記載したコードは、スキンに追加されています。

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%;
      }
    }

実装のポイント

  1. @property による型定義
    --perを単なる文字列ではなく<percentage>型として明示することで、ブラウザが連続的な数値として補間(スムーズに変化)できるようになります。
    またinherits: trueにより、親要素で更新された--perの値を::beforeなどの子・擬似要素へ自動で継承できます。
  1. animation-timeline: scroll()による時間軸の置換
    通常の時間経過(秒数)ではなく、scroll(root)を指定してビューポート(画面全体)のスクロール位置をアニメーションの進行度として直接利用します。
  1. @keyframesによる変数の自動再計算
    スクロール位置に応じて0%から100%まで--perの値がリアルタイムに変化します。
    JavaScript 側でwindow.addEventListener('scroll', ...)を監視・計算する処理が不要になり、すべての処理がブラウザの描画エンジン(GPUアクセラレーション含む)で完結します。
タイトルとURLをコピーしました