トラブルシュート

iPhoneのノッチ・ホームバーに要素が隠れるときの対処(safe-area)

iPhoneで固定ヘッダーや画面下のボタンが、ノッチやホームバー(ホームインジケーター)に重なって隠れてしまう。これはコンテンツが画面の物理的な端ぎりぎりまで広がるためです。safe-area-insetを使えば、隠れない安全な余白を確保できます。

なぜノッチやホームバーに隠れるのか

ノッチやパンチホール、画面下のホームバーを持つiPhoneでは、画面の表示領域が長方形ではなく一部が欠けています。Webページはこの欠けを考慮せず端まで広がるため、固定配置した要素が重なって見えなくなります。

特に position: fixed のヘッダーやフッター、画面下に貼り付けたボタンで起きやすい現象です。横向き(ランドスケープ)ではノッチが左右に来るため、左右の見切れも発生します。

全画面に近いレイアウトやviewport-fitの設定で表示領域を端まで広げているときに、この問題が顕著になります。

viewport-fitとenv()で対処する

まずHTMLのviewportメタタグに viewport-fit=cover を指定して、安全領域の情報をCSSから取得できるようにします。これがないと env() の値が常に0になり対処できません。

次にCSSの env(safe-area-inset-top) / right / bottom / left を使って、安全領域分の余白を確保します。固定ヘッダーなら padding-top に、下部ボタンなら padding-bottom に safe-area-inset を足すのが基本形です。

既存のpaddingと両立させたいときは、max() や calc() を使って「通常の余白」と「safe-area分」の大きい方を採用すると、ノッチのない端末でも見栄えを保てます。

症状別チェック表

iPhoneのノッチ・ホームバーに要素が隠れるは、症状を分けずに直そうとすると原因探しが長引きます。まず「自分だけで起きるのか」「全員で起きるのか」「特定ブラウザだけか」「差し替え後だけか」を切り分けます。

確認順序を固定すると、相対パス、ファイル名、キャッシュ、認証、外部読み込みのどこで止まっているかが見えます。修正後はローカル確認だけで終わらせず、実際の共有URLで再表示して、相手と同じ条件で直ったことを確認します。

  • 自分だけ表示されない: キャッシュ、ログイン状態、ブラウザ拡張、端末幅を確認する
  • 全員で表示されない: ファイル構成、相対パス、大文字小文字、アップロード漏れを見る
  • 一部だけ崩れる: CSS/画像/JSごとに読み込みエラーを分ける
  • 差し替え後だけ古い: URL、キャッシュ、更新対象ファイルの取り違えを確認する

対処の手順

順を追って設定すると漏れがありません。次の流れで進めてください。

  1. metaタグに viewport-fit=cover を追加する
  2. 固定ヘッダーに padding-top: env(safe-area-inset-top) を足す
  3. 下部の固定ボタンやナビに padding-bottom: env(safe-area-inset-bottom) を足す
  4. 横向き対策として left/right の safe-area-inset も必要に応じて指定する
  5. max(16px, env(safe-area-inset-bottom)) のように通常余白と安全領域を両立させる

未対応・誤設定でよくあるミス

最も多いのは viewport-fit=cover を入れ忘れているケースです。これがないと env() が効かず、いくらCSSを書いても余白が入りません。

env() のフォールバック値を指定していないのも落とし穴です。env(safe-area-inset-bottom, 0px) のように第2引数で既定値を渡すと、未対応環境でも崩れません。

また、safe-areaの余白を背景色のある要素に直接paddingで足すと、ノッチ周りに想定外の色帯が出ることがあります。背景と余白の関係を実機で確認しながら調整してください。

実機での見切れ確認を依頼する

safe-areaの問題は、ノッチやホームバーを持つ実機でしか正確に再現できません。シミュレータでもある程度確認できますが、最終チェックは実機が確実です。

ギガサイト便なら修正版をドロップして共有URLを発行し、iPhoneを持つ担当者に実機で確認してもらえます。メール認証(ワンタイムコード)を付ければ、特定の確認者だけに開いてもらう運用もできます。

同じURLのまま差し替えられるので、env()の値を調整するたびにリンクを送り直さずに最新版を見てもらえます。確認依頼はQRコードを渡すとスマホですぐ開けて便利です。

よくある質問

env(safe-area-inset)が効きません

viewportメタタグに viewport-fit=cover を指定していないと、env()の値が常に0になり効きません。まずこの指定があるかを確認してください。

ノッチのない端末でも余白が入ってしまいます

ノッチのない端末ではsafe-area-insetが0になるので余分な余白は入りません。逆に通常の余白も確保したい場合は max(16px, env(safe-area-inset-bottom)) のように書くと両立できます。

横向きで左右が見切れます

横向きではノッチが左右に来るため、env(safe-area-inset-left) と env(safe-area-inset-right) を使って左右にも余白を確保してください。

Androidでも同じ対処が必要ですか

パンチホールやジェスチャーナビを持つAndroid端末でも、safe-area-insetは有効に働く場合があります。env()はマルチプラットフォームで使える指定なので、両方を実機で確認するのが確実です。

原因が分からないときはどこから確認すべきですか?

まず自分だけの問題か全員の問題かを分けます。次にシークレットウィンドウ、別ブラウザ、スマホで確認し、ファイル構成・相対パス・キャッシュ・認証設定を順に見ます。

関連記事

トラブルシュート

公開後にJavaScriptが動かないときの原因と直し方

ローカルでは動いていたボタンやアニメーションが公開後に反応しなくなった方向け。JavaScriptが止まる主な原因をファイルパスや読み込み順の観点で切り分け、自分で直せるかどうかを判断できます。

5分で読める
トラブルシュート

公開後に動画が再生されないときの対処

デモページや資料に埋め込んだ動画が公開後に再生されなくなった方向け。動画ファイルの添付漏れ・パスのズレ・ブラウザの自動再生制限を症状ごとに切り分け、自分でできる確認と対処を把握できます。

4分で読める
トラブルシュート

公開したHTMLのフォームが送信できないときの対処

問い合わせフォームやアンケートの送信ボタンが押せない・エラーになる方向け。静的ファイル公開ではフォームの動作に制約がある理由を理解し、外部サービス連携などの現実的な解決策を選べるようになります。

5分で読める
トラブルシュート

iframeが表示されないときの原因と対処

地図や外部コンテンツをiframeで埋め込んだのに公開後に枠が空白になった方向け。表示許可・HTTPSとHTTPの混在・相対パスのズレを症状ごとに切り分け、適切な対処を選べるようになります。

4分で読める
トラブルシュート

外部CDNのCSS・JSが読み込めないときの対処

CDNからCSSやJSを読み込む構成にしたらデザインが崩れて機能が動かなくなった方向け。URLの誤りやHTTPSの混在・バージョン指定の問題を原因ごとに整理し、確認と修正の手順を把握できます。

5分で読める
トラブルシュート

スマホだけ表示が崩れるときの原因と直し方

パソコンでは正常なのにスマホで開くと文字が小さすぎたりレイアウトが崩れたりして困っている方向け。viewportの指定漏れや固定幅指定が原因かどうかを症状から切り分け、HTMLとCSSの修正ポイントを確認できます。

4分で読める
「トラブルシュート」の記事をもっと見る →