今回は、生のJavaScriptを使ってマウススクロールイベントに慣性を加えるアニメーションを作成します。このアニメーションは、ページをスクロールしたときに、スクロールの速度に応じて慣性を持って滑らかに移動する要素を作成します。
ステップ 1: 基本的なHTML構造
まず、基本的なHTMLを設定します。ここでは、スクロールを検知するためのコンテナと、その中にアニメーションさせる要素を配置します。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Scroll Inertia</title>
<style>
body, html {
margin: 0;
padding: 0;
height: 200%;
overflow: hidden;
}
.container {
position: relative;
width: 100%;
height: 100%;
overflow-y: scroll;
background: lightgray;
}
.content {
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
width: 80%;
background: white;
padding: 20px;
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
}
</style>
</head>
<body>
<div class="container">
<div class="content">
<h1>Scroll Down</h1>
<p>Scroll to see the inertia effect in action.</p>
</div>
</div>
<script src="script.js"></script>
</body>
</html>
ステップ 2: JavaScriptによるスクロールイベントの処理
次に、スクロールイベントを処理し、慣性を持たせるアニメーションをJavaScriptで実装します。
document.addEventListener('DOMContentLoaded', () => {
const container = document.querySelector('.container');
const content = document.querySelector('.content');
let lastScrollY = 0;
let currentScrollY = 0;
let scrollSpeed = 0;
let isScrolling = false;
function updateScroll() {
if (isScrolling) {
requestAnimationFrame(updateScroll);
}
scrollSpeed *= 0.9;
currentScrollY += scrollSpeed;
container.scrollTop = currentScrollY;
}
container.addEventListener('scroll', (e) => {
if (!isScrolling) {
requestAnimationFrame(updateScroll);
isScrolling = true;
}
const scrollTop = container.scrollTop;
scrollSpeed = scrollTop - lastScrollY;
lastScrollY = scrollTop;
});
container.addEventListener('wheel', (e) => {
scrollSpeed += e.deltaY * 0.5;
});
});
詳細な説明
ステップ 1: 基本的なHTML構造
- HTML構造:
container
というクラスを持つスクロールコンテナと、その中にあるcontent
というクラスを持つアニメーション対象の要素を作成します。 - CSS: コンテナのスクロール領域を設定し、コンテンツが中央に配置されるようにスタイルを適用します。
ステップ 2: JavaScriptによるスクロールイベントの処理
- 変数の定義:
lastScrollY
: 最後に記録されたスクロール位置。currentScrollY
: 現在のスクロール位置。scrollSpeed
: スクロールの速度。isScrolling
: スクロール中かどうかのフラグ。
- updateScroll関数:
- 慣性を持たせるため、
requestAnimationFrame
を使ってアニメーションを更新します。 scrollSpeed
を徐々に減速させ、現在のスクロール位置に反映させます。container.scrollTop
をcurrentScrollY
に設定して、スクロール位置を更新します。
- 慣性を持たせるため、
- スクロールイベントリスナー:
- スクロールイベントが発生すると、
requestAnimationFrame
を使ってupdateScroll
関数を呼び出します。 - スクロールの速度を計算し、
lastScrollY
を更新します。
- スクロールイベントが発生すると、
- ホイールイベントリスナー:
- ホイールイベントが発生すると、
scrollSpeed
を増加させます。これにより、スクロールの速度が加速します。
- ホイールイベントが発生すると、
このコードにより、スクロールイベントに慣性を持たせることができます。ユーザーがスクロールを止めても、スクロールが徐々に減速し、自然な動きを実現します。