iPhoneX安全区域(Safe Area)底部小黑条在微信小程序和H5的屏幕适配

1.2.微信小程序适配iPhoneX底部小黑条(Home Indicator)

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

3.H5适配iPhoneX底部小黑条(Home Indicator)
· 适配方案:使用苹果官方推出的css函数env()、constant()来适配 (推荐)

  1. 安全区域是什么意思?
    想要解决内容与小黑线重叠的问题,我们需要先了解清楚苹果对于安全区域的定义。

    适配安全区域也就是让小程序或者H5的内容显示在中间Safa Area区域部分。
    在这里插入图片描述

    同时安全区域是在IOS11之后并且是iPhoneX及以上机型才有的,所以需要适配的是这一类机型(为了 方便,下文中统称这类需要适配的机型为iPhoneX),更老的机型则不需要考虑适配问题。

方案一: 使用已知底部小黑条高度34px/68rpx来适配,(不推荐,不多写)
方案二: 使用微信官方API,getSystemInfo()中的safeArea对象进行适配(推荐)

step1:判断是否是需要适配的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)) 
	}

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

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

//方法二:使用wx.getSystemInfoSync()中的screenHeight和safeArea的bottom判断
const isIPhoneX = () => {
  let screenHeight = wx.getSystemInfoSync().screenHeight
  let bottom = wx.getSystemInfoSync().safeArea.bottom
  return screenHeight !== bottom
}

方案三:使用苹果官方推出适配方案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()需要同时存在,而且顺序不能换。

  1. 在H5上适配安全区域
    在H5上适配安全区域就方便多了,采用viewport+env+constant方案。
    viewport-fit 默认有3个值:

contain:可视窗口完全包含网页内容(左图)
cover:网页内容完全覆盖可视窗口(右图)
auto:默认值,此值不影响初始布局视图端口,并且整个web页面都是可查看的。

而我们需要将viewport设置为cover,env和constant才能生效。设置代码如下

<meta name="viewport" content="width=device-width,initial-scale=1.0,viewport-fit=cover">

同时设置env和constant代码,同样env()和constant()需要同时存在,而且顺序不能换。

/* 可以通过增加padding-bottom来适配 */
padding-bottom: constant(safe-area-inset-bottom); /*兼容 IOS<11.2*/
padding-bottom: env(safe-area-inset-bottom); /*兼容 IOS>11.2*/

/* 可以通过margin-bottom来适配 */
margin-bottom: constant(safe-area-inset-bottom);
margin-bottom: env(safe-area-inset-bottom);

/* 或者改变高度*/
height: calc(55px +  constant(safe-area-inset-bottom));
height: calc(55px +  env(safe-area-inset-bottom))

还有一种是使用 @supports 隔离兼容样式
可以使用 @supports 来隔离兼容样式,当浏览器支持bottom: constant(safe-area-inset-bottom)或者bottom: env(safe-area-inset-bottom)的时候,bottom-button类就会新增margin-bottom的样式

@supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) { 
	.bottom-button {
    	margin-bottom: constant(safe-area-inset-bottom);
        margin-bottom: env(safe-area-inset-bottom);  
    }
}

如果对你有帮助的话,点赞、评论、赞赏都是对我的鼓励,也是支持我写下去的动力,谢谢!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值