css适配iphoneX

前言

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

以下是处理前后效果图:

前置知识

安全区域

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

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

viewport-fit

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

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

env() 和 constant()
  • safe-area-inset-left:安全区域距离左边边界距离
  • safe-area-inset-right:安全区域距离右边边界距离
  • safe-area-inset-top:安全区域距离顶部边界距离
  • 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 之后就不能使用的,但我们还是需要做向后兼容,像这样:

padding-bottom: constant(safe-area-inset-bottom); /* 兼容 iOS < 11.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底部小横条

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

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

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

  3. 使用 css 适配 iphoneX 刘海屏

    iphoneX 刘海屏幕导致 h5 页面不能正常的全屏显示了,就需要对 页面进行适配,下面就详细说说如何适配. 首先上一张适配之前的图: 可以看到页面顶部被遮挡,底部贴着最下面 ios11 增加新特性 ...

  4. css适配iPhoneX,iPhone XS Max,iPhoneXR,

    一般情况下iPhoneX适配方法有三种 1.viewport-fit:contain <meta name="viewport" content="width=de ...

  5. css适配iphonex底部安全区

    .safe-area-inset-bottom {padding-bottom: 0; padding-bottom: constant(safe-area-inset-bottom); // 兼容 ...

  6. css如何适配iPhoneX

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

  7. 【css】适配iphoneX

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

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

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

  9. Web App适配iPhoneX

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

最新文章

  1. 关于fatal error LNK1120: 1 unresolved externalsd而解决方法
  2. requests-发送post请求
  3. sql server无法绑定由多个部分组成的标识符_HTML5服务器推送事件(Server-sent-event)...
  4. 【英语学习】【English L06】U04 Adventure L2 It's worth a visit
  5. cf卡序列号修改工具_王者荣耀无需Root修改荣耀战区软件和方法分享 全国地区可任意修改...
  6. S5PV210 Uboot开发与移植01:Uboot概述
  7. 工作中windows客户端常见问题
  8. python pip卸载
  9. 2018美日科学家因免疫治疗得诺贝尔生理医学奖|动图展示历年生理学奖
  10. Codeforces--1311A--Duff and Weight Lifting
  11. 虚幻AI蓝图基础笔记(万字整理)
  12. unity的切屏显示顺序
  13. 通过堡垒机/跳板机实现文件在本地Mac与服务器之间的互传
  14. linux环境下单网卡配置多个IP地址(详细)
  15. 灵性图书馆:好书推荐-《太傻天书》
  16. Linux服务器中Ebury Trojan病毒记
  17. Unity中Awake和Start的区别
  18. 安卓免ROOT卸载预装应用程序简要流程
  19. 华远地产:在稳健中穿越周期 | 一点财经
  20. MySQL三表查询(学生表、课程表、成绩表)查询出语文成绩比数学成绩高的学生信息

热门文章

  1. 驱动专题:第五章MTD及Flash驱动 4.Norflash驱动
  2. 【数据库】数据库基本知识
  3. Linux 中去除 vi/vim 和 git diff 中的 ^M 问题解决办法
  4. Mentor Expedition如何极坐标旋转添加器件?
  5. 业务团队如何在日常工作中做稳定性?涵盖事前、事中、事后的方方面面
  6. java datetime转int_java日期int和String互转
  7. 音乐制作录音宿主软件-MAGIX ACID Pro 10 Suite 10.0.5.35 x64 WiN
  8. 【Python 百练成钢】高精度加法、阶乘计算、矩阵幂运算、矩阵面积交
  9. Altium Designer重拾之学习资料推荐
  10. sql 创建表,批量插入数据