はじめに
ウェブデザインにおいて、ユーザーのスクロールに連動した動的なアニメーションは、視覚的なインパクトや操作感の向上に効果的です。
今回は、複数の画像を円形に配置し、スクロールに合わせてその円が滑らかに回転する「Scroll-Linked Circular Rotation」というアニメーションを、HTML・CSS・JavaScriptで実装する方法を解説します。
サンプル
See the Pen Untitled by kasasagi_kmnmc (@kasasagi_kmnmc) on CodePen.
スクロールすると、画面中央に円形配置された画像群がスムーズに回転します。
静的なレイアウトではなく、動きのある表現でユーザーの目を引きます。
実装のポイント
- 画像を円形に等間隔で配置
- スクロール量に応じて回転角度を計算
- CSSの
transform
とtranslate
を組み合わせて正確に配置 - スクロール範囲はページ全体の高さに対応
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-img
のtop
・left
を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-img
の width
と height
を調整してください。
画像の数の増減
HTMLの画像タグの数を変えれば、JavaScriptは自動で角度を計算します。
注意点
- 画像は円の中心を基準に回転するため、画像自体のデザインは中央を意識すると見栄えが良くなります。
- スクロール領域が短いと回転の動きが小さくなるので、
body
の高さ設定は調整してください。 - 複数の固定要素がある場合は重なりに注意しましょう。
まとめ
今回は、スクロールに連動して円形に配置した画像群を滑らかに回転させる「Scroll-Linked Circular Rotation」アニメーションの実装方法を解説しました。
HTML・CSSで画像の円形レイアウトと見た目を整え、JavaScriptでスクロール量に応じて回転角度を動的に変更しています。
動きのあるインタラクティブなデザインを加えたい方は、ぜひこの技術を参考にしてみてください。