env(safe-area-inset-bottom) 是 iPhone X 及后续机型适配底部横条的唯一可靠 CSS 方式,但必须配合 viewport-fit=cover 的 meta 标签、作用于 body 或全屏容器,并用 @supports 提供 fallback,默认值建议设为略大于 34px 的值。

iPhone X 及后续机型的底部横条(Home Indicator)会遮挡页面内容,env(safe-area-inset-bottom) 是唯一可靠方式让 CSS 主动感知这个安全区域高度,但直接写 padding-bottom: env(safe-area-inset-bottom) 很容易失效——关键在于它只在 viewport 元素上生效,且必须配合正确的 viewport 设置。
viewport meta 标签必须启用 viewport-fit=cover
没有这个声明,env() 函数返回值恒为 0,无论设备是否带刘海或横条。iOS Safari 会强制将页面缩放到“视觉视口”内,安全区域信息被忽略。
正确写法:
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
常见错误:
立即学习“前端免费学习笔记(深入)”;
- 漏掉
viewport-fit=cover(最常见) - 写了但拼错成
viewprot-fit或viewport-fit=contain - 用 JavaScript 动态插入 meta 标签(iOS 不识别动态设置)
env() 只对 body 或全屏容器生效,不能用在任意元素上
env(safe-area-inset-bottom) 的计算上下文绑定在根视口(即 <html> 或 <body>),对子元素直接使用往往无效,尤其当父容器设置了 overflow: hidden 或 position: fixed 时。
推荐做法:
- 给
<body>添加padding-bottom: env(safe-area-inset-bottom) - 若用固定底部导航栏,给该容器加
padding-bottom: env(safe-area-inset-bottom),同时确保其父容器未裁剪溢出 - 避免在 flex item 或 grid cell 内直接调用
env()做 margin/padding——优先提升到布局容器层级
需要 fallback:env() 在不支持的浏览器里返回 auto 或无效值
Android、旧版 Safari、桌面浏览器不支持 env(),直接写会导致 padding 失效或异常。必须用 @supports 包裹,同时提供默认值。
正确写法示例:
body {<br> padding-bottom: 20px;<br>}<br>@supports (padding-bottom: env(safe-area-inset-bottom)) {<br> body {<br> padding-bottom: env(safe-area-inset-bottom);<br> }<br>}
注意点:
- 不要用
@supports (env(safe-area-inset-bottom))——语法错误,必须带属性名和值 - fallback 值(如
20px)应略大于实际横条高度(通常 34px),避免在非 iPhone 设备上留白过多 - 不要依赖 JS 检测
env()是否可用——CSS 原生支持才是唯一可靠路径
真正麻烦的不是写对那行 env(),而是它依赖 viewport 声明、生效范围有限、且无降级时行为不可控。很多项目线上 bug 都是 fallback 值没设或 meta 标签漏了 cover 导致的——这两处检查比写样式本身更关键。


















