微信小程序 -- ios 底部小黑条安全距离兼容解决方案(转载)

本文介绍在微信小程序及H5页面中如何适配iPhoneX等设备底部的安全区域,避免底部元素与小黑条重叠。提供了三种方案:直接使用固定高度、利用微信API获取安全区域信息以及采用苹果官方CSS函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

三种方案:

使用已知底部小黑条高度34px/68rpx来适配(不推荐)
使用微信官方API,getSystemInfo()中的safeArea对象进行适配(推荐)
使用苹果官方推出的css函数env()、constant()适配(推荐)

方案一:使用已知底部小黑条高度34px/68rpx来适配(不推荐)

这是比较老的方法,跟方案2、3比已经不推荐了,大家可以了解了解,着急可以直接看方案2和3。

从网上了解到,iPhone底部的小黑条(Home Indicator)高度是34px,实际我也在真机确认了是34px,所以可以根据该值,设置底部按钮或选项卡的margin-bottom、padding-bottom、height等,或者添加一个div来占位小黑条的位置。

这样做要有一个前提,需要判断当前机型是需要适配安全区域的机型。

问题:如何判断当前机型是需要适配安全区域

2种方案:
使用wx.getSystemInfoSync()的model属性判断
使用wx.getSystemInfoSync()中的screenHeight和safeArea对象的bottom属性判断
方法一:使用wx.getSystemInfoSync()的model属性判断
已知市面上已有的带安全区域的苹果设备包括iPhone X、iPhone XR、iPhone XS Max、iPhone 11、iPhone 11 Pro、iPhone 11 Pro Max,所以可以直接从getSystemInfoSync()方法中拿到model属性进行判断。iPhone系列微信还未适配手机的model返回值为unknown(iphone),也可以提前做适配。

let IPHONE_X = /iphone x/i
let IPHONE_X_11 = /iphone 11/i
let IPHONE_UNKNOWN = /unknown\(iphone\)/i

//方法一:使用model判断是否是IPhoneX及其他包含安全区域的机型手机
const isIPhoneX = () => {
  let model = wx.getSystemInfoSync().model
  return (model.search(IPHONE_X) > -1 || model.search(IPHONE_X_11) > -1 ||
    model.search(IPHONE_UNKNOWN) > -1)
}

//也可以使用正则表达式判断
const isIPhoneXRegex = () => {
  let model = wx.getSystemInfoSync().model
  return (/iphone\sx/i.test(model)
    || (/iphone/i.test(model) && /unknown/.test(model))
    || /iphone\s11/i.test(model)) 
}

方法二:使用wx.getSystemInfoSync()中的screenHeight和safeArea对象的bottom属性判断
这里使用screenHeight而不是windowHeight,因为bottom是以屏幕左上角为原点开始计算的,所以需要的是屏幕高度,对比screenHeight和bottom,如果相等则说明不需要适配,不相等则需要适配。

**注意:**如果使用微信开发者工具中的模拟器,screenHeight和bottom始终是相等的,需要用真机来测试。

//方法二:使用wx.getSystemInfoSync()中的screenHeight和safeArea的bottom判断

const isIPhoneX = () => {
  let screenHeight = wx.getSystemInfoSync().screenHeight
  let bottom = wx.getSystemInfoSync().safeArea.bottom
  return screenHeight !== bottom
}

解决了如何判断设备是iPhoneX的问题,就可以写代码了。

<view class="bottom-button {{isIpX ? 'view-IPX' : ''}}">底部按钮</view>

方案二:使用微信官方API,getSystemInfo()中的safeArea对象进行适配(推荐)

使用wx. getSystemInfo()中的safeArea对象获取底部小黑条的高度

step 1:使用上面讲的方法先判断是否是需要适配的iPhone机型
step 2:如果是需要适配的机型,使用safeArea中的bottom,得到安全区域底部纵坐标,然后使用screenHeight减去bottom就能得到小黑条的高度。保存到localstorage里面,全局都可以使用。

iPhoneXSMAX-getSystemInfoSync获得的对象.jpeg

方案三:使用苹果官方推出适配方案css函数env()、constant()来适配 (推荐)

苹果官方推荐使用env(),constant()来适配,建议使用该方案,不需要管数值具体是多少。这2个方法是什么呢?

  • env()和constant(),是IOS11新增特性,Webkit的css函数,用于设定安全区域与边界的距离,有4个预定义变量:
    safe-area-inset-left:安全区域距离左边边界的距离
    safe-area-inset-right:安全区域距离右边边界的距离
    safe-area-inset-top:安全区域距离顶部边界的距离
    safe-area-inset-bottom :安全距离底部边界的距离

因为目标是需要对底部小黑条做适配,所以只需要关注safe-area-inset-bottom这个值。

而env()和constant()函数有个必要的使用前提,当网页设置viewport-fit=cover的时候才生效,根据微信小程序的表现和我在实际真机测试时这两个函数生效,推测小程序里的viewport-fit默认是cover。

有一点要注意,在IOS11.2系统以前,可以使用constant()函数,但是在IOS11.2系统以后,这个函数就被废弃了,被env()函数替代了。官方原话如下:

The env() function shipped in iOS 11 with the name constant(). Beginning with Safari Technology Preview 41 and the iOS 11.2 beta, constant() has been removed and replaced with env(). You can use the CSS fallback mechanism to support both versions, if necessary, but should prefer env() going forward.

所以我们在做屏幕适配时,需要这样写:

padding-bottom: constant(safe-area-inset-bottom); /*兼容 IOS<11.2*/
padding-bottom: env(safe-area-inset-bottom); /*兼容 IOS>11.2*/

**注意:**env()和constant()需要同时存在,而且顺序不能换。

本文转载于 程序员张晴天
原文地址: https://blog.csdn.net/sinat_24946363/article/details/105181622

参考资源链接:[iPhoneX底部适配:安全区域在微信小程序与H5解决方案](https://wenku.csdn.net/doc/64525e37fcc5391368007ca8?utm_source=wenku_answer2doc_content) 为了确保在iPhoneX及以上型号的iOS设备上,微信小程序与H5页面的内容不被底部小黑遮挡,推荐使用CSS环境变量env()和constant()来正确适配。首先,你需要在微信小程序CSS中使用env()函数来设置底部安全距离,或者对于支持constant()的浏览器,也可以使用constant()函数。例如,可以设置底部元素的padding-bottom为env(safe-area-inset-bottom),这样底部元素就会自动适应安全区域,避免与小黑重叠。对于微信小程序,虽然不直接支持CSS环境变量,但可以使用微信小程序提供的CSS兼容层功能,通过wxs文件定义相应的安全区域变量,并在wxss文件中引用这些变量。同时,确保你的小程序或网页能够检测到运行设备是否为iPhoneX或更高型号,以便动态地应用这些CSS规则。例如,可以在小程序的wxs文件中获取设备信息,并根据设备类型和屏幕高度判断是否需要进行适配。当确定设备为iPhoneX或更高型号时,再应用安全区域相关的CSS样式。在开发过程中,可以利用开发者工具进行模拟测试,确保在不同设备和不同屏幕尺寸上都能达到良好的显示效果。通过这种适配方案,可以提升用户体验,并确保内容的正确显示。 参考资源链接:[iPhoneX底部适配:安全区域在微信小程序与H5解决方案](https://wenku.csdn.net/doc/64525e37fcc5391368007ca8?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值