こんにちは。
今回は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は必要ないでしょう。
ページトップに戻るボタンの実装方法はいくつかあるので、色々試してみて下さい。