scrollIntoViewでスムーススクロール(ハッシュタグ付き)
スクロールしたらハッシュタグをつけます。location.href
とかでできるかな?と思ったのですが、アニメーション中にid名へ急にジャンプしてしまったため、history.pushState()
を使用しています。scrollIntoView
に対応していないブラウザのためにポリフィルを読ませます。
コード
import smoothscroll from 'smoothscroll-polyfill';
export const Scroll = () => {
//polyfill読み込み
smoothscroll.polyfill();
let anchor = document.getElementsByClassName('anchor');
if (0 < anchor.length) {
//option
let scrollOption = {
behavior: 'smooth', //推移のアニメーション
block: "start", //縦方向のスクロール位置
inline: "nearest" //横方向のスクロール位置
}
let anchorLink = (e) => {
e.preventDefault();
let _this = e.currentTarget;
let _thisTarget;
let _thisHref;
if (_this.getAttribute('href') === "#") {
//TOPへ戻る
_thisTarget = document.body;
} else {
//アンカーリンク
_thisHref = _this.getAttribute('href').replace(/[\/\\^$.*+?()[\]{}|]/g, '\\$&');
_thisTarget = document.querySelector(_thisHref);
}
_thisTarget.scrollIntoView(scrollOption);
//ハッシュタグつける
if(_thisHref){
history.pushState({},'', _thisHref)
}
};
for (let i = 0; i < anchor.length; i++) {
anchor[i].addEventListener('click',(e) => {
anchorLink(e);
})
}
}
}
export default Scroll;
<div>
<a class="anchor" href="#link1">リンク1</a>
</div>
<div id="link1"></div>
<div>
<a class="anchor" href="#">TOPへ</a>
</div>
scrollIntoViewの詳細については以前のエントリに記載してあります。
参考サイト
[HTML5] アドレスバーのURLを変更する – history.pushState()
https://blog.katsubemakito.net/html5/history-pushstate
polyfill
smoothscroll-polyfill – npm
https://www.npmjs.com/package/smoothscroll-polyfill