旧版ios指ios 9.1等早期系统,2015年10月发布,主推表情符号扩展、live photos及ipad pro支持,属ios 9系列首次重要更新,现仅限旧设备使用且不再常规推送。

旧版 iOS(env(),必须用 constant() 回退
iOS 11.0–11.1 的 WebKit 内核根本不认识 env(),遇到就整条 CSS 声明丢弃——不是返回 0,是直接失效。此时若只写 padding-bottom: env(safe-area-inset-bottom),底部内容会直接掉进黑条里。constant() 是当时唯一的可用方案,虽然后来被废弃,但仍是兼容旧版的强制手段。
-
constant(safe-area-inset-bottom)在 iOS 11.0–11.1 中有效,值约为 34px(iPhone X)或 21px(iPad Pro) - 必须写在
env()之前,否则会被新声明覆盖(CSS 层叠规则) - 不能合并成一条:写成
padding-bottom: constant(safe-area-inset-bottom), env(safe-area-inset-bottom)是非法语法,整条无效
@supports 检测对旧版 iOS 完全没用,别白费力气
iOS 11.1 及更早版本连 @supports 都不支持,写了等于注释。所有适配逻辑必须靠层叠顺序硬编码,不能依赖特性检测包裹。
- 默认 fallback 值(如
padding-bottom: 16px)必须写在@supports外部,否则老设备渲染为空白 -
@supports (padding-bottom: env(safe-area-inset-bottom))这种写法在 iOS 11.2+ 才开始生效,旧版 Safari 直接跳过整块规则 - 不要试图用 JS 检测 UA 判断 iOS 版本——微信、企业微信等容器会伪造 UA,不可靠
viewport-fit=cover 缺一不可,否则 constant() 也白写
即使写了 constant(),如果 <meta name="viewport"> 里没带 viewport-fit=cover,系统根本不会注入安全区变量,constant(safe-area-inset-bottom) 就永远返回 0px。
- 完整 viewport 声明必须是:
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"> - 漏掉
initial-scale=1.0或拼错viewport-fit(比如写成viewprot-fit),iOS Safari 就拒绝启用安全区支持 - 微信内置浏览器 8.0.22 之前版本不支持
viewport-fit,此时constant()和env()全部失效,只能靠 UA + 高度判断做降级
fixed 底部元素不能只靠 padding-bottom,得用 bottom 偏移
给 position: fixed; bottom: 0 的 tabbar 加 padding-bottom: constant(safe-area-inset-bottom) 是无效的——padding 不改变 fixed 元素在视口中的位置,只撑内部内容。内容仍可能被遮挡。
- 正确做法是叠加
bottom值:bottom: 0; bottom: constant(safe-area-inset-bottom); bottom: env(safe-area-inset-bottom); - 顺序不能错:兜底值在前,
constant()居中,env()在最后,靠 CSS 层叠覆盖生效 - 如果同时要加间距(比如 8px),不要写
calc(8px + constant(...)),旧版 Safari 15.4 之前不支持 calc 里混用constant(),应改用两层 padding:padding-bottom: 8px; padding-bottom: calc(8px + constant(safe-area-inset-bottom));
document.querySelector('meta[name="viewport"]').content 的输出值。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











