前提・実現したいこと
https://teratail.com/questions/325312
直接の関係はないのですが、上記で作ったリストのアンカーリンクをアドレスバーに反映しない方法を探していたところ、以下のjsを導入することで解決しました。
しかし<a href="#"></a>でページ最上部に戻ろうとするとアドレスバーに#が入るうえ、スムーススクロールさえできません。
この場合でもアドレスバーにアンカーリンクを表示させない方法とスムーススクロールを適用する方法を教えてください。
該当のソースコード
js
1var Ease = { 2 easeInOut: t => t<.5 ? 4*t*t*t : (t-1)*(2*t-2)*(2*t-2)+1 3} 4var duration = 500; 5window.addEventListener('DOMContentLoaded', () => { 6 var smoothScrollTriggers = document.querySelectorAll('a[href^="#"]'); 7 smoothScrollTriggers.forEach(function (smoothScrollTrigger) { 8 smoothScrollTrigger.addEventListener('click', function (e) { 9 var href = smoothScrollTrigger.getAttribute('href'); 10 var currentPostion = document.documentElement.scrollTop || document.body.scrollTop; 11 var targetElement = document.getElementById(href.replace('#', '')); 12 if (targetElement) { 13 e.preventDefault(); 14 e.stopPropagation(); 15 var targetPosition = window.pageYOffset + targetElement.getBoundingClientRect().top - 0; 16 var startTime = performance.now(); 17 var loop = function (nowTime) { 18 var time = nowTime - startTime; 19 var normalizedTime = time / duration; 20 if (normalizedTime < 1) { 21 window.scrollTo(0, currentPostion + ((targetPosition - currentPostion) * Ease.easeInOut(normalizedTime))); 22 requestAnimationFrame(loop); 23 } else { 24 window.scrollTo(0, targetPosition); 25 } 26 } 27 requestAnimationFrame(loop); 28 } 29 }); 30 }); 31});
試したこと
else {
window.scrollTo(0, targetPosition);
}
が<a href="#"></a>のときに適用される動きではないかと考え、
else {
window.scrollTo({
top: targetPosition,
behavior: 'smooth',
});
}
と書き替えましたが希望の動きにはなりませんでした。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/02 10:47
2021/03/02 11:47
2021/03/02 12:19
2021/03/02 12:43
2021/03/02 12:51
2021/03/02 13:22 編集
2021/03/02 13:52 編集
2021/03/02 14:07
2021/03/02 14:13