解决吸底按钮被遮挡、iOS “小黑条”兼容问题,基于
env()
与constant()
的 CSS 安全区域适配。
从 iPhone X 开始,iOS 引入了底部的 “Home 指示条”(俗称“小黑条”),这导致页面底部元素若处理不当,容易出现:
实现页面底部元素(如按钮、工具栏等)在 iOS 刘海屏下不被遮挡,且 Android、普通 iOS 设备兼容良好。
env()
与 constant()
Safe Area 指设备不被物理结构(如圆角、刘海、Home 指示条)遮挡的区域。
iOS 11+ 引入了安全区域相关的 CSS 环境变量:
CSS 变量名 | 说明 |
---|---|
safe-area-inset-top |
与顶部安全区的距离 |
safe-area-inset-right |
与右侧安全区的距离 |
safe-area-inset-bottom |
与底部安全区(小黑条)距离 |
safe-area-inset-left |
与左侧安全区的距离 |
padding-bottom: constant(safe-area-inset-bottom); /* iOS 11.0 - 11.1 */
padding-bottom: env(safe-area-inset-bottom); /* iOS 11.2+ */
才有效;constant()
已被废弃,但 iOS 11.2 以下仍需兼容;constant()
,再写 env()
。bottom: 0
)CSS 方案一(推荐)——使用 padding-bottom:
.footer-fixed {
position: fixed;
bottom: 0;
left: 0;
right: 0;
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
background: #fff;
z-index: 999;
}
优点:
适用组件:
calc()
动态扩展高度适用于高度定死的吸底元素,比如:工具栏
.footer-calc {
height: calc(60px + constant(safe-area-inset-bottom));
height: calc(60px + env(safe-area-inset-bottom));
}
**注意:**扩展区域必须有背景色,否则会“穿帮”:
background-color: #fff;
创建一个单独的占位空 div,放置在页面最底部:
<view class="safe-area-placeholder">view>
<view class="footer-button">提交view>
.safe-area-placeholder {
height: constant(safe-area-inset-bottom);
height: env(safe-area-inset-bottom);
background: #fff;
}
.footer-button {
position: fixed;
bottom: 0;
width: 100%;
}
优点: 样式独立、组件好维护、无背景遮盖问题。
components/safe-footer/index.vue
调用:
<safe-footer>
<button class="footer-btn">立即提交button>
safe-footer>
在 app.json
或页面 HTML 里确保添加如下内容:
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
想让这部分样式只在支持 env()
的环境中生效?你可以这样写:
@supports (padding-bottom: env(safe-area-inset-bottom)) {
.footer {
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
}
}
方案 | 推荐指数 | 优点 | 适用场景 |
---|---|---|---|
padding-bottom |
⭐⭐⭐⭐⭐ | 简洁通用,样式独立 | 提交按钮、操作条 |
calc() 动态高度 |
⭐⭐⭐ | 高度定死时可用 | 工具栏 |
占位色块方案 | ⭐⭐⭐⭐ | 无需改动主区域结构,易封装 | 插件化组件封装场景 |
@supports | ⭐⭐⭐ | 兼容性提升,优雅降级 | 老设备或特殊需求 |
适配刘海屏、全屏手机已经是前端开发的基本功。微信小程序虽然提供了丰富的原生支持,但细节仍需开发者手动处理。本文希望为你提供实用、可靠的底部适配方案。