Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >H5 页面 iPhoneX 刘海屏适配

H5 页面 iPhoneX 刘海屏适配

作者头像
Originalee
发布于 2020-06-02 07:14:36
发布于 2020-06-02 07:14:36
4.7K10
代码可运行
举报
文章被收录于专栏:编程之旅编程之旅
运行总次数:0
代码可运行

随着这两年苹果坚定不移的走刘海屏路线,Hybrid 页面在 iPhoneX 上刘海屏的适配也是每个前端开发的小伙伴都会碰到的问题,今天就记录一下我关于刘海屏适配的部分经验。

对于刘海屏的适配,你的脑子里首先得有苹果手机的 Safe Area 的概念,关于 Safe Area 网上的资料已经非常多了,这里就不再赘述,更偏向实战一点。但是为了比较,我这里给出一张苹果官方文档中,iPhone8之前的常规屏幕和刘海屏 Safe Area 区域的对比图。

safe-area.png

很明显,在讨论适配之前,我们的页面一般有两种分类:

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

env 函数

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

页面适配

在为页面适配刘海屏之前,我们首先得在页面的 meta 中添加一个新的值:viewport-fit=cover

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<meta name="viewport" content="viewport-fit=cover">

这么设置之后,视图端口被缩放以填充设备显示。换句话说就是网页会扩展到整个屏幕。

看一页目前的页面效果:

WX20200531-205514@2x.png

可以看到现在我们的测试页面已经铺满了整个屏幕。

这个时候,我们来使用之前提到的 env 函数,适配刘海屏幕。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 呢?源于官方文档的一段注释:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.

意味着 iOS11.2 以后 constant() 不能使用,所以需要向后兼容。

此时再看一下我们的页面效果:

WX20200531-205644@2x.png

WX20200531-205658@2x.png

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

当你的页面不使用原生导航栏铺在整个屏幕中时,这就是一个不错的适配方案。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
body {
  padding-bottom: constant(safe-area-inset-bottom);
  padding-bottom: env(safe-area-inset-bottom);
}

处理 Fixed 和 绝对定位的情况

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.element {
  padding-bottom: constant(safe-area-inset-bottom);
  padding-bottom: env(safe-area-inset-bottom);
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@element-height: 60px; /* 元素原始高度 */
.element {
  height: calc(@element-height + constant(safe-area-inset-bottom));
  height: calc(@element-height + env(safe-area-inset-bottom));
}

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

下面我就放一个我写的 less 适配刘海屏的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 *  适配 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);
});

当编译后,就可以根据机型完成适配。这里要注意的是,实测时,对于 iPhone XR 我用在 stackoverflow 上找到的 media query 条件来判断不生效,后来经过查找资料,我找到一个在 iPhone XR 上实际可用的条件,也一并放在上面的代码中。

最后,如果这篇文章有帮助到你在适配中填坑,请给我点个赞哦 ?

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
真心不错这文章
真心不错这文章
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
–移动端适配iPhoneX方案
移动端适配iPhoneX方案 对页面进行iPhoneX适配处理教程 在viewport 中添加 viewport-fit=cover 属性 <meta name="viewport" content="width=device-width,initial-scale=1.0, viewport-fit=cover"> 安全区设置 iOS 11中包含了一个新的CSS函数 env(),以及一组四个预定义的常量:safe-area-inset-left, safe-area-inset-right, safe-a
大象无痕
2018/07/17
1.1K0
📚一站式解决:H5开发全攻略,看这篇让你省时又省力
在 H5 中,我们通常会使用 REM 和 VW 这两种单位来实现页面的响应式布局。这两种单位可以让页面元素的大小随着根元素(对于 REM)或视口宽度(对于 VW)的大小变化而变化,从而适应不同尺寸的屏幕。
linwu
2023/07/27
1.6K0
吃透移动端 H5 与 Hybrid|实践踩坑12种问题汇总
作为一个开发了多个 H5 项目的前端工程师,在开发过程中难免会遇到一些兼容性等爬过坑的问题。现在我将这些问题一一汇总一下,并在后面给出坑产生的原理,和现阶段常规的填坑方案。由此来做一个阶段性的总结。
前端老道
2020/10/15
1.5K0
吃透移动端 H5 与 Hybrid|实践踩坑12种问题汇总
【HTML5 理论知识】就H5调试技巧,浅谈:iPhone X 适配方案!
image.png 2017年9月苹果发布了iPhone X机型,对于它的“刘海儿”和底部Home Indicator。我们可以通过以下三种方案进行适配~下面就让我来逐一介绍吧! 客户端适配 解决方案 客户端直接将webview的安全区域限制在除去安全区域的区域内。页面将展示在下图灰色webview内: image.png 利弊分析 优点:H5前端开发没有任何适配工作量。 缺点:页面会限制在客户端限制的webview区域内,没有满屏效果。 使用media query 解决方案 针对iPhoneX机型
QUXINGDONG.COM
2018/04/17
3.4K2
【HTML5 理论知识】就H5调试技巧,浅谈:iPhone X 适配方案!
网页适配 iPhoneX
iPhoneX 取消了物理按键,改成底部小黑条,这一改动导致网页出现了比较尴尬的屏幕适配问题。对于网页而言,顶部(刘海部位)的适配问题浏览器已经做了处理,所以我们只需要关注底部与小黑条的适配问题即可(即常见的吸底导航、返回顶部等各种相对底部 fixed 定位的元素)。
子润先生
2021/06/24
7480
Safari浏览器内容被地址栏、菜单栏或工具栏遮挡导致的兼容问题
最近写了一个网页,页面很多元素使用的是Fixed定位,当在手机端的Safari浏览器、安卓浏览器等测试时,会出现顶部元素、底部元素 被地址栏、菜单栏或工具栏遮挡的情况。于是,我查阅了相关资料,发现了一些解决方案,在iOS设备上使用Safari浏览器时,开发者经常会遇到内容被地址栏、菜单栏或工具栏遮挡的问题。本文将探讨如何使用 viewport-fit 属性和CSS的 env() 函数来解决这些问题。
Power
2025/03/31
7050
20180914_ARTS_week12
因为之前做过 Integer to Roman 这个 Roman to Integer 还是比较容易有思路,和 Integer to Roman 差不多,但是这里要先算组合型的字符,比如 CM 就要在 M 之前计算。
Bob.Chen
2018/09/27
3750
妙用 CSS 变量,让你的代码更优雅
这是介绍 css 的基础语法,了解地可以直接跳过到实际 demo . 既然是变量,他跟 JS 的变量很像,分为 声明、使用、作用域 三块。
Power
2025/03/04
840
极速适配 iPhone X 秘笈
iPhone X 适配方案 2017年9月苹果发布了 iPhone X 机型,对于它的“刘海儿”和底部 Home Indicator,QQ空间 H5 也在第一时间做了兼容适配。在适配过程中,我们尝试了这三种方案,如下。 解决方案1 客户端适配 客户端直接将 webview 的安全区域限制在除去安全区域的区域内。页面将展示在下图灰色 webview 内: 利弊分析 优点:H5 前端开发没有任何适配工作量。 缺点:页面会限制在客户端限制的 webview 区域内,没有满屏效果。 解决方案2 使用 media
腾讯ISUX
2018/06/29
1.5K0
适配iPhone X 的齐刘海
当苹果宣布发布他们的旗舰手机-- iPhone X 的时候,他们允诺将为未来移动设备设定新的标准。我们决定需要了解一些内容。 “屏幕再也不必是方形的” 除了无边框设计,就是我们熟悉的“齐刘海”,官方叫:Sensor Housing。它迅速成为一个热门话题,提出了一种全新的设计挑战:屏幕再也不必是方形的。虽然这对原生应用是一个更大的考验,但web开发也需要一些考虑。不管它是吓到你或者激发了你, sensor housing 都已存在。现在是为你的客户提供一种非常整洁体验的绝
前端黑板报
2018/01/29
1.1K0
适配iPhone X 的齐刘海
移动端必备的H5问题及解决方案
上下滑动页面会产生卡顿,手指离开页面,页面立即停止运动。整体表现就是滑动不流畅,没有滑动惯性。
前端小tips
2021/12/11
5.2K0
移动端必备的H5问题及解决方案
让你的WEB和APP一分钟适配 iPhone X
iPhone X昨日已经开抢了 然而面对 iPhone X 这个奇葩的屏幕 你和你的编辑器准备好了吗? 因为 iPhone X 的刘海设计,Web 在 iPhone X横屏时,可能会有些问题: 默认
腾讯NEXT学位
2018/05/14
1.3K0
H5移动端适配IphoneX等机型
图中,Iphonex机型在头部和底部新增了这两个区域,所以我们需要针对这类机型做些适配,方便我们的webapp的展示
青梅煮码
2023/01/12
9230
css 实现刘海屏样式兼容并支持 js 获取刘海屏高度后动态修改
首先设置 css 根属性变量值,如果是 less,通过 calc 计算出增加刘海屏高度后的值,注意 calc 计算不支持不带单位的数字相加,会导致结果为 0 ,所以一定要处理不带单位的场景。
蓓蕾心晴
2024/11/28
3790
iphoneX 兼容
iphone 齐刘海兼容,作为前端开发几乎是绕不过去的一道坎。 很早之前就遇到过,这里记录一下其解决办法。
epoos
2022/06/06
1.2K0
【HarmonyOS next】ArkUI-X休闲益智打地鼠【进阶】
跨平台开发不是追求100%一致,而是在理解差异的基础上实现最佳体验平衡。ArkUI-X的Web组件方案为多端适配提供了新思路,期待未来在HarmonyOS next中看到更强大的跨端能力。
用户11721038
2025/06/28
750
【HarmonyOS next】ArkUI-X休闲益智打地鼠【进阶】
小程序对IPhone全面屏手机底部黑线的安全区域处理
今天在编写小程序页面时发现,在iphoneX真机预览时,底部button会被手机底部黑线盖住一部分,
青年码农
2020/11/19
2K0
小程序对IPhone全面屏手机底部黑线的安全区域处理
兼容iphone x * 刘海的正确姿势
9月13日凌晨终于等来了万众瞩目的苹果新品发布会,相信很多小伙伴们都期待新 iphone 可以剪掉刘海胡子,但万万没想到的是等来了三款不同的尺寸的 iphone x ,我的天,等了这么久你给我看这个?码农慌得一批满地找新 iphone 的逻辑像素,然后想着怎么兼容这刘海和胡子。
IMWeb前端团队
2019/12/03
1.2K0
兼容iphone x * 刘海的正确姿势
移动端H5开发之页面适配篇
最近开发并上线了一款H5项目,在这里想和大家分享一下关于项目中使用到的移动端适配技巧,如果对你们有所帮助的话,就多多点赞收藏😃各位看官老爷别着急,在讲页面适配之前,我们先来捋一捋viewport(视口)的概念~在Web浏览器术语中,通常与浏览器窗口相同,但不包括浏览器的UI, 菜单栏等——即指你正在浏览的文档的那一部分。一般我们所说的视口共包括三种:布局视口、视觉视口和理想视口1.1 布局视口图片在移动端,布局视口被赋予一个默认值,大部分为980px,这保证PC的网页可以在手机浏览器上呈现,用户可以手动对网
三点水的洋
2022/06/10
7.9K1
移动端H5开发之页面适配篇
CSS适配iOS全面屏底部横条
所有开发者应对资源页面做好不同手机型号的适配效果,不影响用户的正常浏览使用。其中IOS全面屏手机底部横线不可遮挡页面的具体功能和内容。
AlexTao
2021/03/29
3.8K0
CSS适配iOS全面屏底部横条
相关推荐
–移动端适配iPhoneX方案
更多 >
LV.1
这个人很懒,什么都没有留下~
交个朋友
加入前端学习入门群
前端基础系统教学 经验分享避坑指南
加入腾讯云技术交流站
前端技术前沿探索 云开发实战案例分享
加入云开发企业交流群
企业云开发实战交流 探讨技术架构优化
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验