素のJavaScriptだけでページのトップへ戻るボタン(jQueryなし)

こんにちは。

今回はjQueryを使わずに、JavaScriptだけでページの一番上に戻るボタンを実装します。

ページ内リンクのようにパッと戻るのではなく、スルスルと滑らかにスクロールさせます。

正直スクロールの操作はjQuery結構便利ですが、読み込み時間がかかるので使いたくないですね。

ということで素のJavaScriptで実装します。

コード

HTML

  <div class="marker">上</div>
  <div class="spacer"></div>
  <div class="marker">下</div>
  <button id="js-button">Topへ戻る</button>

ボタンはbutton要素でマークアップします。

CSS

  #js-button {
    position: fixed;
    bottom: 20px;
    right: 20px;
    padding: 10px 15px;
    background: #333;
    color: #fff;
    border: none;
    border-radius: 4px;
    cursor: pointer;
  }
  .marker {
    font-size: 24px;
    text-align: center;
    padding: 50px 0;
  }
  .spacer {
    height: 2000px;
  }

右下にボタンを配置します。spacerで空間を2000px空けています。

JavaScript

  scrollTop('js-button', 500);

  function scrollTop(elem, duration) {
    let target = document.getElementById(elem);
    target.addEventListener('click', function () {
      let currentY = window.pageYOffset;
      let step = duration / currentY > 1 ? 10 : 100;
      let timeStep = duration / currentY * step;
      let intervalID = setInterval(scrollUp, timeStep);

      function scrollUp() {
        currentY = window.pageYOffset;
        if (currentY === 0) {
          clearInterval(intervalID);
        } else {
          scrollBy(0, -step);
        }
      }
    });
  }

JavaScriptの解説

scrollTop('js-button', 500);

第一引数にはid名を指定。第二引数はTOPに到達するまでの時間。500msなので0.5秒でTOPに到達します。

let currentY = window.pageYOffset;

まずは、現在のスクロール量を取得します。

let step = duration/currentY > 1 ? 10 : 100;

変数stepは一回スクロールする量です。時間に対して距離が短い場合は10pxずつスクロールさせます。
距離が長い場合は100pxずつスクロールさせます。

1pxずつスクロールさせると諸事情によりうまく動作しないので、10pxとか100pxずつスクロールさせます。

let timeStep = duration/currentY * step;

変数timeStepには、何秒に一回スクロールするかを代入しています。

これでjQueryなしで実装できますが、easingの設定はできません。一定の速度でスクロールされる感じです。

トップに戻る動きにeasingは必要ないでしょう。

ページトップに戻るボタンの実装方法はいくつかあるので、色々試してみて下さい。