公開日
最近は、業務システムの開発にどっぷり浸かっていて、スマホのブラウザの変化やデザインを追えていなかった。
iPhone の Safari で開いたら、上と下に、黒い帯が付いていて、本サイトのトップは全画面でみれた方がいいのと、レターボックス映像っていうんですかね。
上下に帯が入っているように見えるので、見栄えが悪くて調整しました。
原因は、iOS 26 で変わった Safari の見せ方。
調べたことと、このサイトでやったことをまとめます。
こんな症状があれば、同じ原因かもしれません。
このサイトのトップは、3D の背景を画面いっぱいに敷いて、その上にロゴとメニューを固定しています。
iPhone の Safari で見ると、時計や電池のある上の部分と、アドレスバーのある下の部分が、単色で塗られていました。
Chrome では起きません。
映画館の映像みたいになっちゃう。
iOS 26 からで公開は 2025年9月。1年以上前から、こうなっていたことになります。
iOS 26 では、見た目が「Liquid Glass」というガラスのようなデザインに変わりました。
Safari のアドレスバーは、画面の下に浮かぶ、小さなガラスの部品になっています。
バーが浮いているので、その裏にもページが描かれます。
表示できる範囲が広がるのはうれしい変更ですが、結構なサイトで影響受けたんじゃないでしょうか。今更思う 笑
ヘッダーやフッターを固定しているサイトは全滅では?
問題は、ページの中に「画面の端に固定した部品」があるときです。
国内の情報が意外にも少なかったので、海外のサイトでキレてる人いないか調べました。
ドイツの開発者 Thomas Günther さんの The web behind glass(2025年9月)
皮肉をこめて、「iOS 26 の Safari に合わせるなら、こうデザインしよう」という形で書かれています。
最後に著者は、「自分の仕事では、この助言には従わない」と書いています。
固定ヘッダーは、ごく普通の作りです。それが、ブラウザの見た目の都合で、きれいに出せなくなりました。
「スマホでは、ヘッダーもフッターも固定で付けられないやん」という私のツッコミに近いかと
まず、決まりを知る必要があります。
色を付けた固定の部品を並べた確認用のページを作って、iPhone の実機で、12 通りの組み合わせを試しました。
| 端に接する固定の部品がある | Safari が、その部品の背景色で、時計の部分とアドレスバーの裏を不透明に塗る。帯になり、下の帯は本文も隠す |
|---|---|
| 固定の部品が端に 1 つもない | 帯はできない。本文が、時計の裏からアドレスバーの裏まで、画面いっぱいに描かれる |
| 画面いっぱいの固定の背景 | これだけで帯ができる。このサイトのトップは、3D の背景とヘッダーが原因だった |
| 固定の部品を、下へはみ出させる | はみ出した部分は描かれない。帯の裏を埋めることはできない |
| ::before・::after で色を置く | 色は拾われない。拾われるのは、実際の要素の背景色だけ |
| theme-color | 効かない |
| 端から離れた小さな固定の部品 | 帯にならない(右下の丸いボタンなど) |
| sticky | 文字はバーの裏に出るが、背景が付いてこない |
※ 2026年11月に、iPhone の Safari(iOS 26 以降)で確かめた結果です。Apple が決まりを公開しているわけではないので、OS の更新で変わるかもしれません。
帯の色を決める手がかりは、Safari(iOS26)で背景を上下2色に分割するテクニック(Timelab テックブログ・bassy さん)を参考にしました。
「iOS 26 では theme-color が効かない」「上に固定した部品の背景色が、バーの色になる」という内容で、手元の結果とも合っています。
対応は、大きく2つあります。
塗りつぶすのも、ありです。
でも、せっかく広がった表示領域を、単色でつぶしてしまうのは、もったいない。
このサイトのトップは、全画面で体験してもらうデザインです。帯があると、映画のレターボックスのように見えて、残念でした。
そこで、トップと下層ページで、やり方を分けました。
トップは、端に接する固定の部品を、すべてなくしました。
動かす部分は、こう書いています。
.hero, .closing, #canvas {
position: absolute; /* fixed をやめる */
top: 0; left: 0;
animation: follow linear both;
animation-timeline: scroll(root block);
}
@keyframes follow {
from { translate: 0 var(--off, 0px); }
to { translate: 0 calc(var(--range) + var(--off, 0px)); }
} --range は、スクロールできる長さ(ページの高さ − 画面の高さ)です。
アドレスバーが出入りすると変わるので、JavaScript で見張って、変わったときだけ渡しています。
ここに行き着くまでに、いくつか失敗しました。
この作りは、iPhone の Safari(26 以降)だけに当てています。
ほかのブラウザは、今までどおりの固定のままです。困っていないものは、変えません。
ひとつだけ、あきらめたものがあります。
トップには、画面の下に、いま全体のどのあたりを見ているかを示すプログレスバーを固定していました。
Intro、Profile、Lab、Works、Skills と章の名前が並んでいて、押すとその章へ移動できます。
これは、画面の下端に固定した部品です。iOS 26 の Safari では、バーの下、つまりアドレスバーの裏に、スクロール中の本文がはみ出して見えてしまいます。
下へはみ出させても、描かれない。色で埋めれば、それが帯になる。いろいろ試しましたが、きれいに収める方法は見つかりませんでした。
気に入っていた部品でしたが、スマホでは、泣く泣く消しました。
章への移動は、ハンバーガーメニューからできます。パソコンでは、今までどおり表示しています。
下層ページは、読むためのページです。トップほど凝ったことは、していません。
やったことは、3つです。
body {
background: radial-gradient(ellipse at top, #13223d 0%, #0a1220 60%, #05080f 100%);
background-color: #05080f; /* これがないと、帯が白くなる */
}
暗い色のサイトで、上下だけ白くなっている場合は、ここを疑ってみてください。
固定ヘッダーや、下に固定したボタンのあるサイトは、たくさんあります。
1年以上、気づかないままになっているサイトも、多いはずです。自分がそうでした。
色を合わせるだけなら、すぐに直せます。
全画面で見せたいサイトは、固定をやめるところまで、考えてみる価値があります。
| 固定に見せる | position: absoluteCSS のスクロール連動アニメーション(animation-timeline: scroll())使えないときは JavaScript(requestAnimationFrame) |
|---|---|
| 背景 | three.jsキャンバスを上下に 110px ずつ広げ、その分カメラの画角を広げる |
| 当てる範囲 | iPhone の Safari 26 以降だけ(ユーザーエージェントで判定) |
| 下層ページ | スクロールでヘッダーを隠す JavaScriptヘッダーを position: absolute にして、スクロール連動アニメーションで動かすbackground-color の指定 |