スクロール連動アニメーションの作り方:CSS vs JavaScript

2024-04-02

CSS スクロールタイムライン:スクロール連動アニメーションを簡単実装

概要

  • 動作環境: 主要なブラウザでサポートされています。
  • 利点:
    • コード量が少なく、記述がシンプル
    • スクロール量とアニメーションを直接結びつけ、直感的に操作可能
    • 高度なアニメーションも容易に実現
  • 欠点:

主な機能

  • スクロール位置とアニメーションの連動:
    • スクロールに応じて、要素の表示・非表示、位置、色、形状などの変化をアニメーションさせる
    • 複数のアニメーションを同時に実行し、複雑な動きを表現
  • アニメーションのタイミング制御:
    • スクロール開始時、終了時、特定の位置でのみアニメーションを実行
    • アニメーションの速度やイージングを調整
  • 複数タイムラインの管理:
    • 複数のスクロールタイムラインを定義し、個別にアニメーションを制御
    • タイムラインを組み合わせることで、より複雑なアニメーションを実現

基本的な使い方

  1. @scroll-timeline ルールでタイムラインを定義
    • タイムラインの名前と、スクロール方向(縦 or 横)を指定
  2. scroll-timeline プロパティでアニメーション対象を指定
    • タイムラインの名前と、アニメーションの開始位置・終了位置を指定
  3. アニメーションプロパティで具体的な動きを定義
    • opacity、transform、background-color など、アニメーションさせるプロパティと変化量を指定
  • スクロールタイムラインは、視覚的な訴求力向上、ユーザーエンゲージメント向上、操作性向上などに役立ちます。
  • 実装例やチュートリアルが多数公開されているので、参考にしながら学習を進めると効果的です。

CSS スクロールタイムラインは、スクロール連動アニメーションを簡単に実装できる便利な機能です。コード量が少なく、直感的に操作できるため、初心者にもおすすめです。



スクロールタイムライン サンプルコード

<div class="box"></div>
.box {
  width: 100px;
  height: 100px;
  background-color: red;
}

@scroll-timeline {
  name: "my-timeline";
}

.box {
  scroll-timeline: my-timeline;
  scroll-timeline-position: 0% 100%;
  
  animation: fade-in 2s ease-in-out;
}

@keyframes fade-in {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

解説:

  • .box要素は、スクロール開始時に透明で、スクロール完了時に完全に表示されます。
  • アニメーションは fade-in キーフレームで定義されています。

スクロール位置に応じて要素の大きさを変化

<div class="box"></div>
.box {
  width: 100px;
  height: 100px;
  background-color: red;
}

@scroll-timeline {
  name: "my-timeline";
}

.box {
  scroll-timeline: my-timeline;
  scroll-timeline-position: 0% 100%;
  
  animation: grow 2s ease-in-out;
}

@keyframes grow {
  from {
    width: 50px;
    height: 50px;
  }
  to {
    width: 200px;
    height: 200px;
  }
}

解説:

  • .box要素は、スクロール開始時に50px x 50pxで、スクロール完了時に200px x 200pxに拡大されます。
  • アニメーションは grow キーフレームで定義されています。

スクロールに応じて要素の色を変更

<div class="box"></div>
.box {
  width: 100px;
  height: 100px;
}

@scroll-timeline {
  name: "my-timeline";
}

.box {
  scroll-timeline: my-timeline;
  scroll-timeline-position: 0% 100%;
  
  animation: color-change 2s ease-in-out;
}

@keyframes color-change {
  from {
    background-color: red;
  }
  to {
    background-color: blue;
  }
}

解説:

  • .box要素は、スクロール開始時に赤色で、スクロール完了時に青色になります。
  • アニメーションは color-change キーフレームで定義されています。

複数のアニメーションを組み合わせる

<div class="box"></div>
.box {
  width: 100px;
  height: 100px;
  background-color: red;
}

@scroll-timeline {
  name: "my-timeline";
}

.box {
  scroll-timeline: my-timeline;
  scroll-timeline-position: 0% 100%;
  
  animation: fade-in 2s ease-in-out, grow 2s ease-in-out;
}

@keyframes fade-in {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

@keyframes grow {
  from {
    width: 50px;
    height: 50px;
  }
  to {
    width: 200px;
    height: 200px;
  }
}

解説:

  • fade-ingrow アニメーションが同時に実行されます。

スクロール位置に応じて要素を移動

<div class="box"></div>
.box {
  width: 100px;


CSS スクロールタイムラインの代替方法

そこで、CSS スクロールタイムラインの代替方法として、以下の3つの方法を紹介します。

JavaScriptを使用する

従来の方法として、JavaScriptを使用してスクロール位置を取得し、それに応じてアニメーションを制御する方法があります。

メリット:

  • すべてのブラウザで動作する
  • 高度なアニメーションを実現できる

デメリット:

  • コード量が多くなる
  • スクロールイベントの処理など、複雑な処理が必要

ライブラリを使用する

スクロールアニメーションを簡単に実装できるライブラリが多数公開されています。

メリット:

  • コード量が少なく、簡単に実装できる
  • さまざまなアニメーション効果が用意されている

デメリット:

  • ライブラリの追加読み込みが必要
  • ライブラリに依存するため、自由度が低くなる

CSS変数とアニメーションタイミング関数を使用する

CSS変数と animation-timing-function を使用して、スクロール位置に応じて要素のスタイルを変化させる方法があります。

メリット:

  • コード量が比較的少ない
  • スクロールタイムラインよりも軽量

デメリット:

  • スクロールタイムラインほど機能が豊富ではない
  • 複雑なアニメーションには不向き

CSS スクロールタイムラインは、スクロール連動アニメーションを簡単に実装できる便利な機能ですが、ブラウザのサポート状況によっては代替方法が必要になります。

上記で紹介した3つの方法はそれぞれメリットとデメリットがあるので、目的に合った方法を選択することが重要です。




CSSでセピア色の世界へようこそ!画像や要素をレトロに変身させる魔法の方法

CSSの「Filter Effects」機能の一つである「sepia()」は、画像や要素をモノクロ化し、茶褐色(セピア色)のトーンを適用する関数です。古い写真のようなレトロな雰囲気を演出したい場合などに効果的に使用できます。構文n は、セピア色の強さを表す数値です。0.0の場合は元の画像の色合いが維持され、1.0になると完全にセピア色になります。



CSSグラデーションでsin関数を活用して円形グラデーションや波形グラデーションを作成する方法

sin関数は以下の構文で記述します。<angle> は角度を指定します。角度は度数法またはラジアン法で指定できます。例:sin関数はアニメーションのタイミング関数として使用できます。例えば、以下のようなコードは、要素を上下に波打たせるアニメーションを作成します。


CSS Miscellaneous: view-timeline-name 詳細解説

view-timeline-name は CSS の Miscellaneous モジュールで定義されるプロパティで、スクロールタイムラインの名前を指定します。スクロールタイムラインは、スクロールによってアニメーションを制御するために使用されます。


CSS Miscellaneous: user-selectプロパティの徹底解説

user-select プロパティは、ユーザーがテキストを選択できるかどうかを制御します。これは、ユーザーインターフェースの利便性を向上させたり、重要なコンテンツを保護したりするために使用できます。値auto: ユーザーがテキストを選択できます。これはデフォルト値です。


Flexbox や CSS Grid で実現!Miscellaneous 書き込みモードの代替方法

writing-modeプロパティには、horizontal-tb、vertical-rl、vertical-lrなど、いくつかの標準的な書き込みモードがあります。さらに、Miscellaneousと呼ばれる特殊な書き込みモードも存在します。



CSS Miscellaneous: view-timeline-name 詳細解説

view-timeline-name は CSS の Miscellaneous モジュールで定義されるプロパティで、スクロールタイムラインの名前を指定します。スクロールタイムラインは、スクロールによってアニメーションを制御するために使用されます。


【上級者向け】CSS overflow-x プロパティを使いこなして、高度なレイアウトを実現しよう

テキストボックス画像flexbox レイアウトgrid レイアウトoverflow-x の値は以下のとおりです。visible (デフォルト): コンテンツがボックスの幅を超えてもスクロールバーを表示せず、コンテンツを隠します。hidden : コンテンツがボックスの幅を超えてもスクロールバーを表示せず、コンテンツを切り取ります。


CSS Miscellaneous image.paint で画像をペイントツールのように操る

主な機能:画像の描画方法を指定: fill, stroke, marker など画像のサイズと位置を調整: scale, translate, rotate など画像の一部を切り取る: clip画像をぼかしたり、影をつけたりする: filter


CSS nth-last-child の徹底解説!後ろから数えて要素を選択する魔法のセレクタ

:nth-last-child は、要素の子要素のうち、後ろから数えて特定の位置にある要素を選択するための CSS セレクタです。構文selector: 対象となる要素を指定するセレクタn: 子要素の後ろからの位置を表す数値使い方:nth-last-child は、以下の使い方があります。


CSS 名前空間:衝突を防いでスタイルを明確に

複数の XML 名前空間を混在させる場合、同じセレクター名が異なる意味を持つ可能性があります。例えば、svg 名前空間と mathml 名前空間の両方で circle という要素が存在します。名前空間を使用しなければ、circle というセレクターはどちらの要素にもマッチしてしまう可能性があります。