参考:CSSのみでスクロール連動アニメーションを実現する方法
従来JavaScriptで行っていた「画面のスクロール監視」と「要素のインデックス(順番)計算」を、CSSの標準機能へ置き換ます。
以前はIntersectionObserverによるクラス操作やJSのCSS変数設定が必要でしたが、Scroll-driven Animationsとsibling-index()を組み合わせることで、JSに頼らないCSSのみでの実装が可能になります。
完成イメージ
- STEP1ホワイトスネイク
生物の記憶とスタンド能力を、CDのような形状の「DISC」にして取り出す、能力を持つ。
- STEP2C-MOON
ホワイトスネイクと、緑色の赤ちゃんが融合してできたスタンド。半径約3km以内にある物体の重力の方向を、本体のプッチ神父を中心に、逆転させる能力を持つ。
- STEP3メイド・イン・ヘブン
C-MOONが進化したスタンド。全世界の時を、加速させる能力を持つ。
実装手順
- ラベルGutenbergエディターでの設定
以下の手順で設定します。
- 「テーブル」ブロックを配置します。
- 高度な設定→追加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; } } } } }
さいごに
今回紹介した方法を使えば、横向きのタイムラインを作成できます。
さらに、画面に表示されるタイムライン項目が順番にアニメーションで表示される仕組みを簡単に実現できます。
