env(safe-area-inset-*)必须配合viewport-fit=cover才能生效,否则在ios safari中恒为0px;需用calc()包裹并提供fallback值,且仅适用于ios 11.2+,旧版本需constant()降级兼容。

直接结论:用 env(safe-area-inset-*) 配合 padding 或 margin 是最稳妥的适配方式,但必须加 viewport-fit=cover 才生效,否则值恒为 0。
为什么 env() 在 iPhone 上返回 0?
这是最常见的卡点——明明写了 padding-top: env(safe-area-inset-top),却完全没效果。根本原因是 Safari 默认把网页限制在安全区域内渲染,env() 的值被强制设为 0。必须显式告诉浏览器“我要撑满屏幕”:
- 在
中添加:<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"> - 缺了
viewport-fit=cover,env(safe-area-inset-top)等永远是 0,不是 bug,是设计行为 - iOS 11+ 支持,iOS 10 及更早版本不支持
env(),需降级处理(如用@supports包裹)
safe-area-inset-* 四个值分别对应什么位置?
它们是只读环境变量,数值单位是 px,表示当前设备安全区域边界到视口边缘的距离:
-
env(safe-area-inset-top):刘海/状态栏下方到视口顶部的距离(iPhone X/XS/12/13/14/15 系列约 44px) -
env(safe-area-inset-bottom):Home Indicator 上方到视口底部的距离(约 34px) -
env(safe-area-inset-left)和env(safe-area-inset-right):在横屏或某些 iPad 场景下可能非零,但 iPhone 竖屏通常为 0 - 注意:这些值会随屏幕方向变化实时更新,无需监听,CSS 自动响应
怎么写才不会遮挡内容又不浪费空间?
关键原则:只对真正需要避开安全区域的元素应用,避免全局滥用。常见错误是给 加 padding,导致整个页面“下沉”:
- 推荐做法:仅对固定定位的顶部导航栏、底部操作栏、全屏弹窗等使用
padding或margin - 示例(顶部导航):
.header { padding-top: env(safe-area-inset-top); } - 示例(底部按钮):
.fixed-bottom { padding-bottom: env(safe-area-inset-bottom); } - 慎用
env()做高度计算(如height: calc(100vh - env(safe-area-inset-bottom))),因为vh在 Safari 中本就存在兼容性问题,叠加后更难控制
真正容易被忽略的是:env() 不是万能补丁,它只解决“物理遮挡”,不解决“视觉层级”——比如一个 position: fixed; top: 0 的弹窗,即使加了 padding-top,也可能被系统状态栏半透明覆盖。这时候得配合 z-index 和背景色强化隔离。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











