質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

3回答

2160閲覧

jQuery 固定ヘッダーでのページ内リンクスムーズスクロールのずれ

stylish_shield

総合スコア5

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2020/07/31 08:48

自身のポートフォリオサイト(1ページ)をつくっていて、ページ内リンクでスムーズスクロールするようにjQueryを使っています。

$('a[href^="#"]').click(function() {
let speed = 500;
let href = $(this).attr("href");
let target = $(href === "#" || href === "" ? 'html' : href);
let position = target.offset().top;
$('html, body').animate({scrollTop:position}, speed, 'swing');
return false;
});

ヘッダーを固定しているので、これだとヘッダーに隠れてしまいます。それ以外はうまく動作します。
そこで、よくあるコードで

$('a[href^="#"]').click(function() {
const headerHieght = $('header').height(); //ヘッダーの高さ取得
let speed = 500;
let href = $(this).attr("href");
let target = $(href === "#" || href === "" ? 'html' : href);
let position = target.offset().top - headerHieght;
$('html, body').animate({scrollTop:position}, speed, 'swing');
return false;
});

このように書きました。

しかしクリックした後、固定ヘッダーの高さを考慮してスクロールで移動してくれるのですが、その後すぐにスクロールされて、リンクの先頭がヘッダーに隠れてしまいます。

どうすればよいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stylish_shield

2020/08/01 07:44 編集

CSSを使えばできるようですが、出来ればJSのみで書きたかったです。 何故ズレるのか理由がわかれば教えていただけると幸いです。
guest

回答3

0

ベストアンサー

質問から大分経っていらっしゃるのでもう不要かもしれませんが、まだ閉じられていらっしゃらないので書いておきますね。

私も全く同じ現象で詰まっておりました。
私の場合、ページに記載されていたsmoothscroll.jsと競合を起こしていた為でした。
もしページの中にsmoothscroll.jsがあればそちらを消すか、
html内にあるページ内リンク部分のaタグにclass="noscroll"を入れてsmoothscroll.jsからの影響を受けなくするかで解決出来るかもしれません。

一応例置いておきます

<div><a href="#link01">リンク1へ</a></div> <div><a href="#link02">リンク2へ</a></div> ↓ <div><a href="#link01" class="noscroll">リンク1へ</a></div> <div><a href="#link02" class="noscroll">リンク2へ</a></div>

あとはsmoothscroll.jsの2020verがあるそうなので、そちらを使用されると競合は起こらないようです。

私の場合はこれが原因でしたが、もしこれで解決されましたら幸いです。
駄目でしたらお役に立てず申し訳ありません。

投稿2021/07/20 09:51

編集2021/07/20 10:00
yksg_09315

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

質問されてからちょっと日にちが経っているので、もう解決されてるかもですが、まだ閉じられてないので一応書いておきますね。

なぜ2段階のスクロールという挙動になるのかですが、aをクリックすると、元々のhtmlの機能としてhrefに書かれた場所にジャンプするようになっているので、jQueryのクリックイベントでもジャンプ機能が働くことで、ダブルジャンプとなってしまうからです。

従って、htmlの方の本来のジャンプを起こさせないようにする必要があるのです。

なのでこの部分

$('a[href^="#"]').click(function() {

をこのように↓

$('a[href^="#"]').on('click',function(e){ e.preventDefault();

としてみてください。

投稿2020/08/07 23:41

mari.rinn

総合スコア296

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stylish_shield

2020/08/08 07:06

回答ありがとうございます。 $('a[href^="#"]').on('click',function(e){ e.preventDefault(); としても、二段階でスクロールしてしまい、結局狙った挙動(ヘッダーの高さを考慮して下にずれる)は得られませんでした。
mari.rinn

2020/08/08 07:53

ブラウザのキャッシュはクリアされましたか?
stylish_shield

2020/08/11 13:55

しましたが、できませんでした
mari.rinn

2020/08/11 21:12

う〜〜ん、挙動からして絶対にこれだと思ったのですが変わりませんか。 そしたら $('html, body').animate({scrollTop:position}, speed, 'swing'); これを $('html, body').stop().animate({scrollTop:position}, speed, 'swing'); とするとどうなりますか?あ、ちなみに、 $('a[href^="#"]').on('click',function(e){ e.preventDefault();  はつけたままにしといてください。 これでも変わらない場合は申し訳ないですが私にはわかりません。お役に立てずごめんなさい。
guest

0

アンカー先の要素にCSSをあてて調整するのはいかがでしょうか。

html

1<div id="hoge" class="anchor"></div> 2<section> 34</section>

css

1.anchor{ 2 display:block; 3 width:0; 4 height:0; 5 margin-top: -100px; //固定ヘッダーの高さ 6 paddiing-top: 100px; //固定ヘッダーの高さ 7}

レスポンシブなどの理由でヘッダーの高さが定まらずCSSで指定できない場合は、
JSの記述を流用してアンカーリンクをクリックした時などに高さを取得し、
anchorに直接styleを当ててあげれば対応できると思います。

投稿2020/07/31 10:14

3omi0

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問