一个神奇的svh:解决iOS saferi高度问题
100svh 是专门为了解决 iOS Safari 这个经典问题而引入的。让我详细解释一下为什么它这么神奇:
为什么 100svh 有效?
iOS Safari 视口单位的演变:
-
100vh- 大视口高度-
包含地址栏和工具栏
-
当滚动时工具栏隐藏,但高度不变
-
导致底部内容被遮挡
-
-
100svh- 小视口高度-
始终是可见区域的高度(不包含工具栏)
-
工具栏显示/隐藏时,这个值保持一致
-
完美解决内容被底部栏遮挡的问题
-
-
100dvh- 动态视口高度-
动态变化,随工具栏显示/隐藏而变化
-
可能导致页面跳动
-
-
100lvh- 大视口高度-
与
100vh类似,包含工具栏
-
实际效果对比:
/* 问题:底部被遮挡 */ .container-vh { height: calc(100vh - 280px); /* 在 iOS 上会超出 */ } /* 解决方案:完美适配 */ .container-svh { height: calc(100svh - 280px); /* 刚好在安全区域内 */ }
浏览器支持情况:
-
iOS Safari 15+ ✅ 完全支持
-
Chrome 108+ ✅ 支持
-
Firefox 101+ ✅ 支持
-
Edge 108+ ✅ 支持
完整的最佳实践:
.container { padding: 20px; margin-top: 42px; /* 首选方案 */ height: calc(100svh - 280px); /* 后备方案(不支持 svh 时) */ height: calc(100vh - 280px); /* 如果 dvh 支持更好,可以用这个 */ @supports (height: 100dvh) { height: calc(100dvh - 280px); } overflow-y: auto; -webkit-overflow-scrolling: touch; background: red; }
结合其他 iOS 修复:
.container { /* 基础样式 */ padding: 20px; margin-top: 42px; overflow-y: auto; -webkit-overflow-scrolling: touch; /* 视口高度(按优先级) */ height: calc(100svh - 280px); /* 1. 首选 */ height: calc(100dvh - 280px); /* 2. 备选 */ height: calc(100vh - 280px); /* 3. 最终后备 */ /* 防止弹性滚动问题 */ overscroll-behavior-y: contain; /* 处理底部安全区域 */ padding-bottom: env(safe-area-inset-bottom); /* 盒子模型 */ box-sizing: border-box; }
渐进增强方案:
<style> .container { padding: 20px; margin-top: 42px; overflow-y: auto; -webkit-overflow-scrolling: touch; /* 默认值(假设 800px 作为后备) */ height: 520px; /* 800-280 */ } /* 如果支持 svh */ @supports (height: 100svh) { .container { height: calc(100svh - 280px); } } /* 如果支持 dvh 但不支持 svh */ @supports (height: 100dvh) and (not (height: 100svh)) { .container { height: calc(100dvh - 280px); } } </style> <!-- 如果有需要,可以添加 JS 检测 --> <script> // 检测 svh 支持并添加类名 if (CSS.supports('height', '100svh')) { document.documentElement.classList.add('supports-svh'); } else if (CSS.supports('height', '100dvh')) { document.documentElement.classList.add('supports-dvh'); } </script>
调试技巧:
/* 添加调试边框查看实际尺寸 */ .debug .container { border: 2px solid #00ff00 !important; position: relative; } .debug .container::after { content: '高度: ' attr(style); position: absolute; top: 0; right: 0; background: rgba(0,0,0,0.7); color: white; padding: 5px; font-size: 12px; }
实际部署建议:
-
首选方案:直接使用
100svh -
监测支持情况:可以添加简单的统计,看看用户浏览器支持情况
-
优雅降级:对于不支持的用户,可以用 JS 动态计算高度
现在你知道为什么 100svh 这么神奇了吧?它是现代 CSS 为移动端开发的痛点量身定制的解决方案!🎉
一句话总结:对于 iOS Safari 的视口高度问题,100svh 就是官方的最佳答案!
============ 欢迎各位老板打赏~ ===========
与本文相关的文章
- · 解决flex-direction: column 之后元素宽度自动变为100%
- · h5吹气互动(利用recorderjs获取输入音量大小)
- · 如何用一行 CSS 分别实现 10 种现代布局?
- · [转]纯CSS 实现radio checkbox样式美化
- · 如何用Fiddler对手机(安卓/iOS)数据进行抓包
- · css cursor 的可选值(鼠标的各种样式)
- · CSS里padding和width的问题
- · CSS浏览器兼容
- · 开发第一个iPhone程序:Hello World
- · CSS重置CSS多浏览器兼容
- · 你不得不收藏的30个CSS代码片段
- · 如何写兼容所有浏览器的CSS
