はじめに
ページ内でのスクロールをスムーススクロールで実装したい。
その際に、jQueryを使って実装するのも方法ですが、使わなくてもそんなに複雑な記述なしで簡単に実装することが可能です。
以下より、その方法について解説していきたいと思います。
最初にコードの確認
<nav id="pageAnker">
<a href="#anker1"></a>
<a href="#anker2"></a>
<a href="#anker3"></a>
<a href="#anker4"></a>
<a href="#anker5"></a>
</nav>
const pageAnkers = document.querySelectorAll("#pageAnker a");
pageAnkers.forEach(pageAnker => {
pageAnker.addEventListener("click", e => {
e.preventDefault();
const ankerId = e.target.hash;
const ankerTarget = document.querySelector(ankerId);
ankerTarget.scrollIntoView({ behavior: "smooth" });
});
});
スムーススクロールの記述は、これだけです。
次項より、各記述部分を解説していきます。
最初にページ内のアンカーを取得
const pageAnkers = document.querySelectorAll("#pageAnker a");
- ここでは仮に、
<nav>
タグ内のアンカーをdocument.querySelectorAll("#pageAnker a")
ですべて取得します。
取得したアンカーはすべて、定義した定数pageAnkers
に格納されます。
取得したアンカーにそれぞれクリックイベントを追加する
pageAnkers.forEach(pageAnker => {
pageAnker.addEventListener("click", e => {
〜〜〜〜〜中略〜〜〜〜〜
});
});
取得したアンカー
pageAnkers
にそれぞれアクセスして処理するためには、forEach
を使います。
個別にアクセスする際に、使う引数はpageAnker
になります。pageAnker
に対してaddEventListener
で、イベントの種類に"click"
を指定し、引数にイベントハンドラのe
を与えます。これにより、クリックしたアンカーに対して{}
内の記述を実行することができます。
スムーススクロールのイベントの記述
〜〜〜〜〜中略〜〜〜〜〜
pageAnkers.forEach(pageAnker => {
pageAnker.addEventListener("click", e => {
e.preventDefault();
const ankerId = e.target.hash;
const ankerTarget = document.querySelector(ankerId);
ankerTarget.scrollIntoView({ behavior: "smooth" });
});
});
最初の処理に、
e.preventDefault()
を指定してアンカーをクリックした際のページ遷移を無効にします。e.target.hash
でイベントハンドラ(クリックイベントが発生したアンカー)のhref属性の値を取得し、定数ankerId
に格納します。document.querySelector
で、ankerId
と一致するid属性を持つセレクターを取得し、定数ankerTarget
に格納します。-
最後に
ankerTarget.scrollIntoView({ behavior: "smooth" })
1で、取得したセレクターankerTarget
までスクロールを実行します。まとめ
スムーススクロールの記述は、そんなに難しくなく仕組みさえ分かってしまえば非常に簡単なものです。
ただ、今回の記述はIE11などのブラウザでは非対応のメソッドを使用しているため注意が必要です。
IE11への対応版は、今後の更新で取り上げる予定なので今しばらくお待ちください。
-
scrollIntoView
メソッドは、オプションでbehavior: "smooth"
を指定することでスクロールのアニメーションを指定しています。 ↩