美文网首页
前端 iPhoneX适配

前端 iPhoneX适配

作者: 吖蛋黄 | 来源:发表于2018-09-27 22:54 被阅读0次

    一、背景

    开发混合App,关于iPhoneX刘海的适配,应该是前端H5做,还是原生APP做呢?个人觉得原生APP做比较靠谱,毕竟原生知道是什么机型,而CSS媒体查询觉得很难做到完美(问题一是工具条高度难以确定,问题二可能存在相同的媒体参数)。但是由于iOS原生开发的适配也老存在问题,交流麻烦,所以尝试在H5上做适配,希望不足的可以得到建议。

    二、方案

    百度后,总结主要有两种想法。
    方案1(本文采用)使用@media 媒体查询尺寸

    iPhone各机型的开发尺寸

    1125 × 2436 iPhoneX, XS Default-812h@3x
    828 x 1792 iPhoneXR Default-828h@2x
    1242 x 2688 iPhoneX Max Default-1242h@3x

    方案2(不可用)根据是否有支持ios11 增加新特性安全区域来判断是不是iphoneX,判断的是系统,不是机型,所以对于其他安装了iOS11以上的机子会有问题。

    三、代码实现

    1、iOS开发人员提供全屏的webview
    2、viewport-fit meta标签设置cover。

    <meta name="viewport" 
    content="width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no,viewport-fit=cover" />
    

    3、媒体查询

    html{
        height: 100%;
        width: 100%;
        overflow: hidden;
        /*和header背景颜色一样,使工具条和header背景颜色一样*/
        background-color: #fff !important;
      }
    
      /*top 这里直接置顶,是因为项目需求。若要为工具条的高度,比较麻烦,所以建议原生做适配*/
      body {
        overflow: hidden;
        position: absolute;
        top: 0;
        bottom: 0;
        left: 0;
        right: 0;
      }
    
    /*兼容iphoneX*/
    /*判断是否是iphoneX,使用@media 媒体查询尺寸*/
    @media only screen and (device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) {
        body {
          top: constant(safe-area-inset-top);
          bottom: constant(safe-area-inset-bottom);
          left: constant(safe-area-inset-left);
          right: constant(safe-area-inset-right);
        }
      }
    
     /*方案2:不可用*/
     /*@supports 隔离兼容模式,根据是否有支持ios11 增加新特性来判断是不是iphoneX*/
      /* @supports (bottom: constant(safe-area-inset-top)) or (bottom: env(safe-area-inset-top))  {
        body {
          top: constant(safe-area-inset-top);
          bottom: constant(safe-area-inset-bottom);
          left: constant(safe-area-inset-left);
          right: constant(safe-area-inset-right);
        }
      }*/
    

    四、兼容前和兼容后对比

    兼容前和兼容后对比

    五、待改进

    本代码只媒体查询iphoneX,对于XS、X MAX、XR还需要增加媒体查询。

    六、相关资料

    对于iphoneX头部遮挡问题,苹果公司增加了一种方法来将安全区域布局指南暴露给CSS。他们添加了一个类似于CSS变量的概念,称为CSS常量。这些像系统设置的CSS变量,不能被覆盖,可以通过CSS中的constant()函数来访问,该函数已被提交给CSS工作组进行标准化。

    1、 iOS11中viewport-fit三个取值:

    描述
    auto 页面内容显示在safe area内。viewprot-fit:auto等同于viewport-fit:contain
    contain 页面内容显示在safe area内。viewport-fit:contain
    cover 页面内容充满屏幕。viewport-fit:cover

    2、 4个布局常数:生效前提是viewport-fit:cover
    constant(safe-area-inset-top):从视口顶部的安全区域插入量(以CSS像素为单位)。
    constant(safe-area-inset-bottom):从视口底部的安全区域插入量(以CSS像素为单位)。
    constant(safe-area-inset-left):从视口左侧的安全区域插入量(以CSS像素为单位)。
    constant(safe-area-inset-right):从视口右侧的安全区域插入量(以CSS像素为单位)。

    参考资料:
    关于H5页面在iPhoneX适配
    iPhone X的Web设计
    iPhone X适配没那么复杂,但也不是看上去这么简单
    剖析 iOS 11 网页适配问题
    iPhone X(10)屏幕分辨率与适配
    iPhone X 适配手Q H5 页面通用解决方案

    相关文章

      网友评论

          本文标题:前端 iPhoneX适配

          本文链接:https://www.haomeiwen.com/subject/vwzlnftx.html