刘海屏设备下使用vh单位布局时,如何避免内容被刘海遮挡? Tr° 梓涵 提问于 2026-01-31 12:34:27 阅读 97 移动 我在开发一个全屏显示的页面时遇到了问题,用100vh设置高度在普通手机上没问题,但在iPhone 14 Pro的刘海屏上底部内容被刘海区域遮挡了一部分,看起来就像这样: 标题栏 内容区域 我尝试过用padding-bottom调整,也查了apple的viewport-fit=cover参数,但修改后页面边缘会出现横向滚动条。有没有什么方法能准确计算刘海屏的可用高度?或者需要配合JavaScript检测刘海区域的尺寸? 我来解答 赞 14 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 增梅 Dev Lv1 刘海屏这个问题确实挺烦人的,特别是iPhone那个动态岛出来之后更复杂了。我之前也被坑过几次,现在告诉你几个靠谱的解决方案。 首先你要明白为什么100vh会出问题。vh单位是基于整个视口高度的,但刘海屏的实际可用高度会比视口高度小。苹果提供了safe-area-inset-*系列CSS变量来处理这个问题。 推荐的做法是用CSS的env()函数配合viewport-fit=cover: 1. 在meta标签里加上viewport-fit=cover <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"> 2. 然后CSS里这样写: body { padding-top: env(safe-area-inset-top); padding-bottom: env(safe-area-inset-bottom); min-height: 100vh; /* 这个100vh是回退方案 */ min-height: calc(100vh - env(safe-area-inset-top) - env(safe-area-inset-bottom)); } 如果你需要精确控制整个页面的高度,可以这样: .container { height: calc(100vh - env(safe-area-inset-top) - env(safe-area-inset-bottom)); overflow-y: auto; } 如果遇到横向滚动条问题,通常是padding导致的,可以这样修复: html { box-sizing: border-box; } *, *:before, *:after { box-sizing: inherit; } 实在不行的情况下再用JavaScript检测,但能CSS解决的就不要用JS: // 获取安全区域高度 function getSafeAreaHeight() { return window.innerHeight - parseInt(getComputedStyle(document.documentElement).getPropertyValue('--sat')) - parseInt(getComputedStyle(document.documentElement).getPropertyValue('--sab')); } 几个注意事项: 1. env()和constant()在iOS11+都支持,但新版本用env()就行 2. 测试时一定要在真机上测,模拟器有时候不准 3. 安卓手机也有类似的坑,但处理方式不同 4. 如果用了fixed定位的元素,也要加上safe-area-inset的padding 记住永远不要相信100vh在移动设备上的表现,这玩意坑了无数前端开发者。我上周还在为一个华为手机的圆角屏适配熬夜改代码... 回复 点赞 3 2026-03-07 01:01 爱敏 Lv1 用 viewport-fit=cover 加 env(safe-area-inset-top) 和 env(safe-area-inset-bottom) 就行。 <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"> 然后样式: body { padding-top: env(safe-area-inset-top); padding-bottom: env(safe-area-inset-bottom); } 横向滚动条是其他地方出了问题,检查下宽高设置。 回复 点赞 15 2026-02-01 10:02 加载更多 相关推荐 1 回答 89 浏览 React用vw/vh布局时滚动条出现页面错位怎么办? 我在做移动端页面时用了100vh设置容器高度,但页面出现滚动条后底部元素就被截断了,试过calc(100vh - env(safe-area-inset-bottom))也不管用,求大神指点 比如这个... 伊果 移动 2026-02-12 22:20:33 1 回答 83 浏览 vw/vh在移动端适配时为什么有时候失效? 我用 vw 做了一个全屏的卡片组件,但在某些安卓机上高度明显不对,vh 好像没生效。试过加 meta viewport 了,还是不行。 这是我的 Vue 组件代码: <template> ... 长孙秀云 移动 2026-03-16 09:54:20 1 回答 41 浏览 用 vw 做响应式布局在 iOS 上高度计算不对怎么办? 我在 Vue 项目里用 vh 设置页面高度,结果在 iPhone 上显示不全,底部被截掉了。安卓和桌面浏览器都正常,就 iOS Safari 出问题。试过用 100vh,也试过动态计算 window.... FSD-恒硕 移动 2026-03-21 13:51:19 2 回答 67 浏览 rem和em在移动端响应式布局中如何配合使用? 最近在做移动端适配时发现一个问题,当同时使用rem和em时,字体大小总是忽大忽小。比如设置了html{font-size:16px},然后用em的子元素又套了rem,结果在iPhone12上显示正常,... 迷人的康平 移动 2026-02-08 23:15:25 1 回答 23 浏览 首屏加载时如何正确实现 Loading 占位避免布局抖动? 我在做首页优化,数据还没回来的时候想用 skeleton loading 占位,但每次数据加载完 DOM 结构一变,页面就会“跳一下”,体验很差。我试过给容器写死高度,但不同设备下内容高度不一样,不太... 设计师小倩 优化 2026-03-31 08:49:14 1 回答 20 浏览 前端如何检测 iOS 越狱设备? 最近在做移动端 H5 应用,产品要求对越狱的 iOS 设备做限制。我在网上查到一些 JS 检测方案,比如检查某些特殊路径是否存在,但试了几个都不太靠谱。 比如这段代码: fetch('/et... 梦玲 移动 2026-03-30 23:28:17 1 回答 53 浏览 占位图加载时如何避免布局偏移? 我在做图片懒加载,用了灰色占位图,但真实图片加载后页面还是会跳一下,怎么解决啊? 已经给 img 加了固定宽高,也试过用 aspect-ratio,但有些图片比例不一致,还是会有抖动。 这是我的写法:... Code°绍懿 优化 2026-03-23 10:46:22 1 回答 44 浏览 Taro 中如何正确使用 CSS Modules 避免样式污染? 我在 Taro 项目里尝试用 CSS Modules 写组件样式,但发现类名没被局部化,还是全局生效了,是不是配置有问题? 我的文件是 index.module.css,也按文档 import 了,但... 公孙一诺 框架 2026-03-21 18:38:17 1 回答 32 浏览 前端如何检测 iOS 越狱设备? 我们 App 有安全要求,需要在前端判断用户是否使用越狱的 iPhone。试过用 JS 检测一些越狱路径,比如 /Applications/Cydia.app,但好像在 Safari 里根本没权限读文... 庆玲 移动 2026-03-15 21:53:15 2 回答 42 浏览 首屏加载时如何用占位图避免布局抖动? 我在做商品列表页的首屏优化,数据还没回来时页面会先空着,等接口返回后突然“跳”出内容,体验很差。试过用<div class="skeleton"></div>做骨架屏,但高度固... 瑞玲 Dev 优化 2026-03-14 23:45:18
首先你要明白为什么100vh会出问题。vh单位是基于整个视口高度的,但刘海屏的实际可用高度会比视口高度小。苹果提供了safe-area-inset-*系列CSS变量来处理这个问题。
推荐的做法是用CSS的env()函数配合viewport-fit=cover:
1. 在meta标签里加上viewport-fit=cover
2. 然后CSS里这样写:
如果你需要精确控制整个页面的高度,可以这样:
如果遇到横向滚动条问题,通常是padding导致的,可以这样修复:
实在不行的情况下再用JavaScript检测,但能CSS解决的就不要用JS:
几个注意事项:
1. env()和constant()在iOS11+都支持,但新版本用env()就行
2. 测试时一定要在真机上测,模拟器有时候不准
3. 安卓手机也有类似的坑,但处理方式不同
4. 如果用了fixed定位的元素,也要加上safe-area-inset的padding
记住永远不要相信100vh在移动设备上的表现,这玩意坑了无数前端开发者。我上周还在为一个华为手机的圆角屏适配熬夜改代码...
viewport-fit=cover加env(safe-area-inset-top)和env(safe-area-inset-bottom)就行。然后样式:
横向滚动条是其他地方出了问题,检查下宽高设置。