h5 iOS 刘海屏适配

news/2024/10/16 18:26:48/

之前做app内嵌页时,按照机型做了齐刘海适配,到现在iPhone12发布后,发现ios 齐刘海机型很多,所以按照机型适配有点繁琐,统一修改如下。

先看一下各个机型以及分辨率:https://www.theiphonewiki.com/wiki/Models

ios中的px转pt根据设备的ppi大概是3:1/2:1/1:1转换:

  • 4.7寸6、6s、7、8,状态栏高度为20pt,导航栏高度为44pt.
  • 5.5寸的6p、6sp、7p、8p,状态栏高度为18pt,导航栏高度为44pt.
  • 拥有刘海屏的X、XR、XS、XS MAX、11等一系列刘海屏,状态栏高度为44pt,导航栏高度为44pt.

综上发现:

  • 导航栏 高度所有机型都为44pt;
  • 状态栏 高度大致可以根据是否为刘海屏分为两类。没有刘海屏的大小机型分别为18和20pt,可以近似的看成都是20pt来处理,问题不大,有刘海屏的则统一为44pt高,跟导航栏高度相同。

 

适配方案:

iOS端的适配方案:Apple官方适配方案、机型区分适配、jsBridge方案

一、Apple官方适配方案:

1、在iphone x之后引入了一个新概念:“safe area(安全区域)”,安全区域指屏幕内不受圆角、齐刘海、底部小黑条等元素影响的可视窗口。如下图:

2、同时,从iOS11开始,为了适配刘海屏,Apple公司对HTML的viewport meta标签做了扩展

<meta name="viewport" content="viewport-fit=cover">

viewport-fit:

  • auto:默认值,跟 contain 表现一致
  • contain:可视窗口完全包含网页内容
  • cover:指页面完全充满屏幕,网页内容完全覆盖可视窗口。

适配方案:

  1. 首先通过设置<meta name="viewport" content="viewport-fit=cover">让页面充满全屏
  2. 通过Webkit内置的CSS函数,获取安全区域与各边之间的间距,然后通过padding/margin/绝对定位等方式,让页面元素展示在安全区域内。

注: Webkit在iOS11中新增CSS Functions: env( )替代constant( ),文档中推荐使用env( ),而 constant( ) 从Safari Techology Preview 41 和iOS11.2 Beta开始会被弃用。在不支持env( )的浏览器中,会自动忽略这一样式规则,不影响网页正常的渲染。为了达到最大兼容目的,我们可以 constant( ) 和 env( ) 同时使用。

padding-top: constant(safe-area-inset-top); /* iOS 11.0 */
padding-top: env(safe-area-inset-top); /* iOS 11.2 */body{padding-top: env(safe-area-inset-top); padding-left: env(safe-area-inset-left);padding-right: env(safe-area-inset-right); padding-bottom: env(safe-area-inset-bottom); 
}

使用@supports查询机型是否支持constant() / env()实现兼容代码隔离,个别安卓也会成功进入这个判断,因此加上-webkit-overflow-scrolling: touch的判断可以有效规避安卓机。

@supports ((height: constant(safe-area-inset-top)) or (height: env(safe-area-inset-top))) and (-webkit-overflow-scrolling: touch) {.fullscreen {/* 适配齐刘海 */padding-top: 20px;padding-top: constant(safe-area-inset-top);padding-top: env(safe-area-inset-top);/* 适配底部小黑条 */padding-bottom: 0;padding-bottom: costant(safe-area-inset-bottom);padding-bottom: env(safe-area-inset-bottom);}
}

非齐刘海的ios手机适配:

@supports (-webkit-overflow-scrolling: touch) {/* 适配ios 非齐刘海机型 */
}

二、机型区分适配

/* iphone x / xs / 11 pro*/
@media only screen and (device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) {...
}
/* iphone xr / 11 */
@media only screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) {...
}
/* iphone xs max / 11 pro max */
@media only screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) {...
}

缺点:工作量有点大,且每年9月份发布会后要及时更新新版本适配代码。

三、jsBridge方案

Android机器厂商百花齐放,各厂商的机型也是眼花缭乱。该方案同时适合Android和IOS

  • 客户端获取状态栏高度后,H5通过JSBridge交互拿到状态栏高度,设置页面样式避开齐刘海区域。
  • 混合开发,顶部导航采用app端的。

http://www.ppmy.cn/news/799654.html

相关文章

全网最全iPhone NFC失灵解决思路

这里汇集了全部中文网站关于iPhone NFC失灵的网友解决思路分享&#xff0c;看完之后大家对于自己的解决方案应该就有了充分的了解。作者一句话总结——天线问题&#xff0c;换个NFC天线或使其接触良好即可 换壳后wifi蓝牙GPS弱&#xff0c;Apple Pay不灵的维修思路&#xff0c…

CSS中flex对部分IOS版本兼容性问题

众所周知&#xff0c;ios系统老是和我们前端过不去&#xff0c;搞一堆不兼容问题&#xff0c;比如flex布局&#xff01; 大部分情况下可以通过一下兼容方法来写 div {display: -webkit-flex;display: flex;-webkit-flex: 1;flex: 1;-webkit-flex-direction: row;flex-directio…

axios 多个请求loading管理

预期效果&#xff1a;多个请求并发时&#xff0c;所有请求完成后才关闭loading。 解决方案&#xff1a;增加一个 loadingCount 变量&#xff0c;用来计算请求的次数。 import Vue from vue import axios from axios const Loading Vue.prototype.$loading; const Message V…

阿里云轻量应用服务器和云服务器的区别

阿里云服务器ECS和轻量应用服务器有什么区别&#xff1f;云服务器ECS是明星级云服务器&#xff0c;轻量应用服务器可以理解为简化版的云服务器ECS&#xff0c;轻量适用于单机应用&#xff0c;云服务器ECS适用于集群类高可用高容灾应用&#xff0c;阿里云百科来详细说下阿里云轻…

一个闰字引发的事故 : 三星系统重启分析

背景 2020 年 5 月 23 号凌晨 1 点 30 左右, 大量三星手机用户的手机出现死机, 无限重启、进 Recovery 等问题, 并且操作不当会导致数据丢失, 并且上了知乎的热点, 售后点更是人满为患 知乎的部分回答中, 大家更是对三星的家属送上了亲切的问候, 甚至有的人已经将这次事故与 No…

Android 12 “Bug 连连”:除了一加、三星,谷歌自家手机都被“坑”了

相较于前面几个大版本&#xff0c;去年 10 月才问世的 Android 12 正式版稍显迟缓&#xff1a;2018 年 8 月 7 日谷歌发布 Android 9 正式版&#xff0c;之后 Android 10 正式版于 2019 年 9 月 3日正式发布&#xff0c;Android 11 同样也是 2020 年 9 月 8 日发布。 但即便晚…

Android系统关机和重启

一. 发送系统广播方式 Broadcast是Android的四大基本组件之中的一个。也就是我们常说的广播。Android系统本身就包括了很多广播&#xff0c;时时刻刻在监听着系统中注冊的每个广播并随时准备响应操作。 当中&#xff0c;就有关于关机或重新启动的广播&#xff1a;Intent.ACTIO…

android 重启手机的方法

android手机有很多的第三方固件&#xff0c;其中有不少固件中有reboot的功能&#xff0c;这个功能是如何实现的呢&#xff1f;我这里会做一个简单的示例。先看一个效果图吧&#xff01; 如图在dialog中的最后一项是reboot功能。下面看看代码是怎么修改的&#xff1a; 文件路径&…