奇思乎乎乎 iPhone 16e · 17 系列 · Air - 一束网址,折射万屏
100%

输入网址,立刻开始预览

预设:
自定义:

H5 页面底部安全区适配

iPhone X 以后的机型底部有一条黑色横条(Home Indicator),它会遮挡 H5 页面底部大约 34pt 的内容。如果你的页面有底部按钮、TabBar、浮动操作条,一定会被遮挡。

第一步:开启 viewport-fit=cover。

在 <meta name="viewport"> 里加上 viewport-fit=cover,否则整个页面会被限制在安全区内,底部留一条白色背景。

<meta name="viewport"
      content="width=device-width, initial-scale=1.0, viewport-fit=cover">

第二步:用 env() 补齐底部。

.bottom-bar {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  height: 50px;
  padding-bottom: env(safe-area-inset-bottom);
  /* 兼容旧版 iOS */
  padding-bottom: constant(safe-area-inset-bottom);
}

注意顺序:constant() 在前(iOS 11.0-11.2),env() 在后(iOS 11.2+)。后写的会覆盖前者,两边都能兼容。

第三步:三种常见场景。

  • 底部固定按钮:给按钮容器加 padding-bottom: env(safe-area-inset-bottom),让按钮位置不变,但底部空出安全区。
  • 底部 TabBar:同上。TabBar 高度 = 正常高度 + 安全区高度,在最后一项下加 padding。
  • 全屏滚动内容:给页面容器加 padding-bottom: env(safe-area-inset-bottom),避免最后一行文字被遮挡。

四个常见误区:

  • 写死 34px:不同机型安全区高度不同(iPhone SE 是 0,iPhone 17 是 34),写死会出问题。
  • 只在 iOS 上测:部分安卓机型(如小米 13)也有安全区,需要测安卓。
  • 忘记 viewport-fit=cover:只加 env() 不加 viewport-fit,env() 会返回 0。
  • 用 100vh 布局:100vh 包含安全区,内容会被遮挡,改用 100% 或 calc()。

在下方预览器输入网址,同时对比 iPhone SE(无安全区)和 iPhone 17(34pt 安全区),一眼看出底部是否有遮挡。

常见问题

iPhone 底部安全区是多少像素?
iPhone X 及以后机型是 34pt,iPhone SE 等老机型是 0。不要写死 34px,用 env(safe-area-inset-bottom) 自动适应。
为什么 env(safe-area-inset-bottom) 返回 0?
最常见原因是 viewport meta 里没加 viewport-fit=cover。加上后 env() 才会返回真实安全区高度。
constant() 和 env() 有什么区别?
constant() 是 iOS 11.0-11.2 的语法,env() 是 iOS 11.2+ 的。写 CSS 时两个都写上,后者覆盖前者,能兼容所有 iOS 版本。
安卓手机也有底部安全区吗?
部分有。小米、OPPO 等部分机型的全面屏手势条会占用 24-48pt。env(safe-area-inset-bottom) 在支持该特性的安卓浏览器上也会返回值,所以统一用 env() 是安全的。

相关工具