今日は、【jQuery】固定ヘッダーがスクロールのたびにチカチカする解決策についてです。同じバグで悩む人の助けになったらうれしいです。
こんにちは。駆け出しコーダーのharuです。
2歳0歳の育児をしながら、22時〜2時にプログラミングを独学しています。
2020.5.11~学習スタート
2020.8.10~実務でコーディングしています
まだHTML/CSS(SCSS)/jQuery のよわよわです。これからもっと知識をつけていきたく、インプット・アウトプットを続けています。
普段から学習していてわかったことや、気付きをログに残しています。
※認識の間違っている箇所があれば、ご教授いただけるとうれしいです!
【jQuery】固定ヘッダーがスクロールのたびにチカチカする解決策
今日は、jQueryで固定ヘッダーを実装したときに、スクロールするとヘッダーがチカチカしてしまう問題を解決したのでまとめます。(語彙力…伝わっていますか?w)
なかなか検索で引っ掛からなかったので(みんな、あまりしないミスなのであろう…(´・ω・`;))、同じバグにハマった人の助けになったらいいなと思い、記事に残すことにしました。
チカチカってこんな感じ…
伝わりますか…?スクロールすると、固定した部分が全体がチカチカ点滅してしまって困っていました。
元のjQuery
元のjQueryがこちらです。
$(function(){ $(window).scroll(function () { var navPos = $(".nav").offset().top; var winTop = $(window).scrollTop(); var headerTop = $(".nav"); if (navPos < winTop) { headerTop.addClass("fixed"); } else { headerTop.removeClass("fixed"); } }); });
固定したいのが.nav(=ヘッダーナビゲーション)の部分です。
if文で、
となったときにfixedクラスをつけ外しして、ヘッダーナビゲーションを固定、または固定解除するようにしました。
しかし、これではチカチカ点滅してしまいます。
原因
スクロールするたびに
が取得されてしまっていたのが原因でした。スクロール行ったり来たりするときに、その都度、offset()で値を引っ張ってきて更新してしまっていたようです。
解決後のjQuery
解決後のjQueryはこちらです。
$(function (){ $(window).scroll(function () { var winTop = $(window).scrollTop(); var headerTop = $(".nav"); //fixedクラスがついていないときだけ、offset()で値を取得する if (!headerTop.hasClass("fixed")) { navPos = $(".nav").offset().top; } if (navPos < winTop) { headerTop.addClass("fixed"); } else { headerTop.removeClass("fixed"); } }); });
if文を増やして、fixedクラスがついていないときだけ、offset()でnavの高さを測るようにしました。
if (!headerTop.hasClass(“fixed”)) {
navPos = $(“.nav”).offset().top;
}
【完成物】
これでチラつかなくなりました!
あとがき
jQueryをかく頻度が低すぎるからか、ちょこちょここのようなエラーに引っかかります…。
とはいえ、コードを書くのは楽しいです♪もっと経験値上げていこう(`・ω・´)
今日は短いですが以上です。
*わたしの塾の先生です*
Thanks:師匠「もりけんさん」(@terrace_tec)
もりけんさんのHPはこちら