美文网首页前端开发那些事儿css特殊样式
如何解决移动端开发1px边框问题

如何解决移动端开发1px边框问题

作者: Angrybird233 | 来源:发表于2020-04-22 20:46 被阅读0次

    前言

    在我们实际移动端开发的过程中,有可能会遇到在安卓和IOS端的1px的边框宽度不一致,在高清屏下,移动端的1px 会很粗。对于要求比较高的公司来说这是个必须解决的问题。

    产生原因

    在window对象中有一个devicePixelRatio属性,他可以反应css中的像素与设备的像素比。然而1px在不同的移动设备上都等于这个移动设备的1px,这是因为不同的移动设备有不同的像素密度。有关这个属性,它的官方的定义为:设备物理像素和设备独立像素的比例,也就是

    devicePixelRatio = 物理像素 / 独立像素

    在html的头部有这样一行代码

    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    
    • 这句话定义了本页面的viewport的宽度为设备宽度,初始缩放值和最大缩放值都为1,并禁止了用户缩放.
    • 不同的手机都有一个完美适配的viewport。以实际举例: iphone3和iphone4的屏幕宽度分别是320px,640px, 但是它们的ideal viewport的宽度都是320px, 设置了设备宽度后, 320px宽的元素都能100%的填充满屏幕宽. 不同手机的ideal viewport宽度是不一样的, 控制viewport的好处就在于一套css可以适配多个机型.
    • viewport的设置和屏幕物理分辨率是按比例而不是相同的. 移动端window对象有个devicePixelRatio属性, 它表示设备物理像素和css像素的比例, 在retina屏的iphone手机上, 这个值为2或3, css里写的1px长度映射到物理像素上就有2px或3px那么长.

    解决方案

    方案一: 伪类+transform实现

    实现原理:把原先元素的 border 去掉,然后利用伪类 :before 或 :after 重写 border ,并 transform 的 scale 缩小一半,原先的元素相对定位,新做的 border 绝对定位。

    • 单个边框
    .scale{
      position: relative;
      border:none;
    }
    .scale:after{
      content: '';
      position: absolute;
      bottom: 0;
      background: #000;
      width: 100%;
      height: 1px;
      -webkit-transform: scaleY(0.5);
      transform: scaleY(0.5);
      -webkit-transform-origin: 0 0;
      transform-origin: 0 0;
    }
    ···
    + 四个边框
    ```.scale{
      position: relative;
      margin-bottom: 20px;
      border:none;
    }
    .scale:after{
      content: '';
      position: absolute;
      top: 0;
      left: 0;
      border: 1px solid #000;
      -webkit-box-sizing: border-box;
      box-sizing: border-box;
      width: 200%;
      height: 200%;
      -webkit-transform: scale(0.5);
      transform: scale(0.5);
      -webkit-transform-origin: left top;
      transform-origin: left top;
    }
    

    方案二:使用边框图片

      border: 1px solid transparent;
      border-image: url('./../../image/96.jpg') 2 repeat;
    

    缺点:改版时颜色变了,需要重新换图片。

    方案三:使用 flexible.js

    这是淘宝移动端采取的方案, flexible.js的github的地址. 前面已经说过1px变粗的原因就在于一刀切的设置viewport宽度, 如果能把viewport宽度设置为实际的设备物理宽度, css里的1px不就等于实际1px长了么. flexible.js就是这样做的。

    里面的scale值指的是对ideal viewport的缩放, flexible.js检测到IOS机型, 会算出scale = 1/devicePixelRatio, 然后设置viewport

    metaEl = doc.createElement('meta');
    metaEl.setAttribute('name', 'viewport');
    metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
    

    方案四:使用box-shadow模拟边框
    利用css 对阴影处理的方式实现0.5px的效果

    .box-shadow-1px {
      box-shadow: inset 0px -1px 1px -1px #c8c7cc;
    }
    

    文章参考链接: 关于移动端开发1px边框的一些理解及解决办法

    相关文章

      网友评论

        本文标题:如何解决移动端开发1px边框问题

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