Under the glass

Oct 2026

In iOS Safari 26 the toolbar floats over the page as a sheet of glass, and the status bar sits above it. On a full-screen hero you want your image to run under both. Even mymind.com only gets halfway: its page runs under the toolbar, but at the top of the page the status bar stays solid until you scroll. And a fixed hero doesn't get that far: Safari paints both bars a flat colour and the hero stops short.

Here's what I found about how Safari decides, and a recipe that works.

How Safari decides

mymind.com in Safari on iOS 26. At the top of the page the status bar is solid. Once it scrolls, the page shows through both bars.

So the trick is to make the page a little taller than the screen at both ends, and quietly scroll it to the middle.

The recipe

  1. Set viewport-fit=cover. In Next.js: export const viewport = { viewportFit: "cover" }.
  2. Keep the hero in normal flow, not fixed, and make it taller than the screen: calc(TOP + 100dvh + BOTTOM), with TOP at 100px and BOTTOM at 160px, more than any status bar or toolbar.
  3. On mount, lock scrolling and scroll down by TOP. Re-pin on resize; restore both on unmount.
  4. Put the real interface in a band inside it: top: TOP, height calc(100% - TOP - BOTTOM). Let the background fill everything, overhangs included. That's what shows through.
  5. Keep fixed elements away from the top edge. They make Safari paint the bar solid again.
const TOP = 100const BOTTOM = 160useEffect(() => {  const html = document.documentElement  const body = document.body  html.style.overflow = body.style.overflow = "hidden"  const pin = () => window.scrollTo(0, TOP)  pin()  window.addEventListener("resize", pin)  return () => {    window.removeEventListener("resize", pin)    html.style.overflow = body.style.overflow = ""    window.scrollTo(0, 0)  }}, [])

Things that bit me

Tested in the iOS simulator in October 2026. Safari changes this between releases, so re-test before you trust it.