一、前言

  • 在苹果 iPhoneX 、iPhone XR等设备上,可以看到物理Home键被取消,改为底部小黑条替代home键功能。微信小程序和 h5 网页需要针对这种情况进行适配,否则可能会遇到底部按钮或选项卡栏与底部黑线重叠的情况。

    二、安全区域

    2.1 安全区域是什么意思?

  • 安全区域指的是一个可视窗口范围,处于安全区域的内容不受圆角(corners)、齐刘海(sensor housing)、小黑条(Home Indicator)的影响。

小程序iPhone底部安全距离适配 - 图1

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。
  1. <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">

三、场景描述

3.1 iPhoneX底部布局正常

小程序iPhone底部安全距离适配 - 图2
第一步:页面代码

  1. <template>
  2. <view class="home-page">
  3. <NavBar mode="black" title="标准化决策" :needBack="false" bgColor="#fff"></NavBar>
  4. <!-- 公司信息 -->
  5. <view class="company">
  6. <view class="name">浙江省农业科学院检测</view>
  7. <view class="name">杭州领见数字农业科技有限公司负责运行维护</view>
  8. </view>
  9. </view>
  10. </template>

第二步:scss代码
注意:home-page中的高度设置height: calc(100vh - 48px - env(safe-area-inset-bottom)); /当前屏幕可见高度 - 自定义tab高度(48px) - IOS手机安全区域距离底部边界的距离/

  1. <style scoped lang="scss">
  2. .home-page {
  3. height: calc(100vh - 48px - constant(safe-area-inset-bottom)); /* 兼容 iOS < 11.2 */
  4. height: calc(100vh - 48px - env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */
  5. padding: 0 32rpx;
  6. background-color: #f5f5f5;
  7. display: flex;
  8. justify-content: center;
  9. flex-direction: column;
  10. justify-content: flex-start;
  11. position: relative;
  12. .company {
  13. position: absolute;
  14. bottom: 32rpx;
  15. left: 0;
  16. right: 0;
  17. margin: auto;
  18. .name {
  19. font-size: 20rpx;
  20. font-family: PingFangSC-Regular, PingFang SC;
  21. font-weight: 400;
  22. color: #aaaaaa;
  23. line-height: 28rpx;
  24. text-align: center;
  25. }
  26. }
  27. }
  28. </style>

3.2 iPhoneX底部布局错误

小程序iPhone底部安全距离适配 - 图3
Scss代码中home-page中的高度设置为height: calc(100vh - 48px);
出现原因:高度未减去 safe-area-inset-bottom

四、注意点

  • manifest.json

把transformPx 置为false,如果为true 会自动把px替换为rpx。

  1. {
  2. "transformPx": false,
  3. }