目前解决移动端1px边框最好的方法

在移动端开发时,经常会遇到在视网膜屏幕中元素边框变粗的问题。本文将带你探讨边框变粗问题的产生原因及介绍目前市面上最好的解决方法。

1px 边框问题的由来

苹果 iPhone4 首次提出了 Retina Display(视网膜屏幕)的概念,在 iPhone4 使用的视网膜屏幕中,把 2x2 个像素当 1 个物理像素使用,即使用 2x2 个像素显示原来 1 个物理像素显示的内容,从而让 UI 显示更精致清晰,这 2x2 个像素叫做逻辑像素。像这种像素比(像素比(即dpr)= 物理像素 / 逻辑像素)为 2 的视网膜屏幕也被称为二倍屏,目前市面上还有像素比更高的三倍屏、四倍屏。而 CSS 中 1px 指的是物理像素,因此,设置为 1px 的边框在 dpr = 2 的视网膜屏幕中实际占用了 2 个逻辑像素的宽度,这就导致了界面边框变粗的视觉体验。

使用 transform 解决

通过设置元素的 box-sizing 为 border-box,然后构建伪元素,再使用 CSS3 的 transform 缩放,这是目前市面上最受推崇的解决方法。这种方法可以满足所有的场景,而且修改灵活,唯一的缺陷是,对于已使用伪元素的元素要多嵌套一个无用元素。具体的实现如下:

.one-pixel-border {
  position: relative;
  box-sizing: border-box;
}

.one-pixel-border::before {
  display: block;
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 200%;
  height: 200%;
  border: 1px solid red;
  transform: translate(-50%, -50%) scale(0.5, 0.5);
}

这样就可以得到 0.5px 的边框。

还可以结合媒体查询(@media)解决不同 dpr 值屏幕的边框问题,如下:

@media screen and (-webkit-min-device-pixel-ratio: 2), (min-resolution: 2dppx) {
  ...
}

@media screen and (-webkit-min-device-pixel-ratio: 3), (min-resolution: 3dppx) {
  ...
}

注意:IOS 系统的 safari 浏览器不支持标准的 min-resolution,使用非标准的 min-device-pixel-ratio。

使用 pixel-border.css 解决

pixel-border.css是一个解决移动端 1px 边框的通用 CSS 工具。使用 transform 的解决方法,仅有几行的源码,使用起来非常方便,是目前发现最好的解决方法。

安装

npm安装:

npm install pixel-border --save

yarn安装:

yarn add pixel-border

浏览器安装,建议安装压缩后的版本:

<link rel="stylesheet" href="path/to/pixel-border.min.css"><link>

使用

pixel-border 通过元素的 ::before 伪元素使用 transform 缩放为元素设置边框。因此,你可以使用原生的 CSS 边框属性为原素设置边框,只需要在元素上添加一个 pixel-border 或 pixel-border="true" 的属性,并设置元素的 border-style 值即可。如下会创建一个单像素边框:

<div pixel-border style="border-style: solid;">单像素边框</div>

注意:pixel-border已为元素的边框设置为固定值 1px,因此不要为元素再设置 border-width,并且元素的 box-sizing 值被设置为 border-box,请不要重置为其他类型的值。

设置任意边框:

设置元素某一边的边框时,只需为元素设置 border-top-style、border-bottom-style、border-left-style、border-right-style 其中一项的值,并设置元素 border-color 的值即可。如下设置上边边框:

<style>
  .border-top {
    border-top-style: solid;
    border-top-color: red;
  }
</style>

<div class="border-top" pixel-border>上边框</div>

设置圆角边框:

当需要圆角边框时,始终为 border-radius 设置百分比值。如下:

<style>
  .border-radius {
    width: 100px;
    height: 100px;
    border-style: solid;
    border-color: red;
    border-radius: 10%;
  }
</style>

<div class="border-radius" pixel-border>圆角边框</div>
(0)

相关推荐

  • 前端面试题之CSS

    两种盒模型 盒模型分为W3C的标准模型和IE模型 盒模型又称为框模型,包含了元素内容(content).内边距(padding).外边距(margin).边框(border) 如图: W3C的标准模型 ...

  • css总结-笔记--部分非原创--属于资源整合

    文章目录 一.css基础教程 选择器的优先级: 4.1.派生选择器 4.2.id选择器 讨论:为什么相同id的值在每个 HTML 文档中只能出现一次? 3.1选择器的分组 3.2曾经存在过的继承问题 ...

  • CSS知识点总结

    CSS的简介: 1.CSS的定义:层叠样式表.属性和属性值用冒号分隔开,以分号结尾(这些符号都是英文的). 2.CSS得引入方式: 行内引入:<div style='这里写样式'>我是一个 ...

  • 前端开发技术之css样式学习笔记分享

    概述 前端培训开发中将前端结构化,html 是文档结构.css 是设置样式(美化页面).js是逻辑结构 重点是 "选择器" 和 "盒子模型" 发展史 CSS1. ...

  • uni-app开发经验分享五: 解决三端页面兼容问题的方法

    在做uni-app开发的过程中,我们最头疼可能不是开发的过程中的逻辑,而是最后要做的三端兼容测试和修改,在我开发的项目中,这一步都是最头疼和令人头秃的过程,这里总结一些个人开发遇到的问题,希望对大家有 ...

  • [css] 第105天 怎么实现移动端的边框0.5px?

    今日试题: 怎么实现移动端的边框0.5px? 此开源项目四大宗旨:勤思考,多动手,善总结,能坚持 <论语>,曾子曰:"吾日三省吾身"(我每天多次反省自己). 前端面试每 ...

  • vue使用fastclick解决移动端 click 300ms延迟

    安装fastclick npm install fastclick --save main.js 中 //导入 import FastClick from 'fastclick' //挂载到body上 ...

  • 『手抄报边框』大象和小老鼠变身为万能边框,解决你手抄报边框的烦恼!

    手抄报作业 写在课前 小朋友们 美观的手抄报,离不开手抄报边框 今天我们来一组可爱的万能手抄报边框 是由大象和小老鼠组合成的哦 而且还可以将手抄报边框 单独画出,绘制一个读书卡呢 需要什么主题手抄报可 ...

  • 一加全面屏新解决塞在额头边框上,这算挖孔还是水滴?

    在推进全面屏进程中,如何安置前置摄像头成为了一个难题.苹果选择居中的刘海,三星选择打孔,而 OPPO 的 Find 系列则选择弹出式设计,而屏下摄像头方案目前尚未成熟商用.根据一加最新技术专利,该公司 ...

  • [javascript] 解决移动端手机浏览器软键盘遮挡输入框问题

    在手机端经常有这样的需求 , 最下面是输入框类似微信输入框 , 我们一般设置成了position:fixed 但是当点击到输入框的时候, 软键盘弹出来遮挡了输入框 其实解决这个问题非常简单 , 那就是 ...

  • 七问解决高端人才招聘难题?!

    张霞,福道诚壹咨询公司首席顾问,原阿里巴巴人力资源副总裁.先后工作于摩托罗拉.微软中国.Towers Perrin.2004年加入阿里巴巴,先后任职薪酬福利部总监.集团副总裁,曾负责B2B中国事业部人 ...

  • vue插件--fastclick,解决移动端300ms延迟

    vue插件--fastclick,解决移动端300ms延迟

  • 解决企业成本欠缺和增值税的方法在这里

    解决企业成本欠缺和增值税的方法在这里 企业一般都会在发展壮大后开始进行税务筹划,一个企业发展后自然会有税务方面的压力,为了缓解这样的压力,有的大企业会与当地进行谈判,纳税之后当地能够奖励一部分给企业作 ...