美文网首页前端100问
【前端100问】Q68:如何解决移动端 Retina 屏 1px

【前端100问】Q68:如何解决移动端 Retina 屏 1px

作者: alanwhy | 来源:发表于2021-02-02 09:11 被阅读0次

    写在前面

    此系列来源于开源项目:前端 100 问:能搞懂 80%的请把简历给我
    为了备战 2021 春招
    每天一题,督促自己
    从多方面多角度总结答案,丰富知识
    如何解决移动端 Retina 屏 1px 像素问题
    简书整合地址:前端 100 问

    正文回答

    问题是 现在已经没有1px的问题了啊。17以前的BUG了吧?

    造成边框变粗的原因

    其实这个原因很简单,因为css中的1px并不等于移动设备的1px,这些由于不同的手机有不同的像素密度。在window对象中有一个devicePixelRatio属性,他可以反应css中的像素与设备的像素比。

    devicePixelRatio的官方的定义为:设备物理像素和设备独立像素的比例,也就是 devicePixelRatio = 物理像素 / 独立像素。

    1、0.5px边框

    解决方案是通过 JavaScript 检测浏览器能否处理0.5px的边框,如果可以,给html标签元素添加个class。

    if (window.devicePixelRatio && devicePixelRatio >= 2) {
    var testElem = document.createElement('div');
    testElem.style.border = '.5px solid transparent';
    document.body.appendChild(testElem);
    if (testElem.offsetHeight == 1) {
    document.querySelector('html').classList.add('hairlines');
    }
    document.body.removeChild(testElem);
    }
    // 脚本应该放在内,如果在里面运行,需要包装 $(document).ready(function() {})
    
    div {
      border: 1px solid #bbb;
    }
    .hairlines div {
      border-width: 0.5px;
    }
    

    2、使用border-image实现

    .border-bottom-1px {
      border-width: 0 0 1px 0;
      -webkit-border-image: url(linenew.png) 0 0 2 0 stretch;
      border-image: url(linenew.png) 0 0 2 0 stretch;
    }
    

    3、使用background-image实现

    .background-image-1px {
      background: url(../img/line.png) repeat-x left bottom;
      -webkit-background-size: 100% 1px;
      background-size: 100% 1px;
    }
    

    4、多背景渐变实现

    .background-gradient-1px {
      background:
        linear-gradient(180deg, black, black 50%, transparent 50%) top left / 100% 1px no-repeat,
        linear-gradient(90deg, black, black 50%, transparent 50%) top right / 1px 100% no-repeat,
        linear-gradient(0, black, black 50%, transparent 50%) bottom right / 100% 1px no-repeat,
        linear-gradient(-90deg, black, black 50%, transparent 50%) bottom left / 1px 100% no-repeat;
    }
    /* 或者 */
    .background-gradient-1px{
      background: -webkit-gradient(linear, left top, left bottom, color-stop(.5, transparent), color-stop(.5, #c8c7cc), to(#c8c7cc)) left bottom repeat-x;
      background-size: 100% 1px;
    }
    

    5、使用box-shadow模拟边框

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

    6、viewport + rem 实现

    7、伪类 + transform 实现

    /* 单条border样式设置 */
    .scale-1px{
      position: relative;
      border:none;
    }
    .scale-1px: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;
    }
    
    /* 四条boder样式设置 */
    .scale-1px{
      position: relative;
      margin-bottom: 20px;
      border:none;
    }
    .scale-1px: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;
    }
    
    // 判断是否 Retina 屏
    if(window.devicePixelRatio && devicePixelRatio >= 2){
      document.querySelector('ul').className = 'scale-1px';
    }
    

    参考原文 7 种方法解决移动端 Retina 屏幕 1px 边框问题

    相关文章

      网友评论

        本文标题:【前端100问】Q68:如何解决移动端 Retina 屏 1px

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