スクロール連動で回転する円形画像アニメーション【Scroll-Linked Circular Rotation 実装解説】

CSS、JavaScript

はじめに

ウェブデザインにおいて、ユーザーのスクロールに連動した動的なアニメーションは、視覚的なインパクトや操作感の向上に効果的です。
今回は、複数の画像を円形に配置し、スクロールに合わせてその円が滑らかに回転する「Scroll-Linked Circular Rotation」というアニメーションを、HTML・CSS・JavaScriptで実装する方法を解説します。

サンプル

See the Pen Untitled by kasasagi_kmnmc (@kasasagi_kmnmc) on CodePen.

スクロールすると、画面中央に円形配置された画像群がスムーズに回転します。
静的なレイアウトではなく、動きのある表現でユーザーの目を引きます。

実装のポイント

  • 画像を円形に等間隔で配置
  • スクロール量に応じて回転角度を計算
  • CSSの transformtranslate を組み合わせて正確に配置
  • スクロール範囲はページ全体の高さに対応

HTML構造

<div class="about_container">
  <div class="rotating-images">
    <!-- 画像タグはここに追加 -->
    <img src="画像URL1" class="rot-img" />
    <img src="画像URL2" class="rot-img" />
    <img src="画像URL3" class="rot-img" />
    <!-- 画像の数は自由に増減可能 -->
  </div>
</div>
  • <img src="画像URL" class="rot-img" />
    src 属性に表示したい画像のURLを指定してください。
  • .rotating-images は回転する画像群をまとめる親要素です。
  • .about_container はページ内のスクロール範囲を確保しています。

CSSスタイル

body {
  height: 300vh; /* ページ全体の高さを確保してスクロールを有効に */
  margin: 0; /* 余白をなくして画面いっぱいに表示 */
}

.about_container {
  position: relative; /* 内部の絶対配置要素の基準 */
}

.rotating-images {
  position: fixed; /* 画面中央に固定表示 */
  top: 50%; /* 垂直方向の中央 */
  left: 50%; /* 水平方向の中央 */
  width: 500px; /* コンテナの幅 */
  height: 500px; /* コンテナの高さ */
  pointer-events: none; /* マウスイベントを無効化 */
  z-index: 10; /* 他の要素より前面に表示 */
  transform: translate(-50%, -50%); /* 要素の中心を基準に位置調整 */
}

.rot-img {
  position: absolute; /* 親要素内で自由に配置 */
  top: 50%; /* 各画像の基準を中央に */
  left: 50%; /* 各画像の基準を中央に */
  width: 150px; /* 画像の横幅 */
  height: 150px; /* 画像の高さ */
  object-fit: cover; /* 画像の切り抜き方法 */
  transform-origin: center center; /* 回転の中心を画像の中心に設定 */
  border-radius: 9999px; /* 画像を円形にする */
}
  • body の高さを増やしてスクロール領域を作ることが重要です。
  • .rotating-images は固定位置で中央に表示され、画像の回転がここを中心に行われます。
  • .rot-imgtopleft を50%にし、transform-originで回転の中心を設定。
  • border-radius で丸く見せていますが、画像は元々円形でなくてもOKです。

JavaScriptコード

const images = document.querySelectorAll('.rot-img');
const radius = 200; // 画像を配置する円の半径(ピクセル)

// 画像の初期角度を計算(画像数に応じて均等配置)
const initialAngles = Array.from(images, (_, i) => i * (2 * Math.PI / images.length));

// ページ読み込み時に画像を円形に初期配置
initialAngles.forEach((angle, i) => {
  const x = Math.cos(angle) * radius; // X座標計算
  const y = Math.sin(angle) * radius; // Y座標計算
  images[i].style.transform = `translate(-50%, -50%) translate(${x}px, ${y}px)`;
});

// スクロールに連動して回転させる処理
window.addEventListener('scroll', () => {
  const scrollTop = window.scrollY || window.pageYOffset; // 現在のスクロール位置
  const docHeight = document.body.scrollHeight - window.innerHeight; // スクロール可能な最大値

  // スクロールの進捗を0〜1で算出
  let progress = scrollTop / docHeight;
  progress = Math.max(0, Math.min(1, progress)); // 0未満、1超えを防止

  // 進捗に応じて回転角を計算(1周=2πラジアン)
  const rotation = progress * 2 * Math.PI;

  // 各画像の角度に回転を加算し、位置を更新
  images.forEach((img, i) => {
    const angle = initialAngles[i] + rotation;
    const x = Math.cos(angle) * radius;
    const y = Math.sin(angle) * radius;
    img.style.transform = `translate(-50%, -50%) translate(${x}px, ${y}px)`;
  });
});
  • radius は円の大きさを決める重要な変数。
  • initialAngles は画像が円形に均等に並ぶ角度。
  • scroll イベントでスクロール量から回転角を計算し、全画像の位置を更新。
  • translate(-50%, -50%) は画像の中心を基準に位置をずらすための調整。

カスタマイズ方法

回転速度の調整

JavaScript内の以下の行の 2 * Math.PI を変更して回転速度を調整可能です。

const rotation = progress * 2 * Math.PI;

例:2周回すなら 4 * Math.PI にします。

円の半径の変更

const radius = 200;

の値を変えると、画像の円の大きさが変わります。

画像のサイズ変更

CSSの .rot-imgwidthheight を調整してください。

画像の数の増減

HTMLの画像タグの数を変えれば、JavaScriptは自動で角度を計算します。

注意点

  • 画像は円の中心を基準に回転するため、画像自体のデザインは中央を意識すると見栄えが良くなります。
  • スクロール領域が短いと回転の動きが小さくなるので、body の高さ設定は調整してください。
  • 複数の固定要素がある場合は重なりに注意しましょう。

まとめ

今回は、スクロールに連動して円形に配置した画像群を滑らかに回転させる「Scroll-Linked Circular Rotation」アニメーションの実装方法を解説しました。

HTML・CSSで画像の円形レイアウトと見た目を整え、JavaScriptでスクロール量に応じて回転角度を動的に変更しています。

動きのあるインタラクティブなデザインを加えたい方は、ぜひこの技術を参考にしてみてください。

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