前提・実現したいこと
皆様、お世話になっております。
ページタイトルで質問内容を正確に表現できていないため、質問が長文になりますが、よろしくお願いいたします。
Chromeで挙動する画像遅延読み込みのloading="lazy"という属性を画像タグに埋め込んでいます。
それによってページ内リンクへのスムーススクロールが上手く挙動しなくなってしまいました。
js
1 $('a[href^="#"]').click(function(){ 2 var speed = 500; 3 var href= $(this).attr("href"); 4 var target = $(href == "#" || href == "" ? 'html' : href); 5 var position = target.offset().top; 6 $("html, body").animate({scrollTop:position}, speed, "swing"); 7 return false; 8 });
一般的だと思われる↑のようなコードを使用していたのですが、loading="lazy"を採用したことによって、未スクロール部分の画像の高さが0と判断され、その分だけクリック時のpositionの高さと実際のページ内リンクのIDまでの高さにズレが発生してしまい、(画像部分をたくさん通過する必要があるページ下部にいくにつれて)、意図した場所とズレたところでスクロールがとまってしまう…という減少が発生しています。
(loading="lazy"にまったく問題なく挙動するサイトもあるのですが、比較的大規模+古いサイトで、どういうわけかこの減少が発生して困っていました。)
そこで、私なりに考えまして、↓下記のような記述で応急処置をとりました。
js
1 $('a[href^=#]').click(function() { 2 var href = $(this).attr("href"); 3 var target = $(href == "#" || href == "" ? 'html' : href); 4 var position = target.offset().top - headerHight; 5 6 $.when( 7 $("html, body").animate({ 8 scrollTop: position 9 }, 400, "swing"), 10 ).done(function() { 11 var diff = target.offset().top - headerHight; 12 if (diff === position) { 13 } else { 14 $("html, body").animate({ 15 scrollTop: diff 16 }, 10, "swing"); 17 } 18 }); 19 });
おそらく、あまりスマートな方法ではないのかなとは思うのですが、一応、これでスクロール問題自体は解決しています。
ただ、タイトルにも記述しましたとおり、上記のコードですと、クリック時にURLに#IDが付与されてしまいます。
https://hoge.jp/index.html#sectionA
(↑こんな感じです。)
これをクリック時に、
https://hoge.jp/index.html
このようにIDを付与しないかたちにするためには、上記コードをどのように変更したら良いでしょうか?
何卒、よろしくお願い申し上げます。
回答1件
あなたの回答
tips
プレビュー