javascriptの練習をしており、スムーズスクロールを作ってみています。
ページ内スクロールはうまくいったのですが、他のページからindex.html#block02
などで遷移して来た場合に、直接 #の所に飛んでしまいます。
一度、bodyのトップを表示させた上で、1秒後に#のところまでスクロールするにはどのようにすればいいのでしょうか?
if (urlHash) {}
の部分に別ページから遷移して来た場合のスクリプトを書いています。
headerはfixedで固定の場合の仕様です。
何かおかしな部分があれば教えていただきたいです。
よろしくお願いします。
const anchors = document.querySelectorAll('a[href^="#"]'); const header = document.querySelector('header').offsetHeight; //header高さ const urlHash = location.hash; // URLのアンカー(#以降の部分)を取得 // 各 anchor にクリックイベント for ( let i = 0; i < anchors.length; i++ ) { anchors[i].addEventListener('click', (e) => { e.preventDefault(); //デフォルトのクリックイベント無効化 // 各 anchor の href属性取得 const href= anchors[i].getAttribute("href"); // topに戻る以外のアンカー if (href !== '#top') { // スクロール先の要素を取得 (アンカーの リンク先 #.. の # を取り除いた名前と一致する id名の要素) const target = document.getElementById(href.replace('#', '')); // スクロール先の要素の位置を取得 // header の高さ引く const position = window.pageYOffset + target.getBoundingClientRect().top - header; // スクロールアニメーション window.scroll({ top: position, // スクロール先要素の左上までスクロール behavior: 'smooth' // スクロールアニメーション }); // topに戻る } else { // スクロールアニメーション window.scroll({ top: 0, // スクロール先 behavior: 'smooth' // スクロールアニメーション }); } }); } //別ページから遷移して来た場合 window.addEventListener('DOMContentLoaded', (event) => { if (urlHash) { window.scrollTo({top:0}); setTimeout(function () { //ページロード用に処理を遅らす // スクロール先の要素を取得 (アンカーの リンク先 #.. の # を取り除いた名前と一致する id名の要素) const urlTarget = document.getElementById(urlHash.replace('#', '')); // スクロール先の要素の位置を取得 const urlPosition = window.pageYOffset + urlTarget.getBoundingClientRect().top - header; // スクロールアニメーション window.scroll({ top: urlPosition, // スクロール先要素の左上までスクロール behavior: 'smooth' // スクロールアニメーション }); }, 1000); //1秒後に処理開始 } });

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。