H5 页面适配 iPhoneX 刘海屏

# 前言

最近写个移动端的项目, 需要适配各个机型, 其中有个 iPhoneX 的刘海屏印象比较深刻,给大家分享一下, 欢迎评论留言。

# 准备工作

Safe Area

其实关于苹果手机的 Safe Area 网上的资料已经非常多了,不在多说。为了便于比较,这里我们看一张苹果官方文档中,iPhone8之前的常规屏幕和刘海屏 Safe Area 区域的对比图, 如下:
2020-07-02_092226.jpg

如上不难看出:

  1. H5 页面使用原生 App 的 Navigation Bar 导航栏,status bar 状态栏 和 导航栏 都是原生控件,只需要专注的适配底部小黑条处的高度差异即可。
  2. H5 页面在 iOS 中占据全屏页面,在这种情况下,除了要兼顾底部小黑条,还要处理页面上部 跟 状态栏 接触的部分,避免内容出现在状态栏上。

env 函数

env() 函数以类似于 var 函数 的方式将用户代理定义的环境变量值插入到你的 CSS 中去。这个函数最初由 iOS 浏览器提供,用于允许开发人员将其内容放置在视口的安全区域中,该规范中定义的 safe-area-inset-* 值用于确保内容即使在非矩形的视区中也可以完全显示。

# 开始适配

我们首先得在页面的 meta 中添加一个新的值:viewport-fit=cover, 设置之后,视图端口被缩放以填充设备显示 ( 即网页会扩展到整个屏幕 )。

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

如何适配刘海屏呢, 如下代码:

body {
  padding:
    constant(safe-area-inset-top)
    constant(safe-area-inset-right)
    constant(safe-area-inset-bottom)
    constant(safe-area-inset-left); /* 兼容 iOS < 11.2 */
  padding:
    env(safe-area-inset-top)
    env(safe-area-inset-right)
    env(safe-area-inset-bottom)
    env(safe-area-inset-left); /* 兼容 iOS >= 11.2 */
}

这里有个 constant , 官方文档这么解释

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.

如上设置后, 可以看到页面的顶部,因为 safe-area-inset-top 避开了状态栏,
而底部因为 safe-area-inset-bottom 避开了小黑条,完美的显示在了 Safe Area 的区域中。

如果使用了原生导航栏,仅仅需要适配底部小黑条时,解决方案就更简单了,简单设置 safe-area-inset-bottom就可以:

body {
  padding-bottom: constant(safe-area-inset-bottom);
  padding-bottom: env(safe-area-inset-bottom);
}

# 特殊情况处理 - Fixed 和 绝对定位的情况

有时底部元素是通过 fixed 或者 absolute 定位放置的,对于这些元素,简单的使用 safe-area-inset-bottom 是无效的,但是我们可以对该元素单独增加内边距的 padding 来解决, 如下:

.element {
  padding-bottom: constant(safe-area-inset-bottom);
  padding-bottom: env(safe-area-inset-bottom);
}

通过增加该元素的高度来解决

@element-height: 60px; /* 元素原始高度 */
.element {
  height: calc(@element-height + constant(safe-area-inset-bottom));
  height: calc(@element-height + env(safe-area-inset-bottom));
}

也可以通过 less、sass 的函数,通过媒体查询来准确的定位到刘海屏的手机,然后写入你希望刘海屏手机展示的任何样式, 栗子如下:

/**
 *  适配 iPhoneX 及以后的刘海屏手机,可以自行编写 rules 规则
 */
.safe-area(@rules) {
  /* iphone x / xs / 11 pro*/
  @media only screen and (device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) { @rules(); }
  /* iphone xr / 11  stackoverflow 提供判断 */
  @media only screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) { @rules(); }
  // 实际可用的 xr 判断
  @media only screen and (device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 2) { @rules(); }
  /* iphone xs max / 11 pro max */
  @media only screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) { @rules(); }
}

// 具体使用
.safe-area({
  height: 100px;
  padding-bottom: env(safe-area-bottom-height);
});

特此感谢 Originalee , 抱拳了

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352