美文网首页
移动端1px

移动端1px

作者: my木子 | 来源:发表于2021-06-07 08:56 被阅读0次

起因

  • 在项目开发过程中,前端代码设置 1px 边框,但在某些机型上显示较粗,像是 2px 甚至 3px,这就是1px像素问题

物理像素(DP)

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

逻辑像素(DIP)

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

设备像素比(DPR)

  • 设备像素比(DPR): 设备像素比 = 物理像素(DP) / 逻辑像素(DIP)
  • 一般来说,在PC端浏览器中,设备像素比(DPR)等于1,1px 像素就代表1个物理像素;但是在视网膜(retina)屏幕中,DPR普遍是2(例如 iPhone 8)或3(例如 iPhone 8 Plus),这就导致了 1px 问题

解决方案

  • 伪元素 + scale
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<style>
  /* 四条border样式设置 */
  .scale {
    position: relative;
    margin-bottom: 20px;
    border: none;
  }

  .scale:after {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    border: 1px solid red;
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
    width: 200%;
    height: 200%;
    /* 设置 X 轴Y 轴以中心点缩放 0.5 倍 */
    -webkit-transform: scale(0.5);
    transform: scale(0.5);
    /* 以左上角为原点,因为 scale 的缘故,位置要移动到左上角 */
    -webkit-transform-origin: left top;
    transform-origin: left top;
  }

  /* 单条水平border样式设置,如果是垂直border, 设置width为1px, height: 100% */
  .scale {
    position: relative;
    border: none;
  }

  .scale:after {
    content: '';
    position: absolute;
    bottom: 0;
    background: red;
    width: 100%;
    height: 1px;
    /* 设置Y 轴以中心点缩放 0.5 倍 */
    -webkit-transform: scaleY(0.5);
    transform: scaleY(0.5);
    /* 以左上角为原点,因为scale的缘故,位置要移动到左上角 */
    -webkit-transform-origin: left top;
    transform-origin: left top;
  }
</style>

<body>
  <div> cell <div>
</body>
<script>
  // 判断是否 Retina 屏
  if (window.devicePixelRatio && devicePixelRatio >= 2) {
    console.log('Retina 屏')
    document.querySelector('div').className = 'scale';
  }
</script>

</html>
  • 第三方插件,淘宝移动端采取的方案 flexible.js,动态设置 meta 标签,css 边框可直接设置 1px
// Install
npm i -S amfe-flexible

// Import
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
<script src="./node_modules/amfe-flexible/index.js"></script>

// 2 DPR
<meta name="viewport" content="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">

// 3 DPR
<meta name="viewport" content="initial-scale=0.3333333333333333, maximum-scale=0.3333333333333333, minimum-scale=0.3333333333333333, user-scalable=no">

相关文章

网友评论

      本文标题:移动端1px

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