最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 前端1px问题及解决方案

    正文概述 掘金(前端橘子君)   2020-12-02   535

    在项目开发过程中,设计师经常会说,这里边框像素边框不对,要求1像素但是实际是2像素,当我们去查代码时我们写的就是1px,这是前端开发者经常遇到的一个问题,也就是1px像素问题

    要了解并解决问题,我们首先需要了解其原理才能从根本上找到解决方案。

    首先我们需要对物理像素逻辑像素设备像素比有一个概念。

    物理像素(DP)

    物理像素又称设备像素,是组成显示屏的基本单位,每一台设备的物理像素在出厂时就已经固定好了,不会改变,我们平时看到的图片是通过每个像素不同颜色组合而成的。

    设计师一般要求的像素就是物理像素。

    逻辑像素(DIP)

    逻辑像素又称为设备独立像素CSS像素,是组成图像的基本单位,它是一个抽象概念,我们可以笼统的认为屏幕可视区域的宽度就是逻辑像素的大小。在1倍屏下,1倍逻辑像素=1倍物理像素;2倍屏下,1倍逻辑像素=2倍物理像素。逻辑像素是可变的,例如当我们放大页面的尺寸比例时,逻辑像素也就随之扩大。

    前端开发者在CSS中设置的像素就是逻辑像素。

    设备像素比(DPR)

    设备像素比描述的是物理像素和逻辑像素之间的比例关系。

    设备像素比 = 物理像素 / 逻辑像素

    怎么获取DPR?

    window.devicePixelRatio@media screen and (-webkit-min-device-pixel-ratio: 2) {}

    PPI

    PPI指的是设备每英寸的物理像素点,说的简单点就是一英寸的屏幕中由多少个物理像素组合而成。

    我们买手机的时候规格上会写上:

    尺寸:5.5英寸
    分辨率:1920 * 1080 像素
    

    这里的1920 * 1080指的是物理像素,就是可视区域内总物理像素的数量,1920代表是长边所占像素大小,1080表示短边所占像素大小。

    怎么计算PPI?

    斜边像素大小^2 = 长边像素大小^2 + 短边像素大小^2  (其中^2代表平方)
    PPI = 斜边像素大小 / 设备尺寸
    
    // 以上述手机的尺寸来举例
    斜边像素大小^2 = 1920^2 + 1080^2;
    PPI = 斜边像素大小 / 5.5英寸
    

    PPI越高,图像越清晰。

    回归正题,既然我们已经知道了这些概念了,那么就不难理解开篇中设计师和前端开发者之间的问题了,就是因为两者的单位是不同的。

    下面就是解决方案。

    CSS媒体查询方案

    我们知道了如何获取设备像素比DPR,那么我们就从这两点进行解决。

    .div {
      border-width: 1px;
    }
    /* 两倍像素下 */
    @media screen and (-webkit-min-device-pixel-ratio: 2) {
      .div {
        border-width: 0.5px;
      }
    }
    /* 三倍像素下 */
    @media screen and (-webkit-min-device-pixel-ratio: 3) {
      .div {
        border-width: 0.333333px;
      }
    }
    

    缺点

    • 代码量多
    • 低版本IE不兼容

    viewport + rem

    var viewport = document.querySelector("meta[name=viewport]");
    var ppi = 1;
    if (window.devicePixelRatio == 2) ppi = 2;
    if (window.devicePixelRatio == 3) ppi = 3;
    
    viewport.setAttribute('content', `width=device-width,initial-scale=${1/ppi}, maximum-scale=${1/ppi}, minimum-scale=${1/ppi}, user-scalable=no`);
    
    // 设置根字体大小
    var docEl = document.documentElement; 
    var fontsize = 10 * (docEl.clientWidth / 320) + 'px'; 
    docEl.style.fontSize = fontsize;
    
    // 在CSS中用rem单位就行了
    

    为什么使用320作为基准?因为所有非视网膜屏幕的iphone在垂直的时候,宽度为320物理像素。

    缺点:

    • 由于JS对文档进行修改,所以性能上有一定影响
    • 会对项目中所有使用rem单位的对象进行影响。不适合老项目改造。

    transform

    .div {
      width: 200%;
      transform: scale(0.5);
      transform-origin: top left;
    }
    

    缺点

    • 对于已经使用的伪类(如:clearfix),可能需要多层嵌套

    box-shadow模拟边框

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

    缺点

    • 会有颜色渐变

    更多相关文档,请见:

    线上地址 【前端橘子君】

    GitHub仓库【前端橘子君】


    起源地下载网 » 前端1px问题及解决方案

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元