ページ内リンク
ページ内リンクのやり方・スムーズスクロール・urlを変えない方法・ずれるときの対処法を紹介します。
やり方
id属性のある要素を作り、aタグのhref属性に「#id名」と指定することでページ内にリンクさせることができます。
<a href="#here">link</a>
<p id="here">here!</p>
よくサイトのヘッダーとかに使われていますね。
このサイトの「目次」にも使っています。
スムーズスクロール
さっきのページ内リンクでは、aタグを押したらリンク先にパッと瞬間移動のように移動しました。
ですが、それだとページのどこら辺に移動したのかが分かりずらいです。
そこでスムーズスクロールを使います。
やり方は簡単でhtmlタグに次のコードを追加するだけです。
html {
scroll-behavior: smooth;
}
scroll-behaviorの初期値はautoです。
これでユーザビリティが向上しましたね。
urlを変えない
例えばhttps://nehapire.comに次のようなコードがあったとします。
<a href="#about">about</a>
これをクリックした時、urlはこのようになります。
https://nehapire.com#about
ここでブラウザの戻るボタンを押すと、https://nehapire.comに戻り、「そのもう一個前のページに戻りたいのに」と思うことがありました。
なので次のjavascriptのコードでurlを変えないようにしました。
document.addEventListener("DOMContentLoaded", function() {
const e = document.querySelectorAll('a[href^="#"]');
for (let n = 0; n < e.length; n++)
e[n].addEventListener("click", function(e) {
e.preventDefault();
const n = this.getAttribute("href")
, t = "#" === n || "" === n ? document.documentElement : document.querySelector(n)
, o = t.offsetTop;
window.scrollTo({
top: o,
behavior: "smooth"
})
})
})
処理の主な流れとしては、
DOMが読み込まれた後に、href属性の値が#で始まる全てのa要素を取得して、
クリックイベントを無効化し、href属性で指定されていた要素の位置を取得して、そこにスムーズスクロールする
といった感じです。
スムーズスクロールしたくないという方は、「behavior」の値を「smooth」から「auto」に変えてください。
document.addEventListener("DOMContentLoaded", function() {
const e = document.querySelectorAll('a[href^="#"]');
for (let n = 0; n < e.length; n++)
e[n].addEventListener("click", function(e) {
e.preventDefault();
const n = this.getAttribute("href")
, t = "#" === n || "" === n ? document.documentElement : document.querySelector(n)
, o = t.offsetTop;
window.scrollTo({
top: o,
behavior: "auto"
})
})
})
ずれる
今回は、ヘッダーがあるのにページ内リンクがずれる例を見ながら、対処法を紹介します。
まずは、こちらのページ内リンクがずれているサイトを見てください。
worksと書いてあるaタグをクリックすると、ヘッダーが重なった状態でオレンジのコンテナにリンクしてしまいます。
そこでscroll-padding-topプロパティを使います。
使い方は簡単でスムーズスクロールと同じように、htmlタグに次のように記述します。
html {
scroll-padding-top: 50px;
}
「50px」のところにはヘッダーの高さを入れてください。
もう一度、worksと書いてあるaタグをクリックすると、ヘッダーがちょうど赤いコンテナに重なっているのが分かります。
これで直せました。