【スクロールで画像が動く】CCSとJavaScriptで作るアニメーション
この記事では、スクロールで画像が動くアニメーションをCCSとJavaScriptで作っていきます。
コードを全て公開するので、もちろんコピペOKです。
【スクロールで画像が動く】CCSとJavaScriptで作るアニメーション
スクロールすると画像が動くJSを実装
スクロールするたびに動くとうざいので、1度きりにするとシンプルで良いね。
コツコツ頑張ろうな👍#駆け出しエンジニアと繋がりたい #駆け出しエンジニア pic.twitter.com/cjMz5lck7u— moridai@エンジニア (@MoridaiEngineer) January 30, 2024
HTML構造の作成
<section id="about">
<div class="img animate-left">
<img src="<?php echo get_template_directory_uri(); ?>/img/about.jpg" alt="">
</div>
<div class="text">
<h2 class="section-title">
<span class="en">ABOUT</span>
<span class="ja">わたしたちについて</span>
</h2>
<p>タイトルタイトルタイトルタイトルタイトルタイトルタイトルタイトル</p>
<p>タイトルタイトルタイトルタイトルタイトルタイトルタイトルタイトル</p>
<p>タイトルタイトルタイトルタイトルタイトルタイトルタイトルタイトル</p>
</div>
</section>
CSSスタイリング
/* 初期状態 */
.animate-left {
opacity: 0;
transform: translateX(-200px); /* 左にアニメーションする初期位置 */
transition: opacity 0.5s ease, transform 3s ease;
}
/* アクティブな状態 */
#about.active .animate-left {
opacity: 1;
transform: translateX(0); /* 左にアニメーションする初期位置をリセット */
}
この部分がスクロールするとactiveに変更されて、薄い色から濃い色に変わり左から移動します。
JavaScript
// scroll animation
// スクロールイベントを監視し、要素がビューポート内にあるかどうかを判定
window.addEventListener("scroll", function () {
handleScroll();
});
// 初回のみアクティブクラスを追加するフラグ
var isFirstScroll = true;
function handleScroll() {
var aboutSection = document.getElementById("about");
// ビューポート内にある場合、アクティブクラスを追加
if (isInViewport(aboutSection)) {
aboutSection.classList.add("active");
// 初回フラグが true の場合、オフにする
if (isFirstScroll) {
isFirstScroll = false;
}
} else {
// ビューポート外の場合かつ初回フラグが false の場合、アクティブクラスを削除しない
if (!isFirstScroll) {
aboutSection.classList.remove("active");
}
}
}
// 指定された要素がビューポート内にあるかどうかを判定する関数
function isInViewport(element) {
var rect = element.getBoundingClientRect();
var windowHeight =
window.innerHeight || document.documentElement.clientHeight;
// ビューポートの上端より下にあり、かつビューポートの下端より上にある場合
return rect.top <= windowHeight && rect.bottom >= 0;
}
スクロールして、画面上にAboutセクションが表示されたらCSSのactiveを取得するってことです。
初期状態はCSSはactiveではなく、スクロールしてビューポート内に入ればactiveに変わりfalseに変更。ビューポートから外れたらfalseのままなのでactiveが持続されます。
handleScroll
関数内で、aboutSection
は指定されたID (“about”) を持つ要素を取得します。
isInViewport
関数は、指定された要素がビューポート内にあるかどうかを判定します。これは、要素の上端がビューポートの下端より上にあり、かつ要素の下端がビューポートの上端より下にある場合に true
を返します。
isFirstScroll
フラグは初回のスクロールを示すためのフラグで、初回のスクロールの場合にのみ active
クラスを追加します。その後はこのフラグがオフになり、ビューポート外に移動しても active
クラスを削除しません。
スクロールイベントが発生するたびに handleScroll
関数が呼び出され、その結果として active
クラスの追加や削除が行われます。
このコードの目的は、スクロールに応じて指定されたセクションがビューポート内にある場合に active
クラスを追加し、初回のスクロールであるかどうかによってその挙動を変更することです。
まとめ
WEBサイトに動きをつけるアニメーションはCSSだけでも実装可能です。
でも、JavaScriptを使うことでスクロールした時や、消えるときなどもっと複雑なことができます。
より高度な動きを再現するには欠かせない技術になりますので、ゆっくりと学んできましょう!