JavaScriptのスクロール補正で画面がチラつく原因とCSSへの変更
2026年8月18日(火) 8時15分

固定ヘッダーでページ内リンクの見出しが隠れないようJavaScriptで位置補正していたが、ブラウザの「戻る」で画面がチラつく現象が発生。
原因を確認し、CSSによる位置補正へ変更した経緯と、JavaScriptとCSSの使い分けについて振り返る。
サイトの表示が一瞬チラつく現象
ブログを調整している中で、スマホから特定の記事へ戻った際に、画面が一瞬チラつく現象を確認した。
最初はタグ機能を追加したタイミングで気付いたため、新しく実装された機能が影響している可能性も考えていた。
しかし調べていくと、原因は以前から自分で設置していたJavaScriptにあった。
固定ヘッダーとページ内リンクの問題

ライフログメモでは固定ヘッダーを使用している。
この状態でURLの末尾に「#○○」が付いたページ内リンクへ移動すると、ブラウザが対象位置までスクロールしても、見出しなどが固定ヘッダーの裏側に隠れてしまう場合がある。
そこで以前、この位置をJavaScriptによって補正する仕組みを導入していた。
URLにハッシュが付いている場合、その対象となる位置を取得し、固定ヘッダーの高さを考慮した場所まで改めてスクロールさせるという考え方である。
実際、この仕組みによって見出しが固定ヘッダーに重なる問題は解消できていた。
JavaScriptによる補正でチラつきが発生
問題になったのは、別ページへ移動した後にブラウザの「戻る」を使用した場合だった。
ブラウザには、前のページへ戻った際に以前のスクロール位置を復元する仕組みがある。
ところが、URLにハッシュが付いていると、自分で設置していたJavaScriptもスクロール位置を補正する。
結果として、
ブラウザがスクロール位置を復元する
⬇
JavaScriptが位置を補正する
⬇
さらに読み込み状況に応じて位置補正が実行される
という動きが短時間に発生していた。
これによって、画面が一瞬動いたように見える「チラつき」が発生していたようだ。
JavaScriptを削除してCSSで対応

今回、JavaScriptによる位置補正をやめ、CSSによる方法へ変更した。
CSSには、ページ内リンクで対象要素へ移動するときに、上側へ一定の余白を確保する仕組みがある。
これを利用すれば、JavaScriptからスクロール位置を計算して動かさなくても、固定ヘッダーに見出しが隠れないようにできる。
実際にブログページとフリーページそれぞれで余白を調整し、PCとスマートフォンから確認した。
ページ内リンクの位置に問題がないことを確認したうえで、これまで使用していたJavaScriptを削除した。
その結果、ブラウザの「戻る」で発生していたチラつきも改善された。
JavaScriptとCSSはどちらを使うべきなのか
今回感じたのは、「JavaScriptで実現できるからJavaScriptを使う」ことが必ずしも最適ではないということだ。
JavaScriptは自由度が高い。
画面の状態を取得したり、固定ヘッダーの実際の高さを計測したり、条件によって処理を変えたりできる。
一方で、その分だけブラウザ本来の処理と競合する可能性もある。
今回も、JavaScriptによるスクロール位置の補正自体は正常に動いていた。
しかし、ブラウザが持つ「戻る時のスクロール位置復元」と組み合わさったことで、チラつきという別の問題につながった。
対してCSSは、対応できる内容こそJavaScriptより限定されるものの、今回のような見た目や配置の調整であれば、より単純な仕組みで実現できる。
ブラウザ標準の動作に任せられるため、余計な処理も少ない。
単純な表示調整ならCSSを優先したい
今回の目的は、「ページ内リンクへ移動した際に、固定ヘッダーで見出しが隠れないようにする」というものだった。
結果的には、JavaScriptで複雑にスクロール位置を補正しなくても、CSSだけで十分に対応できた。
もちろん、動的な計算や複雑な条件分岐が必要ならJavaScriptを使う意味はある。
ただし、
「CSSだけで実現できるのか」
「JavaScriptを使う必要が本当にあるのか」
は一度考えた方がよいことに気づいた。
今回のようにCSSで十分実現できる処理であれば、シンプルな方法を選んだ方が、後から予期しない挙動に悩まされる可能性も減らせる。
当時、JavaScriptを導入したこと自体が間違いだったわけではない。
その時点では固定ヘッダーに見出しが隠れる問題を解決するために機能していた。
ただ、サイトの構成や使い方が変わる中で、以前の実装が別の問題を生むこともある。
今回の件は、既存の処理をそのまま使い続けるのではなく、より単純な方法へ置き換えられないか見直す良い機会になった。
この記事にコメントする
カテゴリー
最近の記事一覧
【ChatGPT】会話の一番下から上へスワイプすると新規チャットへ移動できるようになった
予定がない休日をどう過ごすか|時間で縛らない自分なりの考え方
【Wi-Fiルーター】LANとINTERNET端子を間違えていた|半年以上使って気づいたこと
【Googleサーチコンソール】サイトマップの最終読み込み日時が更新されない
【Instagram】ストーリーを開くと一瞬で閉じる不具合|同じ症状のユーザーはいる?
【Samsung Notes】貼り付けの改悪が改善されていた|「書式に合わせて貼り付け」が便利
【GPT-6 Astra】Plusへの提供が確定|OpenAI公式などが相次いで発表
【ChatGPT】タスク追加時に「limit of 5 active tasks」エラーで作成できない
【Grok】データセンター障害の影響で一部機能が利用できない不具合
OpenAIがGPT-6 Astraを発表!次世代ChatGPTは何が変わったのか
【ChatGPT】『リクエストに問題があります』エラー発生|大規模障害でチャットを送信できない状態に
風邪をひいた。喉の痛みと咳が強くなってきた
【ChatGPT】「追加の安全性チェック」とは?この現象を調べてみた
ガソリンスタンドで車の向きが逆だと給油できない?Xで話題になったポストについて
【X(Twitter)】アカウント乗っ取り被害の報告相次ぐ| 「誤って通報した」詐欺DMに注意

登録ユーザーの方はこちらからログイン▼ 名前が自動設定され、画像認証が不要になります
ユーザー登録がおすすめ!
コメントが同じユーザーの投稿として関連付けられ、継続してコメントしやすくなります。
データに関するポリシー
ご登録いただくメールアドレスは、本人確認やパスワードの再設定のみに使用され、利用者の事前の同意を得ずに目的以外でこれを利用することはありません。また、個人情報を他の業者等に提供することもありません。
個人情報はホームページシステムのデータベースに保存されますが、当サイト(ライフログメモ)の運営者に対してメールアドレスは伏せられるため、運営者がメールアドレスを取得することはできません。
警察への捜査協力や裁判所からの情報開示要求の際には情報開示を行う場合がございます。