以前にscroll-snapを使用する記事を投稿しましたが、scroll-snapを使ってスクロール毎にセクションの切り替わるページを実装してみます。
サンプルコード
HTMLは以下の通りです。
ヘッダーは追従する仕様で実装しますが、不要であれば外してください。
<header class="header">
<nav class="nav">
<ul>
<li><a href="#sectionA">セクションA</a></li>
<li><a href="#sectionB">セクションB</a></li>
<li><a href="#sectionC">セクションC</a></li>
<li><a href="#sectionD">セクションD</a></li>
</ul>
</nav>
</header>
<main class="contents">
<section id="sectionA" class="section">
<h1>セクションA</h1>
</section>
<section id="sectionB" class="section">
<h2>セクションB</h2>
</section>
<section id="sectionC" class="section">
<h2>セクションC</h2>
</section>
<section id="sectionD" class="section">
<h2>セクションD</h2>
</section>
</main>
次にCSSです。
.contentsにscroll-snap-type、その中の各セクションにscroll-snap-alignを設定します。
CSSは必要な部分のみの抜粋になるので、全体のCSSはデモページをご確認ください。
:root {
--header-height: 50px;
}
body {
overflow: hidden;
}
.header {
height: var(--header-height);
}
.contents {
height: calc(100dvh - var(--header-height));
overflow-y: scroll;
scroll-snap-type: y mandatory;
scroll-behavior: smooth;
}
.section {
scroll-snap-align: start;
scroll-snap-stop: always;
height: calc(100dvh - var(--header-height));
}
scroll-snap以外のポイントとしては、コンテンツやセクションの高さを100dvhからヘッダーの高さを除いた値を設定している点になります。
ページのスクロールをscroll-snapで制御するデモページ
コメントが承認されるまで時間がかかります。