【初心者向け】スクロールで画像が切り替わる!2カラムレイアウトの作り方

🎯この記事で学べること

✅ スクロールと連動して左側の画像が変わる2カラムレイアウトの作り方

JavaScriptのIntersectionObserver API を使ったスクロール監視

CSSのフェードインアニメーション を活用した滑らかな画像切り替え

レスポンシブ対応 でスマホでも綺麗に表示する方法

こんな方におすすめ!

フロントエンド初心者 で、簡単なアニメーションを実装したい

JavaScriptで動きのあるWebページ を作りたい

📌 完成イメージ

• ページが 2カラムレイアウト

スクロールすると、左側の画像がセクションごとに変わる

• フェードインで 滑らかに画像が切り替わる

レスポンシブ対応 でスマホでも最適化

 HTMLの基本構造

まずは、HTMLの基本構造を作成します。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>スクロールで画像が切り替わる2カラムレイアウト</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>

    <div class="container">
        <!-- 左側の画像エリア -->
        <div class="left-column">
            <img src="image1.jpg" class="left-image active" alt="画像1">
            <img src="image2.jpg" class="left-image" alt="画像2">
            <img src="image3.jpg" class="left-image" alt="画像3">
            <img src="image4.jpg" class="left-image" alt="画像4">
        </div>

        <!-- 右側のコンテンツエリア -->
        <div class="right-column">
            <section class="content-section" id="section1">
                <h2>セクション1</h2>
                <p>ここにセクション1の説明が入ります。</p>
            </section>
            <section class="content-section" id="section2">
                <h2>セクション2</h2>
                <p>ここにセクション2の説明が入ります。</p>
            </section>
            <section class="content-section" id="section3">
                <h2>セクション3</h2>
                <p>ここにセクション3の説明が入ります。</p>
            </section>
            <section class="content-section" id="section4">
                <h2>セクション4</h2>
                <p>ここにセクション4の説明が入ります。</p>
            </section>
        </div>
    </div>

    <script src="script.js"></script>
</body>
</html>

✅ ポイント

.left-column画像を4枚重ねて配置

.right-columnスクロールするコンテンツ を配置

✔ id を 各セクションに付与 してJavaScriptで識別しやすくする

 CSSのスタイリング

次に、2カラムレイアウトのCSS を作成します。

/* 全体のレイアウト */
.container {
    display: flex;
    width: 100%;
    height: 100vh;
}

/* 左側の画像エリア */
.left-column {
    position: sticky;
    top: 0;
    width: 50%;
    height: 100vh;
    overflow: hidden;
}

.left-image {
    position: absolute;
    width: 100%;
    height: 100%;
    object-fit: cover;
    opacity: 0;
    transition: opacity 1s ease-in-out;
}

.left-image.active {
    opacity: 1;
}

/* 右側のコンテンツエリア */
.right-column {
    width: 50%;
    padding: 50px;
    overflow-y: auto;
}

.content-section {
    height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    border-bottom: 1px solid #ccc;
}

/* モバイル対応 */
@media (max-width: 768px) {
    .container {
        flex-direction: column;
    }

    .left-column {
        width: 100%;
        height: 50vh;
        position: relative;
    }

    .right-column {
        width: 100%;
        height: auto;
    }

    .content-section {
        height: auto;
        padding: 50px 20px;
    }
}

ポイント

✔ .left-column を position: sticky で固定

✔ .left-image.active に opacity: 1 でフェードイン

レスポンシブ対応モバイル時は1カラム表示

JavaScriptでスクロール連動を実装

JavaScriptで、スクロール時に画像が切り替わる 処理を追加します。

document.addEventListener('DOMContentLoaded', function() {
    const sections = document.querySelectorAll('.content-section');
    const images = document.querySelectorAll('.left-image');
    let activeIndex = 0;

    const options = {
        root: null,
        threshold: 0.3
    };

    const observerCallback = (entries) => {
        entries.forEach(entry => {
            if (entry.isIntersecting) {
                const index = Array.from(sections).indexOf(entry.target);
                activeIndex = index;
                updateImages(activeIndex);
            }
        });
    };

    const observer = new IntersectionObserver(observerCallback, options);
    sections.forEach(section => observer.observe(section));

    function updateImages(index) {
        images.forEach((img, i) => {
            img.classList.toggle('active', i === index);
        });
    }
});

ポイント

✔ IntersectionObserver を使い スクロール監視

✔ updateImages() で 対応する画像の .active を更新

toggle() を使用し、コードを簡潔化

まとめ

今回は、スクロールに応じて画像が変わる2カラムレイアウト を作成しました。

JavaScriptのIntersectionObserver API を活用

CSSのopacityとtransitionでフェードイン を実装

スマホ対応も考慮 したレスポンシブデザイン

(Visited 3 times, 3 visits today)