兼容iphone x刘海的正确姿势
在 ios 11 中我们可以使用 viewport-fit=cover
+ safe-area-inset-*
。
那么是不是 ios11 以下就用不了这些了呢?是的,但你见过 iphone x+ 有 ios 11以下的吗? 所以我们可以愉快的搞下去。
开始之前我们先了解什么是 safe area,简单的来说就是除了刘海和胡子以外的区域为安全区域:
关于 viewport-fit
viewport-fit 有3个值:
contain: 可视窗口完全包含网页内容(左图)
cover:网页内容完全覆盖可视窗口(右图)
auto:默认值,跟 contain 表现一致
如何决定 viewport-fit 值?我们要考虑一些问题:
1、在非矩形显示器上设置 viewport 边界时,Viewport边界框(Viewport Bounding Box)的面积大于显示区域,导致了剪切区域
2、如果要保证Web页面的任何部分都没有隐藏,不想让Web页面在可读性上变得很小,那么最好将viewport-fit设置为cover,并在考虑剪切部分时实显示页面。
3、还有另一个考虑是,当我们设置 viewport-fit:contain,也就是默认的时候时,设置 safe-area-inset-* 等 css 属性时不起作用的。 点击这里了解更多关于 viewport-fit
关于 safe-area-inset-*
各种 iphone x 都是不规则形状,我们如何控制页面元素到安全区域呢?apple 把安全区域的位置通过 css 属性提供给了开发者,它们可以通过CSS的constant( )函数来完成:
constant(safe-area-inset-top)
:在Viewport顶部的安全区域内设置量(CSS像素)
constant(safe-area-inset-bottom)
:在Viewport底部的安全区域内设置量(CSS像素)
constant(safe-area-inset-left)
:在Viewport左边的安全区域内设置量(CSS像素)
constant(safe-area-inset-right)
:在Viewport右边的安全区域内设置量(CSS像素)
简单来说我们可以通过 constant( )
可以获取到非安全边距,再结合 padding
或 margin
来控制页面元素避开非安全区域。 Webkit在iOS11中新增CSS Functions: env( )替代constant( ),文档中推荐使用env( ),而 constant( ) 从Safari Techology Preview 41 和iOS11.2 Beta开始会被弃用。在不支持env( )的浏览器中,会自动忽略这一样式规则,不影响网页正常的渲染。为了达到最大兼容目的,我们可以 constant( ) 和 env( ) 同时使用。
.yourFooterClass {
padding-bottom: constant(safe-area-inset-bottom); /* iOS 11.0 */
padding-bottom: env(safe-area-inset-bottom); /* iOS 11.2 */
}
复制代码
本文为了简洁只写 env( )。
实践一波
一、设置网页在可视区域的布局方式
新增 viweport-fit 属性,使得页面内容完全覆盖整个窗口:
<meta name="viewport" content="width=device-width,initial-scale=1.0,viewport-fit=cover">
复制代码
二、让主体内容控制在安全区域内
假设我们的底部按钮高度是50px:
body {
padding-top: env(safe-area-inset-top);
padding-right: env(safe-area-inset-right);
padding-bottom: 50px; /* 兼容不支持 env( ) 的设备 */
padding-bottom: calc(env(safe-area-inset-bottom) + 50px); /* 在 iphone x + 中本句才会生效 */
padding-left: env(safe-area-inset-left);
}
有两个关键点:
1、写在前面的 padding-bottom: 50px
为了兼容没有底部胡子的设备,让主体内容偏移出底部按钮的高度,避免按钮遮挡内容。
2、padding-bottom: calc(env(safe-area-inset-bottom) + 50px);
计算 底部非安全区域距离
与 底部按钮高度
之和 来做为 padding-bottom
值,如果设备支持 env,那么 calc 会计算出一个合法的值,本句的优先级则最高,会覆盖前面的 padding-bottom: 50px
。否则 calc 会计算出一个不合法的值,则本句声明不会生效。这样在不支持 env 设备中也可以达到兼容的目的。
目前到这,在横屏场景下左侧的内容就不会被刘海遮挡住了
三、底部按钮的处理
首先给底部按钮一个外层容器 .btn-container
,设置样式时其中有几点比较关键:
1、设置padding-bottom: env(safe-area-inset-bottom);
增加一个 padding 值,让底部向外扩展一个非安全区域的距离。
2、设置background: #FFF
让整个 .btn-container
背景为白色(包括刚新增的 padding-bottom 的区域)这样就可以遮挡住了底部内容。
3、设置 box-sizing: content-box;
,因为在通常情况下 css 在 reset 阶段一般都设置了 * {box-sizing: border-box;}
这样一来设置 padding 就不能向外扩展距离了,所以在这里我们要把他改回 content-box
。
.btn-container {
box-sizing: content-box;
height: 50px;
line-height: 50px;
color: #fff;
position: fixed;
bottom: 0;
left: 0;
right: 0;
text-align: center;
background: #FFF;
padding-bottom: env(safe-area-inset-bottom);
}
.btn {
width: 100%;
height: 50px;
line-height: 50px;
background-color: #00c340;
border: none;
}
在 safari 中,页面往上稍滑动一点,出现 safari 的操作栏后,底部按钮依然会紧贴着操作栏,非常有灵性:
处理起来一切都显得 简洁优雅细腻。
转自IMWeb社区,作者:zzbozheng,原文地址:http://imweb.io/topic/5baa38c279ddc80f36592efb
兼容iphone x刘海的正确姿势的更多相关文章
- IphoneX适配正确姿势
IphoneX适配正确姿势 写在前面 距离18年9月iphonex发布以来已经快两年了(所以对于iphonex机型的头部刘海(sensor housing)和底部小黑条(Home Indicator) ...
- 玩转 Ceph 的正确姿势
玩转 Ceph 的正确姿势 本文先介绍 Ceph, 然后会聊到一些正确使用 Ceph 的姿势:在集群规模小的时候,Ceph 怎么玩都没问题:但集群大了(到PB级别),这些准则可是保证集群健康运行的不二 ...
- Taro 多端开发的正确姿势:打造三端统一的网易严选(小程序、H5、React Native)
笔者所在的趣店 FED 早在去年 10 月份就已全面使用 Taro 框架开发小程序(当时版本为 1.1.0-beta.4),至今也上线了 2 个微信小程序.2 个支付宝小程序. 之所以选用 Taro, ...
- 转载 Python 操作 MySQL 的正确姿势 - 琉璃块
Python 操作 MySQL 的正确姿势 收录待用,修改转载已取得腾讯云授权 作者 |邵建永 编辑 | 顾乡 使用Python进行MySQL的库主要有三个,Python-MySQL(更熟悉的名字可能 ...
- Git 提交的正确姿势
Git 提交的正确姿势:Commit message 编写指南 SCOP范围 middleware core config plugin test type范围 Git 每次提交代码,都要写 Comm ...
- (转)Git 提交的正确姿势:Commit message 编写指南
Git 每次提交代码,都要写 Commit message(提交说明),否则就不允许提交. $ git commit -m "hello world" 上面代码的-m参数,就是用来 ...
- Flutter Webview添加Cookie的正确姿势
场景 h5页面要从cookie里面取数据,所以需要在flutter webview的cookie里面塞一些数据,设置的数据多达十几条:按照网上查的使用方式来设置,通过fiddler抓包发现,只能生效一 ...
- 判断是否为gif/png图片的正确姿势
判断是否为gif/png图片的正确姿势 1.在能取到图片后缀的前提下 1 2 3 4 5 6 7 8 9 //假设这是一个网络获取的URL NSString *path = @"http:/ ...
- 在Linux(ubuntu server)上面安装NodeJS的正确姿势
上一篇文章,我介绍了 在Windows中安装NodeJS的正确姿势,这一篇,我们继续来看一下在Linux上面安装和配置NodeJS. 为了保持一致,这里也列举三个方法 第一个方法:通过官网下载安装 h ...
随机推荐
- 【GDAL】GDAL栅格数据结构学习笔记(一): 关于Metadata
在维护一段代码时看到前任程序员写的获取栅格数据的CellSize的功能,竟然在知道GDAL的情况下去调用AE的接口来解算,觉得费解. 原来的思路是使用AE的Raster对象读取出Raster的文件大小 ...
- Topshelf 秒建 Windows 服务
https://www.jianshu.com/p/f2365e7b439c 在服务器上,可cmd cd 进入bin目录下执行
- linux执行时间段内日志关键字搜索
sed -n '/起始时间/,/结束时间/p' 日志文件 | grep '关键字' 查询文件debug.log在2019-11-18 08:00:00~2019-11-18 08:21:00时间段内e ...
- 终于好了 ipython 里执行dos命令 显示结果却显示在kernel界面里 搞定了
import os cmd = r'type c:\foo.txt' os.system(cmd) import os cmd = r'type c:\foo.txt' os.system(cmd) ...
- zabbix部署agent
1.下载zabbix源 rpm -Uvh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-2.el7.noarc ...
- django-redis-cache缓存使用
1. redis安装配置 (1)到redis目录 [root@localhost redis-2.8.17]# ls 00-RELEASENOTES CONTRIBUTING deps Makefil ...
- 记C函数指针的“小坑”
今天遇到一个C函数指针的小坑,索性记下来. 我在a.c 文件里面,引用b.c 文件的函数声明作为指针引用 比如在a.c生命一个函数指针 typedef void (*free)(void *val) ...
- Springboot系列1_什么是Springboot
Springboot系列1_什么是Springboot */--> code {color: #FF0000} pre.src {background-color: #002b36; color ...
- HDU 5125 magic balls(线段树+DP)
magic balls Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- Java原理领悟-线程池(Executor)
线程池全面解析 什么是线程池? 很简单,简单看名字就知道是装有线程的池子,我们可以把要执行的多线程交给线程池来处理,和连接池的概念一样,通过维护一定数量的线程池来达到多个线程的复用. 线程池的好处 我 ...