スクロールを邪魔する「スクロールスナップ」のデモコード(CSS)

  いったん下にスクロールすると、上に戻りにくくなる、戻ろうとすると押し返されるバグを見かけたので、どのようなコードで実現できるか Gemini と相談してデモ用のコードを作った。

 スクロールスナップで実現できるようで、 最近ではcssで実現するらしい。JavaScriptを使ったデモのコードは前回書いた。

スクロールを邪魔する「スクロールスナップ」のデモコード(JavaScript)
https://html-memo-hitorinezumi.blogspot.com/2025/12/scrollLockDemo.html

 ここでは、CSSを使った単純なコードを残しておく。JavaScriptを使ったデモと比べて吸着力が弱いが、スムーズにスクロールできないので鬱陶しくはある。

 scrollLockDemoCSS.html

 <!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSS Scroll Snapによるセクション吸着</title>
    <style>
        /* ページ全体のリセット */
        body { margin: 0; padding: 0; font-family: Arial, sans-serif; }

        /* -------------------------------------- */
        /* メインのスクロールコンテナ (親要素) */
        /* -------------------------------------- */
        .scroll-container { 
            height: 100vh; 
            width: 100vw; 
            overflow-y: scroll; 
            
            /* 【重要 1】スクロール吸着を有効にする */
            scroll-snap-type: y mandatory; /* y軸方向、必須のスナップ */
            
            /* スクロールを滑らかにする(強制ジャンプではなく吸着アニメーション) */
            scroll-behavior: smooth; 
        }
        
        /* -------------------------------------- */
        /* ブロック(子要素) */
        /* -------------------------------------- */
        .section {
            width: 50%;
            margin-left: 25%;
            display: flex; flex-direction: column; justify-content: center; align-items: center;
            text-align: center; font-size: 1.5em; padding: 20px; box-sizing: border-box;
            border-bottom: 5px dashed #ccc;

            /* 【重要 2】吸着位置を指定する */
            scroll-snap-align: start; /* 要素の開始位置(トップ)に吸着させる */
        }

        /* 高さの設定(不均一) */
        #section1 { height: 50vh; background-color: #ffe0e0; }
        #section2 { height: 60vh; background-color: #e0f0ff; }
        #section3 { height: 50vh; background-color: #e0ffe0; }
        #section4 { height: 80vh; background-color: #ffffe0; }
        
        h1 { font-size: 2em; margin-bottom: 0.5em; }
    </style>
</head>
<body>

    <div class="scroll-container" id="scrollContainer">
        
        <section class="section" id="section1"><h1>セクション 1:50vh 【吸着】</h1></section>
        <section class="section" id="section2"><h1>セクション 2:60vh 【吸着】</h1></section>
        <section class="section" id="section3"><h1>セクション 3:50vh 【吸着】</h1></section>
        <section class="section" id="section4"><h1>セクション 4:80vh 【吸着】</h1></section>

    </div>

    </body>
</html>

コメント