zoukankan      html  css  js  c++  java
  • 一像素边框的问题(使不同dpr设备完美显示1px的border)

    问题:不同dpr的屏幕有不同的屋里像素值,而我们css像素的1px由于不同屏幕的渲染会导致宽度并不一样;

    例如: dpr为2的retina屏幕是有四个物理像素点(真实屏幕上的点)组成一个逻辑(css)像素点。所以我们写css的1px的时候会表现出不同的宽度;

    知识:

     物理像素: 物理像素又被称为设备像素、设备物理像素,它是显示器(电脑、手机屏幕)最小的物理显示单位,每个物理像素由颜色值和亮度值组成。所谓的一倍屏、二倍屏(Retina)、三倍屏,指的是设备以多少物理像素来显示一个CSS像素,也就是说,多倍屏以更多更精细的物理像素点来显示一个CSS像素点,在普通屏幕下1个CSS像素对应1个物理像素,而在Retina屏幕下,1个CSS像素对应的却是4个物理像素(参照下文田字示意图理解)。

    设备像素: 设备独立像素又被称为CSS像素,是我们写CSS时所用的像素,它是一个抽像的单位,主要使用在浏览器上,用来精确度量Web页面上的内容。

    DPR(device pixel ratio):设备像素比简称为dpr,定义了物理像素和设备独立像素的对应关系:设备像素比 = 物理像素 / 设备独立像素。

    如果我们统一写1px宽度会 在2倍屏幕上会显示成2个物理px的宽度,3倍屏幕上显示3个物理px的宽度;

    解决办法: 

    1 伪元素+ transform

    去掉原先的边框,增加新的元素 

    .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;
    }

    有图有真相,在MacBook Pro屏幕上的效果如图

    // 这里查了一下四条边框的做法 是使用transform-origin来让伪元素元素变为边框 (mdn:transform-origin CSS属性让你更改一个元素变形的原点。)

    最好在使用前也判断一下,结合 JS 代码,判断是否 Retina 屏:

     

    2 viewport + rem 实现

    同时通过设置对应viewportrem基准值,这种方式就可以像以前一样轻松愉快的写1px了。
    devicePixelRatio = 2 时,输出viewport

    <meta name="viewport" content="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">
    
    三倍屏的时候
    
    <meta name="viewport" content="initial-scale=0.3333333333333333, maximum-scale=0.3333333333333333, minimum-scale=0.3333333333333333, user-scalable=no">
  • 相关阅读:
    Git 远程操作详解
    Golang io标准库
    Golang strings标准库
    Go WebSocket 实现
    Golang Gorm零值数据更新小坑
    [Linux] 分区扩容
    即截即贴,推荐一个提升截图对比效率的工具Snipaste
    POI 替换 word 关键字并保留样式
    前端图片压缩与 zip 压缩
    ubuntu20更换内核
  • 原文地址:https://www.cnblogs.com/qqfontofweb/p/15027934.html
Copyright © 2011-2022 走看看