概要
ページ内リンクに smooth scroll を実装する際の覚え書き。
jQUeryを使用する場合と、JavasScriptのみで実装する場合をそれぞれまとめています。
jQueryで実装
サンプル
index.html
<p><a href="#hoge">ページ内リンク</a></p>
index.js
$(function() {
let elms = document.querySelectorAll('.js-scroll');
elms.on('click',(e) => {
e.preventDefault();
let $target = $($(this).attr('href')); //ターゲットの要素取得
if ($target.length > 0) {
$('html, body').animate({
scrollTop: $target.offset().top
}, 500, 'swing');
}
})
})
JavaScriptのみで実装
サンプル
index.js
document.addEventListener('DOMContentLoaded', () => {
let elms = document.querySelectorAll('.js-scroll');
if (elms) {
elms.forEach((elm) => {
elm.addEventListener('click', (e) => {
e.preventDefault();
const target = document.querySelector(elm.getAttribute('href')); //ターゲットの要素取得
if (target) {
target.scrollIntoView({
behavior: "smooth",
});
}
})
})
}
})
scrollIntoView()
は、ターゲットとなる要素が見えるまで、親要素をスクロールさせるメソッドです。(オプション設定のsmooth
はIE非対応)
scrollIntoView: https://developer.mozilla.org/ja/docs/Web/API/Element/scrollIntoView
コメント
@6337cj
0
上記aタグ、
class='js-scroll'
の指定が抜けていませんか?また、
class='js-scroll'
が指定されている要素全てに対してループを回してclickイベントリスナを設定するより、windowにclickイベントリスナを設定してそこでクリックされたものがclass='js-scroll'
が指定された要素だったら以降の処理を行う、という処理にすればループする必要もなく記述が簡単になるかと思います。