BLOGブログ

2025/03/06

スマホで position: fixed; の要素がガタガタする原因と解決策

Webサイトをスマホで閲覧した際に、画面下部や上部に position: fixed; を適用した要素(ヘッダーやフッター)が、小刻みに動いたりガタガタしたりすることがあります。この現象は、特に iOS の Safari や Chrome で発生しやすい問題です。

この記事では、その原因と具体的な解決策を紹介します。

原因 1: スクロール時のリフレッシュレートの影響

スマホのブラウザでは、スクロール時に画面が再描画されます。しかし、position: fixed; の要素の位置計算がリアルタイムで行われるため、スクロール時に細かいズレが発生し、ガタガタした動きになります。

解決策

will-change: transform; を指定することで、ブラウザが事前に描画を最適化し、ガタつきを軽減できます。

原因 2: ビューポートの高さが動的に変化する

モバイルブラウザでは、スクロール時にアドレスバーやツールバーが表示・非表示されることで vh(ビューポートの高さ)が変わることがあります。特に height: 100vh; を使っている場合、スクロールとともに要素の高さが微妙に変動し、ガタつく原因になります。

解決策

vh の代わりに svh(Small Viewport Height)や lvh(Large Viewport Height)を使うことで、高さの変動を防ぐことができます。

原因 3: transform: translateZ(0); による GPU レンダリングの影響

transform: translateZ(0); を適用すると、要素が GPU によってレンダリングされます。これにより、スクロール時の再計算が行われる際にズレが生じ、ガタつきの原因になります。

解決策

transform: translateZ(0); を削除し、代わりに will-change: transform; を適用すると、よりスムーズな動作になります。

原因 4: overflow: hidden; によるスクロール制限の影響

bodyhtmloverflow: hidden; が適用されていると、スクロールが正しく処理されず、position: fixed; の要素が意図しない動きをすることがあります。

解決策

開発ツールで bodyhtml の CSS を確認し、不要な overflow: hidden; があれば削除しましょう。

原因 5: CSS アニメーションや transition の影響

position: fixed; の要素に transitionanimation が適用されていると、スクロール時に意図しない動きが発生することがあります。

解決策

transitionanimation を一時的に無効にして、ガタつきが解消されるか確認してみましょう。

まとめ

スマホで position: fixed; の要素がガタガタする問題の原因と解決策をまとめると、以下のようになります。

原因解決策
スクロール時のリフレッシュレートwill-change: transform; を適用
ビューポートの高さの変動svhlvh を使用
transform: translateZ(0); の影響transform: translateZ(0); を削除
overflow: hidden; による影響overflow: hidden; を削除
transitionanimation の影響transition: none;animation: none; を適用

CONTACTお問い合わせ

サービスに関するお問い合わせやお見積もり・ご相談などお気軽にご相談ください。

電話でのお問い合わせ

受付時間(平日)09:00~18:00
※年末年始・祝日を除く

メールでのお問い合わせ

24時間受付