zoukankan      html  css  js  c++  java
  • 兼容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( ) 可以获取到非安全边距,再结合 paddingmargin 来控制页面元素避开非安全区域。 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 {
       100%;
      height: 50px;
      line-height: 50px;
      background-color: #00c340;
      border: none;
    }
    在 safari 中,页面往上稍滑动一点,出现 safari 的操作栏后,底部按钮依然会紧贴着操作栏,非常有灵性:
    处理起来一切都显得 简洁优雅细腻。
    转自IMWeb社区,作者:zzbozheng,原文地址:http://imweb.io/topic/5baa38c279ddc80f36592efb
  • 相关阅读:
    1、 小白带你入坑xamarin系列之环境搭建和准备
    Xamarin.Forms3.0 在Android中TabbedPage的注意事项
    .NetCore + NSwag生成可交互API文档
    Xamarin.forms3.0中Naxam.BottomTabbedPage v0.2.0.2遇到的问题
    Xamarin.Forms ContentPage生命周期的困惑
    Xamarin.Forms 手势密码实现
    [编程珠玑]位向量与排序
    MVVM Light Messenger的使用
    WPF 利用Process.Start()方法启动指定路径下的exe文件并传递参数接收参数
    Xamarin.Forms中实现CheckBox控件
  • 原文地址:https://www.cnblogs.com/Fanzifeng/p/9956526.html
Copyright © 2011-2022 走看看