「jQuery」を使用してページトップへ戻るボタンを制御する

前回は基本編として、ページトップへ戻るボタンをHTMLCSSで設置する手順をお伝えしましたが、今回は、ボタンの表示やスクロールスピードの制御を、jQueryで行う実用的な方法をご紹介します。

HTML・CSSのコーディング

ページトップへ戻るボタンのHTMLのマークアップと、CSSスタイリングを確認しましょう。

ボタン部分のHTMLは今回は、ボタン要素<button>で作成します。(div要素などでも問題ないです。)

<button id="topButton">Page Top</button>

ボタンを記述する場所としては、body要素の直下であればどこでもいいですが、footer要素の終わりからbody要素終了までの間に設置するといいと思います。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ページタイトル</title>
</head>
<body>
    <header>
        ヘッダー要素
    </header>
    <main>
        メインコンテンツ
    </main>
    <footer>
        フッター要素
    </footer>

    <!-- ページトップへ戻るボタン -->
    <button id="topButton">トップへ</button>
    
</body>
</html>

CSSでボタンのスタイリングを行います。position : fixed; でスクロールしても位置が変わらないように固定して、ページの右下あたりに配置するのが定番です。また、初めは非表示にしておくので、display : none; を指定しておきます。

今回は、この記事のアイキャッチ画像にあるボタンのデザインを、CSSのみで作成したいと思います。

三角矢印部分は、疑似要素を使います。border-colorを2辺だけ表示させて、マイナスに45度回転させることで表現しています。

/* ボタン本体 */
#topButton {
  display: none;
  position: fixed;
  bottom: 30px;
  right: 30px;
  width: 70px;
  height: 70px;
  border: none;
  border-radius: 50%;
  background-color: #fff;
  color: #CE5D8B;
  text-decoration: none;
  cursor: pointer;
}

/* 上三角矢印を疑似要素で作成 */
#topButton::before {
  content: "";
  position: absolute;
  left: 50%;
  top: 50%;
  margin-left: -12.7px;
  margin-top: -12.7px;
  width: 18px;
  height: 18px;
  border: 4px solid;
  border-color: #CE5D8B #CE5D8B transparent transparent;
  transform: rotate(-45deg);
}

/* マウスオンしたら少し透明に  */
#topButton:hover {
  opacity: 0.75;
}

/* ボタン内の文字のスタイル */
#topButton span {
  display: block;
  font-size: 12px;
  margin-top: 22px;
}

jQueryで動きを制御する

ページトップへ戻るボタンで求められる動きの部分は、大きく分けて次の2点が考えられます。

  1. 初めは非表示で、ページをある程度スクロールしたら表示される。(表示の制御)
  2. 滑らかなスクロールで、ページトップへ移動する。(スムーススクロールの制御)

表示の制御

初めは非表示で、ページをある程度スクロールしたら表示されるように、Javascriptで設定していきましょう。今回は、Javascriptのライブラリ「jQuery」を使用して記述していきます。

ピュアなJavascriptではなく、jQueryを使用する理由としては、記述がシンプルになるということが大きいですが、後で設定するスムーススクロールの制御の部分が関係してきます。

まずは、表示のコントロールを設定していきましょう。

jQueryの使用準備

jQueryを使用するためには、HTMLのhead部分に、コードファイルを読み込んでおく必要があります。設定方法について詳しくは、こちらの記事で紹介しています。

さらに今回は、jquery-easingプラグインを使用して、スクロールの細かな動きを付けたいと思いますので、こちらもCDNで読み込ましておきます。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ページタイトル</title>

  <!--jQueryの読込-->
    <script src="https://code.jquery.com/jquery-3.7.0.min.js" 
    integrity="sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g=" crossorigin="anonymous"></script>
   
   <!--jQuery easingプラグインの読込-->
   <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.4.1/jquery.easing.min.js"></script>

   <!--作成するjavascriptファイルはプログラムファイルの後に記述する-->
   <script src="js/pagetop.js"></script>

</head>
<body>
    <header id="top">
        ヘッダー要素
    </header>
    <main>
        メインコンテンツ
    </main>
    <footer>
        フッター要素
    </footer>

    <!-- ページトップへ戻るボタン -->
    <a href="#top" id="topButton">トップへ</a>
    
</body>
</html>

Javascriptの記述

それでは、jQueryで設定していきましょう。

//表示の制御
   $(window).scroll(function () {
    if ($(this).scrollTop() > 200) {
      $('#topButton').fadeIn(300);
    } else {
      $('#topButton').fadeOut(300);
    }
  });

2行目:画面をスクロールしたら実行させたいので、$(window).scroll() でスクロールイベントを使用します。

3行目:.sctollTop()で指定要素のスクロールの縦の位置を取得。今回はwindowの上部の位置となります。if文で条件分岐、200px以上のスクロール量以上なら、

4行目:ページトップへ戻るボタンを .fadeIn() フェイドイン表示させます。()の中の数字は、アニメーションさせる時間でミリ秒単位となります。

5、6行目:それ以外の条件ということなので、スクロール位置が上から200px以下なら、ページトップへ戻るボタンを .fadeOut() フェイドアウト表示。こちらも同様に()内はアニメーション時間です。

スムーススクロールの制御

次に、スクロールアニメーションの動きを設定していきます。

jQueryを使用した理由のひとつとして、スクロールの細かな制御が行えるという点があります。ピュアなJavascriptや、CSSのscroll-behaviorでもスムーススクロールを設定することはできますが、スクロールする時間や、イージングの設定が簡単にできません。jQueryの.animate() メソッドで比較的容易に行えます。

  //スクロールの制御
  $('#topButton').click(function () {
    $('html, body').animate({
      scrollTop: 0
    }, 300,'easeOutQuart');
  });
 

2行目:ページトップへ戻るボタンをクリックした時にスクロールさせたいので、.click() クリックイベントを使用します。

3~5行目:一番大きな親要素のスクロールの縦位置をゼロ とするアニメーションを行うことで、ページトップへ戻るスムーススクロールを実現させています。アニメーションの指定は、.animete() のアニメイトメソッドで、()の中は、(アニメーションさせるプロパティ、duration、easing、関数)となります。

duration:アニメーション時間は300ミリ秒、easing:イージングは、jquery-easingプラグインを使用してeaseOutQuartを付けてみました。

ちなみに、アニメーションさせる要素が 、html,bodyの2つ指定されている意味は、webkitが使えるブラウザとそうでないブラウザによって.animate()が効く要素が変わるからです。webkit … body要素、webkit以外 … html要素となるので、両方指定しているということになります。

コードサンプル

全体をまとめると次のようになります。イージングの動きや、表示するポジションなどサイトのイメージに合わせていろいろと調整してみてください。

See the Pen Untitled by web-basic-archive (@web-basic-archive) on CodePen.

ページトップへ戻るボタンの実装は他にも、ボタンをリンク要素<a>で作成する場合でも可能ですが、こちらは、スムーススクロールをページ以外にジャンプする場合に、少し複雑な設定が必要となりますので、次の機会にご紹介したいと思います。

参考にしたサイト

ページトップへ戻るボタンをjQueryで実装する方法【スムーススクロール】

【CSS】CSSのみで三角と矢印を作る方法 - bagelee(ベーグリー)

【jQuery入門】easingの使い方とPluginの活用方法まとめ!

jQuery Easing - jQuery 日本語リファレンス

jQueryで「このページの先頭に戻る」ボタンなどでanimateを使っている場合、callback関数が2回呼ばれる問題を回避する方法

Follow me!