网页适配iPhoneX

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

安全区域

安全区域指的是一个可视窗口范围,处于安全区域的内容不受圆角(corners)、齐刘海(sensor housing)、小黑条(Home Indicator)影响。即我们要做好适配,必须保证页面可视、可操作区域是在安全区域内。

viewport-fit

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

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

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

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. padding-bottom: constant(safe-area-inset-bottom); /* 兼容 iOS < 11.2 */
  2. padding-bottom: env(safe-area-inset-bottom); /* 兼容 iOS >= 11.2 */

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

如何适配

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

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

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

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

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

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

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

第三步:fixed 元素的适配

类型一:fixed 完全吸底元素(bottom = 0)

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

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

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

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

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

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

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

空的颜色块:

{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 来处理:

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

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

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

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

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

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

css如何适配iPhoneX相关推荐

  1. 【css】适配iphoneX

    /*适配iphoneX*/ @media only screen and (device-width: 375px) and (device-height: 812px) and (-webkit-d ...

  2. css iohone手机端适配,【css】适配iphoneX

    Web App适配iPhoneX 前言 Iphone每次退出新尺寸的手机都会掀起一番适配风波,这次没有下巴但有刘海的iPhoneX更是如此,网传横屏下的适配动画更是令不少人汗颜. 其实对于Native ...

  3. css适配iphoneX

    css适配iphoneX 前言 iPhoneX 取消了物理按键,改成底部小黑条,这一改动导致网页出现了比较尴尬的屏幕适配问题.对于网页而言,顶部(刘海部位)的适配问题浏览器已经做了处理,所以我们只需要 ...

  4. 如何用css适配iphoneX底部横条?!?

    当我们在做app或者小程序的时候,如果是自适应屏幕高度,或者是用定位到底部按钮的时候,iphoneX底部的返回横条老是遮挡底部内容,如果巧妙的设计代码,使它能适配到iphoneX呢? 比如我写了一个底 ...

  5. 如何用CSS适配iPhoneX底部小横条

    如何用CSS适配iPhoneX底部小横条 前言 iPhoneX 取消了物理按键,改成底部小黑条,这一改动导致网页出现了比较尴尬的屏幕适配问题.对于网页而言,顶部(刘海部位)的适配问题浏览器已经做了处理 ...

  6. Web App适配iPhoneX

    前言 Iphone每次退出新尺寸的手机都会掀起一番适配风波,这次没有下巴但有刘海的iPhoneX更是如此,网传横屏下的适配动画更是令不少人汗颜. 其实对于Native App来说,适配并不算困难(当然 ...

  7. cordova项目适配iPhoneX

    iPhoneX适配踩坑浅谈 Apple每次退出新尺寸的iphone都会掀起一番适配风波,这次没有下巴但有刘海的iPhoneX更是如此,网传横屏下的适配动画更是令不少人汗颜. 其实对于Native Ap ...

  8. H5网页适配 iPhoneX,就是这么简单

    iPhoneX 取消了物理按键,改成底部小黑条,这一改动导致网页出现了比较尴尬的屏幕适配问题.对于网页而言,顶部(刘海部位)的适配问题浏览器已经做了处理,所以我们只需要关注底部与小黑条的适配问题即可( ...

  9. H5页面适配 iPhoneX

    过去,我们拿到的手机是方方正正的矩形,所以整个屏幕都可以看做是安全区域 Safe Area,而如今由于 iPhone X 及以上机型,屏幕上的"刘海"以及屏幕四周采用圆角的设计,对 ...

最新文章

  1. (000) java后台开发之指导思想
  2. Spring Boot配置@spring.profiles.active配置
  3. Windows下配置R-FCN
  4. kvm虚拟机不通网关_linux ssh 虚拟机下CentOS7开启SSH连接
  5. 学习ReasonML编程语言
  6. android8.0自适应图标,适配8.0+的自适应图标
  7. 504.七进制数(力扣leetcode) 博主可答疑该问题
  8. 打印计算机错误,打印机测试错误 原因administrator解决办法
  9. 北斗卫星导航系统BDS的星座和信号
  10. 百度语音合成离线使用研究
  11. 《预告 》 明天(9月19日),中国科学院自动化研究所首届智能决策论坛即将开幕!(附带10+位作者演讲主题及摘要)...
  12. 跳马问题C++递归调用
  13. 两部苹果手机同步照片_如何将旧苹果手机音乐里面的歌曲同步到新苹果手机上...
  14. 浏览器运作原理笔记(来自up主objtube的卢克儿的视频)
  15. 解决: void SendDelegateMessage(NSInvocation *): delegate (webView:decidePolicyForNavigationAction:requ
  16. 推荐一款精美小众的读书笔记app
  17. nmn抗衰老有哪些品牌,nmn最新排名情况,掏心窝子推荐
  18. google的黑镜子 -- 思考技术元素对生活的影响
  19. 精华 | 恩墨学院侯圣文:大数据时代下的 DBA 该何去何从?
  20. RecycleView复用错乱常用解决办法

热门文章

  1. 单片机与PC机的交流———基于STM32的串口通信
  2. python读取.txt、.dat等文件,将其中特定内容存到其他文件
  3. Arrays.copyOfRange(T[] original, int from, int to)的使用说明
  4. java 16进制转int_java 16进制与int互转问题
  5. itchat微信自动回复消息
  6. 浏览器中实现深度学习?有人分析了7个基于JS语言的DL框架
  7. mo和po文件相互转化
  8. 高通平台开发系列讲解(外设篇)QCA6696启动过程
  9. JS String.toDate
  10. 微信公众平台测试号申请