【Amazon】人気の商品が日替わりで登場!
毎日お得なタイムセール!商品をみる

【CSSのみ!】ページ内をゆっくりスクロールする方法

本記事では、JavaScriptを使わずにHTMLとCSSのみでリンクをクリックするとページ内をゆっくりスクロールする(スムーススクロール)の作り方について解説しています。

HTML/CSSの学習におすすめ書籍
1冊ですべて身につくHTML&CSSとWebデザイン入門講座
総合評価
( 5 )
メリット
  • HTMLとCSSの基本が体系的に学べる
  • Webデザインの基本が学べる
  • 1つのWebサイトを作りながら学べる
先輩くん

Amazon Kindle Unlimitedに登録すると、月額980円で読み放題だからオススメだよ!

後輩ちゃん

初回30日間は無料だから、まだ登録したことのない人はぜひ試してみてね!

全プログラマー必見!
変数名/関数名にもう悩まない!
リーダブルコード
総合評価
( 5 )
メリット
  • 美しいコードが書けるが自然と書けるようになる
  • 他の開発者が理解しやすいコードになる
著:Dustin Boswell, 著:Trevor Foucher, 解説:須藤 功平, 翻訳:角 征典
¥2,640 (2023/07/23 02:48時点 | Amazon調べ)
目次

サンプルコード

以降の解説では、下記のサンプルコードを使用します。このサンプルコードは、装飾のみを実装したものでスムーススクロールの実装はしていません。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <link rel="stylesheet" href="style.css" />
  </head>
  <body>
    <header>
      <ul>
        <li><a href="#section1">Section1</a></li>
        <li><a href="#section2">Section2</a></li>
        <li><a href="#section3">Section3</a></li>
      </ul>
    </header>
    <main>
      <section id="section1"><h2>セクション1</h2></section>
      <section id="section2"><h2>セクション2</h2></section>
      <section id="section3"><h2>セクション3</h2></section>
    </main>
  </body>
</html>
header {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100px;
  background-color: gray;
  color: #fff;
  ul {
    height: 100%;
    display: flex;
    align-items: center;
    gap: 20px;
    padding-left: 20px;
  }
}

section {
  height: 100vh;
}

#section1 {
  margin-top: 100px;
  background-color: aqua;
}

#section2 {
  background-color: burlywood;
}

#section3 {
  background-color: cadetblue;
}

上記のコードはSCSSになります。CSSでコーディングしている方は下記のコードをお使いください。

header {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100px;
  background-color: gray;
  color: #fff;
}

header ul {
  height: 100%;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  gap: 20px;
  padding-left: 20px;
}

section {
  height: 100vh;
}

#section1 {
  margin-top: 100px;
  background-color: aqua;
}

#section2 {
  background-color: burlywood;
}

#section3 {
  background-color: cadetblue;
}

サンプルコードがどのような状態か確認してみます。headerタグの「section3」リンクをクリックすると以下のような状態になります。

サンプルコードの状態

一瞬で#section3に移動するのに加え、headerの高さでセクション内のテキストが隠れてしまっていることが分かります。

これを以降の解説で修正していきましょう。

スムーススクロールを実装する

まず始めに、headerのリンクをクリックした時にゆっくりスクロールするスムーススクロールを実装します。

実装方法はとても簡単で、htmlタグに対し「scroll-behavior: smooth」を設定するだけです。

html {
  scroll-behavior: smooth;
}

これだけで、headerのリンクをクリックした時にスムーススクロールがされるようになります。

headerの高さを考慮する

scroll-behavior: smoothを設定しただけでは、headerの高さで隠れているテキストは表示されません。この問題を解決するには:targetの疑似クラスに対して「scroll-margin-top: 100px」を指定する必要があります。

:target {
  scroll-margin-top: 100px;
}

100pxという値は今回使用しているサンプルコードのheaderの高さになります。この値は各々で調整してください。

これで、headerのリンクをクリックした時にheaderの高さが考慮されセクション内のテキストが表示されるようになります。

ブログランキング・にほんブログ村へ PVアクセスランキング にほんブログ村 FC2 Blog Ranking

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次