iPhoneX安全区域与H5引发的兼容适配问题

示例:iPhoneX 取消了物理按键,改成底部小黑条,这一改动导致网页出现了比较尴尬的屏幕适配问题。

一、什么是安全区域?
最近正在开发小程序相关的需求时,遇到了一个问题——ios高版本的安全区域,即iPhoneX及以上拥有的“刘海儿”等可滑动区域会与你开发的内容重合。


幸运的是,在小程序上我们只需要考虑底部的底部Home Indicator上滑指示条。

注意,官方不推荐我们粗暴的将这段区域永久的覆盖,例如压黑边隐藏设备的圆角、刘海、指示条。

同样官方推荐避免将交互元素放在屏幕底部或者角落。 因为从屏幕底部上划被用户激活Home指示条并回到主屏或进入多任务切换,且系统会取消你在这个区域布局的手势。而屏幕角落区域很难触控。


二、预留出Home Indicator指示条
方法一(预留固定的距离)
小程序文档上,会提供我们获取系统信息的API,之后我们要做的是:

判断需要特殊处理的系统型号
添加样式
if(iPhoneX及以上)
    // do something

方法二(ios11 增加新特性)

为了应对刘海屏幕,苹果也给出了响应的策略,如下:

safe-area-inset-left:安全区域距离左边边界距离,一般情况下是 0
safe-area-inset-right:安全区域距离右边边界距离,一般情况下是 0
safe-area-inset-top:安全区域距离顶部边界距离,刘海全屏的时候 top 为 44px
safe-area-inset-bottom:安全区域距离底部边界距离,刘海全屏的条件下是 34px


css 函数 env() 和 constant()

这两个函数都是 webkit 中 css 函数,可以直接使用变量函数,只有在 webkit 内核下才支持


例如:

兼容前后版本代码,注意顺序不能变

padding-top: 88px;
padding-bottom: 100px;
padding-bottom: calc(100px +  constant(safe-area-inset-bottom));
padding-bottom: calc(100px +  env(safe-area-inset-bottom));

最后:
env 和 constant 只有在 viewport-fit=cover 时候才能生效。

在我们的index.html页面的meta标签 viewport添加一个属性viewport-fit=cover,请看的代码(我是用vue开发的移动端网页)

这一步必不可少,否则接下来的添加也是不生效的,注意:网页默认不添加扩展的表现是 viewport-fit=contain,需要适配 iPhoneX 必须设置 viewport-fit=cover,这是适配的关键步骤。

在H5页面加  viewport-fit=cover 

三、@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);  
    }
}

四、总结

嵌套H5  

在我们的index.html页面的meta标签 viewport添加一个属性viewport-fit=cover,加样式constant/env(safe-area-inset-bottom)来使用

小程序样式

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

// 兼容写法
      padding-bottom:constant(safe-area-inset-bottom); /* 兼容 iOS < 11.2 */
      padding-bottom:env(safe-area-inset-bottom); /* 兼容 iOS >= 11.2 */
posted @ 2022-06-13 15:09  蓦然JL  阅读(403)  评论(0编辑  收藏  举报
访问主页
关注我
关注微博
私信我
返回顶部