7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

iOS 26のSafariで100vh的なスタイルを上手く表示するためのCSSハック

Posted at

問題

iOS 26のSafariでは、上部のステータスバーと下部のタブバーが透過してしまい、背景が透けて見える問題が発生しています。

次の画像は、画面いっぱいにグレーの背景を敷いたときのSafariとArcでの見え方の差です。

Safari Arc

解決策

mix-blend-mode: lighten を使った方法で、ステータスバーとタブバー両方の透過を防ぐことができます。

HTML

<!-- ステータスバー用 -->
<div class="for-status-bars"></div>

<!-- タブバー用 -->
<div class="for-tab-bars"></div>

ページの最後などに専用のdiv要素を追加します。

CSS

/* ステータスバー透過防止 */
.for-status-bars {
  position: fixed;
  top: 0;
  pointer-events: none;
  height: 5px;
  width: 100%;
  background-color: #000;
  mix-blend-mode: lighten;
}

/* タブバー透過防止 */
.for-tab-bars {
  position: fixed;
  bottom: 0;
  pointer-events: none;
  height: 4px;
  width: 100%;
  background-color: #000;
  mix-blend-mode: lighten;
}

仕組みの解説

ポイント1: 最小高さの要件

ステータスバーとタブバーでは、必要な最小高さが異なります。

/* ステータスバー */
height: 5px; /* 4px以下だと効かない */

/* タブバー */
height: 4px; /* 3px以下だと効かない */
  • ステータスバー(上部): 最低5px以上の高さが必要
  • タブバー(下部): 最低4px以上の高さが必要

これ以下のサイズでは、透過防止の効果が発動しません。

なぜこのサイズなのかはまったく分かりませんが、1pxずつ変えながら試したので恐らく間違いないと思います。
ただし、今後のアップデートで閾値が変わるかもしれませんからその点はご注意ください。

ポイント2: mix-blend-modeの活用

background-color: #000;
mix-blend-mode: lighten;

黒(#000)をlightenモードで被せることで、実際の表示色に影響を与えずに透過を防いでいます。

lightenモードは、背景色とブレンド色を比較して明るい方を表示するため、黒を被せても元の色がそのまま表示されます。
これにより、視覚的な変化を起こすことなく透過問題を解決できます。

ポイント3: ユーザー操作への配慮

pointer-events: none;

pointer-events: noneを指定することで、この要素がクリックやタップなどのユーザー操作を妨げないようにしています。
画面上部や下部に配置された要素でも、ユーザーの操作には影響しません。

完全な実装例

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>iOS 26 ステータスバー&タブバー透過対策</title>
  <style>
    * {
      box-sizing: border-box;
      margin: 0;
      padding: 0;
    }

    body {
      background-color: #fff;
    }

    .container {
      padding: 3rem;
    }

    /* 背景設定 */
    .background {
      position: fixed;
      background-color: #f0f0f0;
      inset: -20px;
      z-index: -1;
    }

    /* ステータスバー透過防止 */
    .for-status-bars {
      position: fixed;
      top: 0;
      pointer-events: none;
      height: 5px;
      width: 100%;
      background-color: #000;
      mix-blend-mode: lighten;
    }

    /* タブバー透過防止 */
    .for-tab-bars {
      position: fixed;
      bottom: 0;
      pointer-events: none;
      height: 4px;
      width: 100%;
      background-color: #000;
      mix-blend-mode: lighten;
    }
  </style>
</head>
<body>
  <div class="container">
    <!-- コンテンツ -->
  </div>

  <div class="background"></div>
  <div class="for-status-bars"></div>
  <div class="for-tab-bars"></div>
</body>
</html>
Before After

まとめ

  • iOS 26のSafariではステータスバーとタブバーの両方が透過する問題がある
  • mix-blend-mode: lightenを使った固定配置要素で両方とも解決できる
  • 必要な最小高さ:ステータスバー5px、タブバー4px
  • 黒をlightenで被せることで、視覚的な影響を最小限に抑えられる
  • pointer-events: noneでユーザー操作を妨げないようにする

ただしあくまでこの方法は暫定的な回避策です。
今後のアップデートで修正が行われることを期待します。

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?