時給単価UP【3大特典付き】
コーディングテクニック集100選⋙

【CSS・jQuery】ページ内リンクのスムーススクロール作り方【コピペOK】

記事内に広告を含みます

パソ君
パソ君

・ページ内リンクをスムーススクロールさせるにはどう実装するの?

こんな疑問にお答えします。

スムーススクロールとは、ページ内リンクをクリックした時に、スムーズにススーッと動くやつです。

いきなりリンク先に飛ぶよりかは、見ため的に良いかと。

こんな感じのやつですね↓

これ実は簡単に実装できちゃいます。

ジト
ジト

すぐにできるよ!

ということで、この記事では「ページ内リンクのスムーススクロール作り方」について解説していきます!

この記事でわかること

・ページ内リンクのスムーススクロール作り方【jQuery】
・ページ内リンクのスムーススクロール作り方【CSS】

【jQuery】ページ内リンクのスムーススクロール作り方【コピペOK】

まずjQueryを利用したスムーススクロールの紹介をしていきます。

サンプルを作りましたのでご覧ください!

See the Pen ➀スムーススクロール by jito-coder (@jito-coder) on CodePen.

<!-- ヘッダー -->
<header class="l-header">
    <nav>
        <ul>
            <li><a href="#about">about</a></li>
            <li><a href="#news">news</a></li>
            <li><a href="#works">works</a></li>
            <li><a href="#company">company</a></li>
            <li><a href="#contact">contact</a></li>
        </ul>
    </nav>
</header>

<!-- セクション部分 -->
<main class="main">
    <section class="test01" id="about">about</section>
    <section class="test02" id="news">news</section>
    <section class="test03" id="works">works</section>
    <section class="test04" id="company">company</section>
    <section class="test05" id="contact">contact</section>
</main>
$(function(){
    $('a[href^="#"]').click(function(){
        var speed = 500; 
        var href= $(this).attr("href");
        var target = $(href == "#" || href == "" ? 'html' : href);
        var position = target.offset().top;
        $('body,html').animate({scrollTop:position}, speed, 'swing');
        return false;
    });
});

内部リンクをクリックしたら、良い感じにススーと動きますよね!

このコードの中で重要な点がこちら↓

  1. 内部リンク先とid部分を一致させる
  2. 内部リンク先に対してのスクロール方法を記述

順に見てきましょう!

➀:内部リンク先とid部分を一致させる

内部リンク先に飛ぶために、リンク先とid部分を一致させましょう。これはスムーススクロールじゃなくても、内部リンクでは必要な部分ですね。

下記のように「#about」の内部リンク先に対して、「id=”about」というように一致するようにします。

<!-- 内部リンク -->
<ul>
    <li><a href="#about">about</a></li>
    <li><a href="#news">news</a></li>
    <li><a href="#works">works</a></li>
    <li><a href="#company">company</a></li>
    <li><a href="#contact">contact</a></li>
</ul>

<!-- 内部リンク先 -->
<section class="test01" id="about"></section>
<section class="test02" id="news"></section>
<section class="test03" id="works"></section>
<section class="test04" id="company"></section>
<section class="test05" id="contact"></section>

内部リンク先に対してのスクロール方法を記述

あとはjQueryにてスムーススクロールさせるような設定を記述すれば実装可能。

やり方は下記コードですね。

$(function(){
    $('a[href^="#"]').click(function(){
        var speed = 500; 
        var href= $(this).attr("href");
        var target = $(href == "#" || href == "" ? 'html' : href);
        var position = target.offset().top;
        $('body,html').animate({scrollTop:position}, speed, 'swing');
        return false;
    });
});

初めて見た人からしたら、わけがわかないかと思います。。(僕もそうだった)

ただ理解すれば結構簡単です。

このコードをめちゃくちゃ簡単に説明すると
「クリックしたhref属性の、#の値と位置を変数に入れて、その位置までswingスピードで0.5秒かけて移動する」
という意味。

細かい点の意味は、下記の説明らをどうぞ↓

クリックイベント発動

$('a[href^="#"]').click

href属性に「#」がついてるaタグをクリックした時に、という意味。

変数に入れる

var speed = 500; 
var href= $(this).attr("href");
var target = $(href == "#" || href == "" ? 'html' : href);
var position = target.offset().top;
  • speed = 500ミリ秒(0.5秒)
  • href  =クリックしたhref属性の中身を取得(#部分を取得)
  • target =hrefの値が「#」or「空白」ならhtmlが代入。それ以外ならhrefの値が代入。
  • position=ドキュメント左上の位置からtarget値までの距離

アニメーションの指定

$('body,html').animate({scrollTop:position}, speed, 'swing');

「body,html」全体に対して、変数positionの値まで、「swing」の設定スピードでリンク先に移動する。という意味

ジト
ジト

bodyとhtml両方設定する理由は、
ブラウザによってどちらかが対応していないため!

処理を中断

return false;

要はイベントを止めるという意味。

今回のコード例では、この中断作業によりURL部分にidタグが入らないようになります。

【jQuery】ページ内リンクのスムーススクロール作り方【header分位置をずらす】

スムーススクロールするときに、位置を少しずらす方法を紹介します。

例えばですがheaderが固定されている場合、その固定された縦幅分を引いた位置にリンク移動したいですよね。

その場合のサンプルがこちら↓

See the Pen ➀スムーススクロール by jito-coder (@jito-coder) on CodePen.

固定されているheaderの縦幅分を引いた位置に、スムーススクロールされているのが分かるかと思います!

変えた点はheader位置を変数に入れただけ

$(function(){
    $('a[href^="#"]').click(function(){
        var headerH = $('.l-header').innerHeight();
        var speed = 500; 
        var href= $(this).attr("href");
        var target = $(href == "#" || href == "" ? 'html' : href);
        var position = target.offset().top - headerH;
        $('body,html').animate({scrollTop:position}, speed, 'swing');
        return false;
    });
});

「headerH」という変数に、ヘッダーの縦幅数値を代入しています。

そして移動先のリンクの位置を、その変数分マイナス。

これだけで固定headerの縦幅分ずらして、スムーススクロールする実装ができますよ。

【CSS】ページ内リンクのスムーススクロール作り方【コピペOK】

最後にjQueryを使わずに、CSSのみでスムーススクロールを作る方法を紹介します。

実はたった1行で実装可能なんですよね。とはいえ注意点もあるのが事実。。

そんなサンプルがこちら↓

See the Pen ➁スムーススクロール by jito-coder (@jito-coder) on CodePen.

ススーと内部リンク先まで移動していますよね!CSSのみです!

たった1行追加するだけ

html {
	scroll-behavior: smooth;
}

上記のコードを追加するだけで、スムーススクロールが実装可能です。

スクロール位置をずらすには・・

jQueryの時も紹介しましたが、headerが固定されている場合、スクロール位置をずらしたいですよね。
そんな時もCSSではたった1行で実装可能。

それがこちらのコード↓

html {
    scroll-padding-top: 50px;
}

scroll-padding-topを使えば、スクロール位置をずらすことができます。

CSSのみのスムーススクロール注意点

たった1行で実装可能なので楽ですが、CSSのみでスムーススクロールを実装するのは注意点が多くあります。

それが下記↓

  • URLにid名がつく
  • スクロールスピードの調整ができない
  • safariの古いバージョンだと対応してない
  • 全ページ内リンクがスムーススクロールになる

色々と不備な点もあるので、どちらかというとjQueryにて実装するのが僕的にはオススメですね。

jQueryは使いたくない、楽に実装したい、特に細かい調整はいらない、という人は「scroll-behavior」で実装してみてはいかがでしょうか。

【CSS・jQuery】ページ内リンクのスムーススクロール作り方【コピペOK】:まとめ

  • 内部リンク先とid部分を一致させる
  • 内部リンク先に対してのスクロール方法を記述
  • 位置をずらしたい場合、header位置を変数に代入して引く
  • 「scroll-behavior」を使えば、CSSのみでスムーススクロール可能
  • 「scroll-padding-top」を使えば、CSSのみでスクロール位置ずらせる
ジト
ジト

スムーススクロールはよく使うので覚えておこう!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA