「タイムライン」ブロックを横向きに表示する方法

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

参考:CSSのみでスクロール連動アニメーションを実現する方法

従来JavaScriptで行っていた「画面のスクロール監視」と「要素のインデックス(順番)計算」を、CSSの標準機能へ置き換ます。

以前はIntersectionObserverによるクラス操作やJSのCSS変数設定が必要でしたが、Scroll-driven Animationsとsibling-index()を組み合わせることで、JSに頼らないCSSのみでの実装が可能になります。

完成イメージ

  • STEP1
    ホワイトスネイク

    生物の記憶とスタンド能力を、CDのような形状の「DISC」にして取り出す、能力を持つ。

  • STEP2
    C-MOON

    ホワイトスネイクと、緑色の赤ちゃんが融合してできたスタンド。半径約3km以内にある物体の重力の方向を、本体のプッチ神父を中心に、逆転させる能力を持つ。

  • STEP3
    メイド・イン・ヘブン

    C-MOONが進化したスタンド。全世界の時を、加速させる能力を持つ。

実装手順

  • ラベル
    Gutenbergエディターでの設定

    以下の手順で設定します。

    1. 「テーブル」ブロックを配置します。
    2. 高度な設定→追加CSSクラスにmy-timelineと入力します。
  • ラベル
    CSSを追加

    以下のコードをstyle.cssに追加します。

    @property --item {
      syntax: '<integer>';
      inherits: true;
      initial-value: 0;
    }
    
    @media (min-width: 481px) {
      @keyframes tl-fade {
        from { opacity: 0; }
        to   { opacity: 1; }
      }
    
      @keyframes tl-line {
        from { width: 0; }
        to   { width: 100%; }
      }
    
      .my-timeline {
        /* 1アイテムのアニメーション時間を設定 */
        --delay: 2s;
    
        > .timeline {
          display: flex;
    
          > .timeline-item {
            width: 100%;
    
            &::before {
              height: 16px;
              left: 0;
              top: 30px;
              width: 16px;
              z-index: 1;
            }
    
            .timeline-item-label {
              float: unset;
              padding: 0 0 30px;
              text-align: unset;
            }
    
            .timeline-item-content {
              border-left: unset;
              float: unset;
              padding: 0 0 0 16px;
              width: unset;
            }
    
            .timeline-item-snippet::after {
              background-color: #e5e5d1;
              content: '';
              height: 3px;
              position: absolute;
              top: 36px;
              width: 100%;
            }
          }
        }
    
        @supports (animation-trigger: --t play-forwards) {
          /* トリガーの有効範囲を設定 */
          trigger-scope: --tl;
    
          /* トリガー名を登録 */
          timeline-trigger-name: --tl;
    
          /* 画面内への進入をトリガーとして設定 */
          timeline-trigger-source: view();
    
          > .timeline > .timeline-item {
            /* 兄弟要素の順番からアイテム番号を取得 */
            --item: calc(sibling-index() - 1);
    
            opacity: 0;
    
            animation: tl-fade 1s ease both;
            animation-delay: calc(var(--item) * var(--delay));
            animation-trigger: --tl play-forwards;
    
            /* 線のアニメーションを設定 */
            .timeline-item-snippet::after {
              width: 0;
    
              animation: tl-line var(--delay) ease both;
              animation-delay: calc(var(--item) * var(--delay));
    
              /* トリガーとアニメーションを関連付け */
              animation-trigger: --tl play-forwards;
            }
          }
        }
      }
    }

さいごに

今回紹介した方法を使えば、横向きのタイムラインを作成できます。
さらに、画面に表示されるタイムライン項目が順番にアニメーションで表示される仕組みを簡単に実現できます。

タイトルとURLをコピーしました