一、前言
在苹果 iPhoneX 、iPhone XR等设备上,可以看到物理Home键被取消,改为底部小黑条替代home键功能。微信小程序和 h5 网页需要针对这种情况进行适配,否则可能会遇到底部按钮或选项卡栏与底部黑线重叠的情况。
二、安全区域
2.1 安全区域是什么意思?
安全区域指的是一个可视窗口范围,处于安全区域的内容不受圆角(corners)、齐刘海(sensor housing)、小黑条(Home Indicator)的影响。
2.2 苹果官方推出适配方案css函数env()、constant()来适配
env()和constant(),是IOS11新增特性,Webkit的css函数,用于设定安全区域与边界的距离,有4个预定义变量:
- safe-area-inset-left:安全区域距离左边边界的距离
- safe-area-inset-right:安全区域距离右边边界的距离
- safe-area-inset-top:安全区域距离顶部边界的距离
- safe-area-inset-bottom :安全区域距离底部边界的距离
2.3 使用前提
env()和constant()函数有个必要的使用前提,H5网页设置viewport-fit=cover的时候才生效,小程序里的viewport-fit默认是cover。
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
三、场景描述
3.1 iPhoneX底部布局正常
第一步:页面代码
<template>
<view class="home-page">
<NavBar mode="black" title="标准化决策" :needBack="false" bgColor="#fff"></NavBar>
<!-- 公司信息 -->
<view class="company">
<view class="name">浙江省农业科学院检测</view>
<view class="name">杭州领见数字农业科技有限公司负责运行维护</view>
</view>
</view>
</template>
第二步:scss代码
注意:home-page中的高度设置height: calc(100vh - 48px - env(safe-area-inset-bottom)); /当前屏幕可见高度 - 自定义tab高度(48px) - IOS手机安全区域距离底部边界的距离/
<style scoped lang="scss">
.home-page {
height: calc(100vh - 48px - constant(safe-area-inset-bottom)); /* 兼容 iOS < 11.2 */
height: calc(100vh - 48px - env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */
padding: 0 32rpx;
background-color: #f5f5f5;
display: flex;
justify-content: center;
flex-direction: column;
justify-content: flex-start;
position: relative;
.company {
position: absolute;
bottom: 32rpx;
left: 0;
right: 0;
margin: auto;
.name {
font-size: 20rpx;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #aaaaaa;
line-height: 28rpx;
text-align: center;
}
}
}
</style>
3.2 iPhoneX底部布局错误
Scss代码中home-page中的高度设置为height: calc(100vh - 48px);
出现原因:高度未减去 safe-area-inset-bottom
四、注意点
- manifest.json
把transformPx 置为false,如果为true 会自动把px替换为rpx。
{
"transformPx": false,
}