前提・実現したいこと
Vanillaでスムーズスクロールを書いており、動的に追加したアンカーリンクにもクリックイベントを起こしたいです。
発生している問題・エラーメッセージ
・問題一つ目
ヘッダー内のアンカーリンクがスムーズスクロールしない
・二つ目
a[href^="#"] にだけイベントを起こしたい
エラーはなし
該当のソースコード
js
1/* smooth scroll --------------------------------------------- */ 2 let Ease = { 3 easeInOut: function (t) { 4 return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1; 5 } 6 } 7 let duration = 1200; 8 document.addEventListener('click', function (e) { 9 trigger = e.target; 10 if (trigger.tagName.toLowerCase() === 'a') { // and条件で a[href^="#"]を入れたい 11 let href = trigger.getAttribute('href'); 12 let currentPosition = document.documentElement.scrollTop || document.body.scrollTop; 13 let targetElement = document.getElementById(href.replace('#', '')); 14 if (targetElement) { 15 e.preventDefault(); 16 e.stopPropagation(); 17 let targetPosition = window.pageYOffset + targetElement.getBoundingClientRect().top - 115; 18 let startTime = performance.now(); 19 let loop = function (nowTime) { 20 let time = nowTime - startTime; 21 let normalizedTime = time / duration; 22 if (normalizedTime < 1) { 23 window.scrollTo(0, currentPosition + ((targetPosition - currentPosition) * Ease.easeInOut(normalizedTime))); 24 requestAnimationFrame(loop); 25 } else { 26 window.scrollTo(0, targetPosition); 27 } 28 } 29 requestAnimationFrame(loop); 30 } 31 } 32 }); 33 /* smooth scroll ----------------------------------------- end */
html
1<header> 2 <a href="#link">dummy</a> <!-- これがスムーズスクロールしない --> 3</header> 4 5<section id="link"> 6あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。 7</section>
ヘッダー内以外のリンクはスムーズスクロールしました。ヘッダー内のアンカーリンクだけスムーズスクロールしません。
試したこと
なぜ、ヘッダーにだけクリックイベントが起きないのか、調べてみましたがめぼしい情報を得られませんでした。
また、and 条件で [href^="#"] を含めるのもどうすればいいのか全く分からず、お手上げです。
ご助力いただけますと大変助かります。
追記
22.01.04 追記
js
1/* smooth scroll --------------------------------------------- */ 2 let Ease = { 3 easeInOut: function (t) { 4 return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1; 5 } 6 }, 7 duration = 1200; 8 function smooth(e) { 9 href = this.getAttribute('href'); 10 targetElement = document.getElementById(href.replace('#', '')); 11 if (targetElement) { 12 e.preventDefault(); 13 e.stopPropagation(); 14 let currentPosition = document.documentElement.scrollTop || document.body.scrollTop; 15 let targetPosition = window.pageYOffset + targetElement.getBoundingClientRect().top - 115; 16 let startTime = performance.now(); 17 let loop = function (nowTime) { 18 let time = nowTime - startTime; 19 let normalizedTime = time / duration; 20 if (normalizedTime < 1) { 21 window.scrollTo(0, currentPosition + ((targetPosition - currentPosition) * Ease.easeInOut(normalizedTime))); 22 requestAnimationFrame(loop); 23 } else { 24 window.scrollTo(0, targetPosition); 25 } 26 } 27 requestAnimationFrame(loop); 28 } 29 }; 30 let anchorLinks = [].slice.call(document.querySelectorAll('a[href^="#"]')); 31 anchorLinks.forEach(function (anchorLink) { 32 anchorLink.addEventListener("click", smooth, false); 33 }); 34 /* smooth scroll ----------------------------------------- end */
こちらのコードのに変更したところ、動的に追加した(Fetch Api で追加した要素)はスムーズスクロールしませんでした。他はしています。
補足情報(FW/ツールのバージョンなど)
Firefox 最新版
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/26 01:30
2022/01/04 06:36