京东技术:网页适配 iPhoneX,就是这么简单

无毁的湖光-A 2018-10-18 17:39:58 ⋅ 730 阅读

来这里找志同道合的小伙伴!


作  者  简  介
「JDC-多终端研发部」在 2015 年 10 月份推出了「凹凸实验室」品牌,旨在对外输出团队的前端能力及技术理念。团队主要为商城主站、微信手Q及部分事业群提供 WEB 前端开发、小程序开发、小游戏开发、H5动画开发等能力支持。

>>>>  前言

iPhoneX 取消了物理按键,改成底部小黑条,这一改动导致网页出现了比较尴尬的屏幕适配问题。对于网页而言,顶部(刘海部位)的适配问题浏览器已经做了处理,所以我们只需要关注底部与小黑条的适配问题即可(即常见的吸底导航、返回顶部等各种相对底部 fixed 定位的元素)。

笔者通过查阅了一些官方文档,以及结合实际项目中的一些处理经验,整理了一套简单的适配方案分享给大家,希望对大家有所帮助,以下是处理前后效果图:

>>>>  适配之前需要了解的几个新知识

>>>>  安全区域

安全区域指的是一个可视窗口范围,处于安全区域的内容不受圆角(corners)、齐刘海(sensor housing)、小黑条(Home Indicator)影响,如下图蓝色区域:

也就是说,我们要做好适配,必须保证页面可视、可操作区域是在安全区域内。

更详细说明,参考文档:Human Interface Guidelines - iPhoneX(链接:https://developer.apple.com/ios/human-interface-guidelines/overview/iphone-x/)

>>>>  viewport-fit

iOS11 新增特性,苹果公司为了适配 iPhoneX 对现有 viewport meta 标签的一个扩展,用于设置网页在可视窗口的布局方式,可设置三个值:

  • contain: 可视窗口完全包含网页内容(左图)

  • cover:网页内容完全覆盖可视窗口(右图)

  • auto:默认值,跟 contain 表现一致

注意:网页默认不添加扩展的表现是 viewport-fit=contain,需要适配 iPhoneX 必须设置 viewport-fit=cover,这是适配的关键步骤。

更详细说明,参考文档:viewport-fit-descriptor(链接:https://www.w3.org/TR/css-round-display-1/#viewport-fit-descriptor)

>>>>  env() 和 constant()

iOS11 新增特性,Webkit 的一个 CSS 函数,用于设定安全区域与边界的距离,有四个预定义的变量:

  • safe-area-inset-left:安全区域距离左边边界距离

  • safe-area-inset-right:安全区域距离右边边界距离

  • safe-area-inset-top:安全区域距离顶部边界距离

  • safe-area-inset-bottom:安全区域距离底部边界距离

这里我们只需要关注 safe-area-inset-bottom 这个变量,因为它对应的就是小黑条的高度(横竖屏时值不一样)。

注意:当 viewport-fit=contain 时 env() 是不起作用的,必须要配合 viewport-fit=cover 使用。对于不支持env() 的浏览器,浏览器将会忽略它。

在这之前,笔者使用的是 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.

这就意味着,之前使用的 constant() 在 iOS11.2 之后就不能使用的,但我们还是需要做向后兼容,像这样:

1

2

padding-bottom: constant(safe-area-inset-bottom); /* 兼容 iOS < 11.2 */

padding-bottom: env(safe-area-inset-bottom); /* 兼容 iOS >= 11.2 */

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

更详细说明,参考文档:Designing Websites for iPhone X(链接:https://webkit.org/blog/7929/designing-websites-for-iphone-x/?hmsr=funteas.com&utm_medium=funteas.com&utm_source=funteas.com)

>>>>  如何适配

了解了以上所说的几个知识点,接下来我们适配的思路就很清晰了。

>>>>  第一步:设置网页在可视窗口的布局方式

新增 viweport-fit 属性,使得页面内容完全覆盖整个窗口:

1

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

前面也有提到过,只有设置了 viewport-fit=cover,才能使用 env()。

>>>>  第二步:页面主体内容限定在安全区域内

这一步根据实际页面场景选择,如果不设置这个值,可能存在小黑条遮挡页面最底部内容的情况。

1

2

3

4

body {

   padding-bottom: constant(safe-area-inset-bottom);

   padding-bottom: env(safe-area-inset-bottom);

}

>>>>  第三步:fixed 元素的适配

类型一:fixed 完全吸底元素(bottom = 0),比如下图这两种情况:

可以通过加内边距 padding 扩展高度:

1

2

3

4

{

   padding-bottom: constant(safe-area-inset-bottom);

   padding-bottom: env(safe-area-inset-bottom);

}

或者通过计算函数 calc 覆盖原来高度:

1

2

3

4

{

   height: calc(60px(假设值) + constant(safe-area-inset-bottom));

   height: calc(60px(假设值) + env(safe-area-inset-bottom));

}


注意,这个方案需要吸底条必须是有背景色的,因为扩展的部分背景是跟随外容器的,否则出现镂空情况。

还有一种方案就是,可以通过新增一个新的元素(空的颜色块,主要用于小黑条高度的占位),然后吸底元素可以不改变高度只需要调整位置,像这样:

1

2

3

4

{

   margin-bottom: constant(safe-area-inset-bottom);

   margin-bottom: env(safe-area-inset-bottom);

}

空的颜色块:

1

2

3

4

5

6

7

8

{

   position: fixed;

   bottom: 0;

   width: 100%;

   height: constant(safe-area-inset-bottom);

   height: env(safe-area-inset-bottom);

   background-color: #fff;

}

类型二:fixed 非完全吸底元素(bottom ≠ 0),比如 “返回顶部”、“侧边广告” 等

像这种只是位置需要对应向上调整,可以仅通过外边距 margin 来处理:

1

2

3

4

{

   margin-bottom: constant(safe-area-inset-bottom);

   margin-bottom: env(safe-area-inset-bottom);

}

或者,你也可以通过计算函数 calc 覆盖原来 bottom 值:

1

2

3

4

{

   bottom: calc(50px(假设值) + constant(safe-area-inset-bottom));

   bottom: calc(50px(假设值) + env(safe-area-inset-bottom));

}

>>>>  你也可以使用 @supports 隔离兼容样式

写到这里,我们常见的两种类型的 fixed 元素适配方案已经了解了吧。如果我们只希望 iPhoneX 才需要新增适配样式,我们可以配合 @supports 来隔离兼容样式,当然这个处理对页面展示实际不会有任何影响:

1

2

3

4

5

6

@supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) {

   div {

       margin-bottom: constant(safe-area-inset-bottom);

       margin-bottom: env(safe-area-inset-bottom);

   }

}

>>>>  写在最后

以上几种方案仅供参考,笔者认为,现阶段适配处理起来是有点折腾,但是至少能解决,具体需要根据页面实际场景,在不影响用户体验与操作的大前提下不断尝试与探索,才能更完美的适配。

---------------END----------------

后续的内容同样精彩

长按关注“IT实战联盟”哦



全部评论: 0

    我有话说:

    京东到家订单中心系统mysql到es的转化之路

    原文:https://www.toutiao.com/i6796507988602389006 京东到家订单中心系统业务中,无论是外部商家的订单生产,或是内部上下游系统的依赖,订单查询的调用量都非常

    「轻阅读」移动端必须掌握的基本概念和方案

    随着技术的发展,移动设备越来越流行,并且不同设备间屏幕尺寸和屏幕像素的差异,移动端开发面临着多分辨率的问题。

    Element Plus 发布 Beta 版本, Vue 3.0 的 Element

    Element 开发团队宣布推出 Element Plus 首个 Beta 版本,官方表示 Element Plus Element 对 Vue 3.0 的升级。 地址:https

    京东技术:多数据模型数据库 | 应用实例解析

    作 者 简 介吕信,京东商城技术架构部资深架构师,拥有多年数据产品研发及架构经验。

    这样学习正则表达式轻松了!

    在日常工作中,经常会用到正则操作。但是对于大多数人来说,操作正则表达式简直抓瞎。本篇文章主要整理了正则表

    京东技术:使用JDReact小程序双向转换

    JDReact京东商城前台产品研发部推出的多端融合开发框架。

    京东技术:单元测试高效之路——持续集成

    持续集成的概念与好处互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分持续集成(Continuous integration,简称CI)。

    京东技术:如何实现百万TPS?详解JMQ4的存储设计

    JMQ京东中间件团队自研的消息中间件,诞生于2014年,服务京东近万个应用,2018年11.11大促期间的峰值流量超过5000亿条消息

    京东技术:使用京东Taro重构小程序

    >>>>  Taro 简介 Taro 一个基于 React 语法规范的多端统一开发框架,大家可以通过 taro

    京东技术:Hystrix 分布式系统限流、降级、熔断框架

    HystrixNetflix开源的一款容错框架,包含常用的容错方法:线程隔离、信号量隔离、降级策略、熔断技术

    Git托管平台的拉取请求

    拉取请求Bitbucket的一个特性(经调查,Gitlab、Github都支持这个特性),可以让开发人员的协作更加容易,他们提供了一个友好的网页界面让开发者在集成代码到正式库之前对其进行讨论

    京东技术京东系统架构师如何让笨重的架构变得灵巧

    京东系统架构师,从事架构设计与开发工作,熟悉各种开源软件架构。在Web开发、架构优化上有较丰富实战经历。

    京东技术京东风格的移动端Vue组件库NutUI2.0来啦

    移动端 Vue 组件库 NutUI 自发布以来受到了广泛的关注。据不完全统计,目前至少有30多个京东的 web 项目正在使用 NutUI 。

    精品推荐:JDFlutter | 京东技术中台新一代跨平台开发框架

    DFlutter 商城共享技术部-多端融合技术部推出的新一代跨平台开发框架,可快速集成至现有 Android/iOS 工程,开发者可借助 JDFlutter 平台快速完成 Flutter 业务开发。

    京东技术:多级缓存设计详解 | 给数据库减负

    传统的cpu通过fsb直连内存的方式显然会因为内存访问的等待,导致cpu吞吐量下降,内存成为性能瓶颈。

    京东技术:Protobuf-3.6.1 安装及 Golang 使用

    Protobuf Google 开发的一种数据描述语言,能够将结构化的数据序列化,可用于数据存储,通信协议等方面。官方版本支持 Go,C++,Java,Python,社区版本支持更多语言。

    阿里技术:聊一聊从单机至亿级流量大型网站系统架构的演进过程

    网站的初期,我们经常会在单机上跑我们所有的程序和软件。此时我们使用一个容器,如tomcat、jetty、jboos,然后直接使用JSP/servlet技术......

    Gitflow工作流程

    Gitflow工作流程来源于Vincent Driessen的网站nvie。 这个工作流程围绕项目发布定义了一个严格的模型,它比特性分支工作流程复杂很多,为更大型的项目提供了强劲的管理框架。 本流程

    京东技术:用最小的图片格式,打造最优的用户体验

    DPG图片压缩技术能够有效的减少图片大小50%,并且减少50%的CDN带宽流量!