刘海屏设备下全屏背景总被状态栏遮挡怎么办?
最近在做全屏背景图的时候发现,iPhone 14 Pro的刘海区域总会有一块地方显示不出来,用safe-area-inset设置的padding反而把内容推下去了,但背景图还是被刘海遮住了一角。
试过这样写CSS:
body {
margin: env(safe-area-inset-top) 0 env(safe-area-inset-bottom);
padding: 0;
min-height: calc(100vh - env(safe-area-inset-top) - env(safe-area-inset-bottom));
}
结果底部导航栏区域出现了滚动条,而且背景图的fixed定位元素还是贴到刘海下面去了。查了文档说是需要同时处理padding和定位,但具体怎么组合才能兼容Android和iOS的刘海屏呢?
env(safe-area-inset-top)控制 margin 或 padding,但没处理 fixed 元素的定位逻辑。背景图如果用的是position: fixed; top: 0;,那它一定会从屏幕最顶上开始渲染,刘海区域自然就被切了。正确做法是让全屏容器本身避开安全区影响,同时保证内容和背景都能完整覆盖可视窗口。
先改 HTML 结构,加个根层容器:
然后这样写 CSS:
关键点在于
.bg-image的top和left要用负值把安全区“拉回来”,这样背景就能突破 safe area 向外扩展。而.full-screen-layout的 padding 确保内容不会被遮挡,这样布局和视觉就分开了,互不干扰。这个方案在 iPhone 各型号、Android 刘海机上都测过,兼容性没问题。而且不用 JS,纯 CSS 解决,这样更清晰。