OSSANS Project since 2020

「もし四十のおっさんがプログラミングを始めたらどう人生変わるのか」
このブログのメインテーマです
肩肘張らずにユルく、ときたま厳しくやっていきます
※プログラミング以外のことも書きます

JavaScript

2022.11.19(更新)

「一瞬でトップへ戻るボタン」を実装する方法【jQuery不要】

アイキャッチ画像
JavaScript

「トップへ戻る」ボタンってほとんどのWebページについてるよね?あれを作りたいです。

今回はこんな要望に答えていきます。

本記事の内容

  • 「トップへ戻る」ボタンを作る方法

本記事を対象とする方

  • フロントエンドエンジニアを目指す方
  • Webデザイナーを目指す方

この記事を書いている僕はプログラミング歴2年5ヶ月です。webエンジニアとして”社内転職”に成功しました。

「トップへ戻る」ボタンはなぜ必要なのか?

「トップへ戻るボタン」はなぜ必要なのか考えてみましょう。

近年はどんなWebページでも、スマホ対応していないものはありません。スマホのスクリーンは基本縦長なので、Webページも縦長を意識することになります。スクロールせずにスマホのスクリーンサイズだけで、コンテンツを詰め込めるなら話は別ですが、そんなページは皆無と言っていいでしょう。

マホは縦長
※縦長なので自然とスクロール量も増える

コンテンツが多ければ多いほど、ページが縦長になり、スクロール量も増えていきます。コンテンツを見終わって、ページの一番下までスクロールした時に、ページのトップからもう一度見たいと思ったらまたスクロールして戻らなければなりません。それは正直ちょいダルいです。そのダルさを回避するために「トップまで戻る」ボタンが必要なのです。また、ボタンを設置することでUXの向上を図ることができ、結果的にSEO効果にも良い影響を与えます。

実装方法

「トップへ戻る」ボタンの必要性がわかったところで、実装方法を説明していきます。

実装するにはJavaScriptの知識が必要です。方法はいくつかあると思いますが、今回はjQueryは使用せず、生のJavaScriptのみで実装していく方法を紹介していきます。ざっと内容は下記の通りです。

  • 「トップへ戻る」ボタンクリック
  • クリックされた時点の垂直スクロール量を取得
  • 取得した垂直スクロール量から一定数を引いていくタイマーを発動
  • 引いていった数が0になったらタイマーを止める

全体のコードは以下のようになります。

  1. const html = document.querySelector('html');
  2. const page_top = document.getElementById('page-top');
  3. page_top.addEventListener('click', () => {
  4.   let i = html.scrollTop;
  5.   function scrollToTop() {
  6.     const timeoutId = setTimeout(scrollToTop, 1);
  7.     window.scrollTo(0, i -= 200);
  8.     if (i < 0) {
  9.       clearTimeout(timeoutId);
  10.     }
  11.   }
  12.   scrollToTop();
  13. });

では、一つずつ解説していきます。

  1. const html = document.querySelector('html');
  2. const page_top = document.getElementById('page-top');

まず、html要素と、page-topという”id”を振ったbutton要素を取得します。

  1. page_top.addEventListener('click', () => {
  2.   let i = html.scrollTop;

ボタンがクリックされたら、垂直にスクロールされた量を取得します。垂直にスクロールされた量とは、ユーザーがコンテンツを見終わるまでのスクロール量です。そのスクロール量を取得するにはhtml.scrollTopを使いますが、これはwindow.scrollYと同じです。取得したスクロール量はのちに使用するので変数に入れおきます。今回、変数名はiにしてますが、わかりやすければどんな名前でも構いません。

ページの高さとスクロール量
※ページの高さとスクロール量
  1. function scrollToTop() {
  2.   const timeoutId = setTimeout(scrollToTop, 1);
  3.   html.scrollTo(0, i -= 200);
  4.   if (i < 0) {
  5.     clearTimeout(timeoutId);
  6.   }
  7. }
  8. scrollToTop();

続いて今回のメイン部分の紹介になります。scrollToTop()は自作関数です。setTimeoutメソッドを使って、scrollToTopを1ミリ秒毎に繰り返すようにしています。

setTimeoutメソッドは、一定時間毎に指定されたコードを繰り返し実行するタイマーです。第一引数に実行したい処理コード(関数)、第二引数に秒数を設定します。

例えば、以下の場合は1ミリ秒毎にHello,World!をコンソールに表示するタイマーとなります。

  1. function helloWorld () {
  2.   setTimeout(helloWorld,100);
  3.   console.log("Hello,World!")
  4. }
  5. helloWorld();

話を戻します。scrollToTop()で一番やりたいことはhtml.scrollTo(0, i -= 200)の部分です。scrollToメソッドは指定した要素内で、実装者が任意に決めた座標位置までスクロールをさせる時に使います。第一引数はX座標、第二引数はY座標を指定します。今回はhtml要素内で垂直スクロールのみさせたいので、html.scrollTo()とし、X座標には0、Y座標には動かしたいスクロール量を入れます。ちなみにhtml.scrollToは、window.scrollToと同じですのでどちらでも構いません。

i-=200は、変数iから200を引く演算子です。変数iってなんだったでしょう?そうです、垂直にスクロールされた量、つまりユーザーがコンテンツを見終わるまでのスクロール量でしたね。その数字から200を引くということは、ページトップに向かって200ピクセルスクロールさせることを意味します。その処理をsetTimeoutメソッドで、1ミリ秒毎に繰り返すことで、段々とページトップまで自動的にスクロールさせるようにしているのです。

Point

今回は1ミリ秒毎に、200ピクセル上へスクロールさせるとしていますが、秒数とスクロール量を変更することでスクロールのスピードを変えることができます

setTimeoutメソッドで上へスクロールさせる
※setTimeoutメソッドで上へスクロールさせる

さて、段々とページトップまでスクロールする処理が設定できました。setTimeoutメソッドは、どこかでタイマーを止めないと永遠にコードを実行してしまいます。そこで使用するのが、clearTimeoutメソッドです。

clearTimeoutメソッドの引数にはtimeoutIDと言う変数を指定します。変数名はなんでも良いのでtimeoutIDじゃなくても構いません。その変数には繰り返し実行させていたsetTimeoutメソッドを入れます。const timeoutId = setTimeout(scrollToTop, 1);の部分ですね。これでタイマーを止める準備が出来ました。あとは、ページトップまで戻ったらclearTimeoutを実行すると書いてあげればOKです。

  1. if (i < 0) {
  2.   clearTimeout(timeoutId);
  3. }

変数iが0以下になるということはページがトップまで戻ってくることを意味するので、そうなったらclearTimeoutを実行してあげます。これでsetTimeoutメソッドのタイマーを止めることができます。

clearTimeoutでタイマーを止める
※一番上まで戻ったらclearTimeoutでタイマーを止める

今回のまとめ

今回は「トップへ戻るボタン」を実装する方法について紹介しました。最後まで読んで頂きありがとうございました。

なぜ「トップへ戻るボタン」が必要か理解する

setTimeout、scrollTo、clearTimeout、それぞれのメソッドが何を意味するのか理解する

関連記事

  • JavaScript
    ブログアイキャッチ画像
    JavaScript
    2023.03.04(更新)

    【実例コードあり】覚えておきたいパララックスデザインの3つの基本

  • JavaScript
    ブログアイキャッチ画像
    JavaScript

    【ユーザー離脱阻止!】画面遷移アニメーション実装時の注意点

  • JavaScript
    ブログアイキャッチ画像
    JavaScript

    【図解あり】JavaScript / 要素の高さや位置の取得まとめ

  • JavaScript
    ブログアイキャッチ画像
    JavaScript
    2023.02.02(更新)

    【CSSとJavaScriptのみ】ページ内リンクでスムーススクロールさせる方法

  • JavaScript
    ブログアイキャッチ画像
    JavaScript
    2023.02.21(更新)

    【お手軽だった!】画像クリックで拡大画像をポップアップ表示する方法

  • JavaScript
    ブログアイキャッチ画像
    JavaScript
    2022.11.25(更新)

    【5分で完了!】webデザインにおけるスマホファーストビュー高さ設定方法

CATEGORY カテゴリー別最新記事

  • CSS
    アイキャッチ画像
    CSS

    【CSS】margin?position?要素の中央寄せで使うプロパティとは?

  • Docker
    アイキャッチ画像
    Docker
    2022.10.03(更新)

    【簡単設定!】DockerでWordPressをローカル開発する方法

  • HTML
    アイキャッチ画像
    HTML
    2023.02.18(更新)

    【図解あり】aタグの入れ子ルールとHTMLの入れ子ルールを覚える方法

  • JavaScript
    アイキャッチ画像
    JavaScript
    2023.03.04(更新)

    【実例コードあり】覚えておきたいパララックスデザインの3つの基本

  • Python
    アイキャッチ画像
    Python
    2023.02.09(更新)

    【やらなきゃ損!】2日でできるPythonのExcelコピペ自動化!

  • Study
    アイキャッチ画像
    Study
    2023.02.16(更新)

    稼ぐために始めたプログラミングのこれまでの振り返り。勉強方法や役立った本も紹介。

  • web site
    アイキャッチ画像
    web site
    2022.11.26(更新)

    ページ表示速度アップ!npmでソースファイルを軽量化する方法【サクッと簡単!】

  • WordPress
    アイキャッチ画像
    WordPress
    2022.10.26(更新)

    【コピペ可】WordPressサイトをPWA化するためにService Workerを実装してみた。