(给前端大全加星标,提升前端技能)

作者: 大转转FE/李兴瑞

1px线变粗的原因

在做移动端项目时,常常是根据设计图设置元素节点的大小和样式,但是有时候根据设计图写出来的样式还是不如人意,虽然表面上看起来和设计稿是一样的,可是就是没设计稿那种感觉,而且莫名还有一种山寨的气息,UI审查的时候也常常会觉得分割线或则边框线太粗了,要更细一点,但是一看代码,已经是1px了,为什么看着还是那么粗呢?

要知道问题的原因首先要了解一下几个概念:

(1)物理像素(physical pixel)

一个物理像素是显示器(手机屏幕)上最小的物理显示单元(像素颗粒),在操作系统的调度下,每一个设备像素都有自己的颜色值和亮度值。 如:iPhone6上就有750*1334个物理像素颗粒。

(2)设备独立像素(density-independent pixel)

设备独立像素(也叫密度无关像素),可以认为是计算机坐标系统中得一个点,这个点代表一个可以由程序使用的虚拟像素(比如:css像素),有时我们也说成是逻辑像素。然后由相关系统转换为物理像素。所以说,物理像素和设备独立像素之间存在着一定的对应关系,这就是接下来要说的设备像素比。

(3)设备像素比(device pixel ratio )简称dpr

设备像素比(简称dpr)定义了物理像素和设备独立像素的对应关系。它的值可以按如下的公式的得到:

设备像素比(dpr)=物理像素/逻辑像素(px) // 在某一方向上,x方向或者y方向,下图dpr=2

知道了设备像素比,我们就大概知道了1px线变粗的原因。简单来说就是手机屏幕分辨率越来越高了,同样大小的一个手机,它的实际物理像素数更多了。因为不同的移动设备有不同的像素密度,所以我们所写的1px在不同的移动设备上等于这个移动设备的1px。现在做移动端开发时一般都要加上一句话:

name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

这句话定义了本页面的viewport的宽度为设备宽度,初始缩放值和最大缩放值都为1,并禁止了用户缩放。

viewport的设置和屏幕物理分辨率是按比例而不是相同的,移动端window对象有个devicePixelRatio属性,它表示设备物理像素和css像素的比例,在retina屏的iphone手机上,这个值为2或3, css里写的1px长度映射到物理像素上就有2px或3px。通过设置viewport,可以改变css中的1px用多少物理像素来渲染,设置了不同的viewport,当然1px的线条看起来粗细不一致。

1px线变粗的解决方法

伪类 + scale

这种方法的原理就是把原来元素的border去掉,然后用 :before 或者 :after 重做 border ,原先的元素相对定位,新做的 border 绝对,定位使用 transform 的 scale 把线条高度缩小一半,新边框就相当于0.5px了。代码如下:

.scale{

position: relative;

border:none;

}

.scale: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;

}

使用flexible.js

前面已经说过1px变粗的原因就在于一刀切的设置viewport宽度,如果能把viewport宽度设置为实际的设备物理宽度,css里的1px不就等于实际1px长了么。 flexible.js的原理就是这样,先获取设备缩放比devicePixelRatio,然后根据缩放比来动态设定viewport的值,这样导致的结果就是无论是哪个设备,1px所表示的永远是1个设备像素,即该设备的最小像素。

//devicePixelRatio=2时,输出meta如下

"viewport" content="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">

//devicePixelRatio=3时,输出meta如下

"viewport" content="initial-scale=0.3333333333333333, maximum-scale=0.3333333333333333, minimum-scale=0.3333333333333333, user-scalable=no">

使用meta viewport控制

原理如上。代码如下:

//1px像素线条

"viewport" content="width=device-width,initial-scale=1.0,user-scalable=0">

//0.5像素线条

"viewport" content="width=device-width,initial-scale=0.5,user-scalable=0">

使用box-shadow模拟边框

利用css 对阴影处理的方式实现0.5px的效果。代码如下:

.box-shadow-1px {

box-shadow: inset 0px -1px 1px -1px #c8c7cc;

}

使用border-image

首先需要自己制作一个0.5像素的线条作为线条背景图片。。代码如下:

p{

border-width: 0 0 1px 0;

border-image: imageUrl 2 0 round;

}

利用背景渐变linear-gradient

利用linear-gradient利用背景图片渐变,从有色到透明,默认方向从上到下,从0deg到50%的地方颜色是边框颜色,然后下边一半颜色就是透明了。然后设置背景宽度100%,高度是1px,再去掉repeat,所以有颜色的就是0.5px的边框。代码如下:

.bg_border {

background-image: linear-gradient(0deg,black 50%,transparent 50%);

background-size: 100% 1px;

background-repeat: no-repeat;

}

推荐阅读

(点击标题可跳转阅读)

看完这篇,你也可以实现一个360度全景插件

从 Mixin 到 HOC 再到 Hook

提高幸福感的 9 个 CSS 技巧

觉得本文对你有帮助?请分享给更多人

关注「前端大全」加星标,提升前端技能

好文章,我在看❤️

no target device found怎么解决_关于移动端开发 1px 线的一些理解和解决办法相关推荐

  1. 手机1像素线粗_关于移动端开发 1px 线的一些理解和解决办法

    (给前端大全加星标,提升前端技能) 作者: 大转转FE/李兴瑞 1px线变粗的原因 在做移动端项目时,常常是根据设计图设置元素节点的大小和样式,但是有时候根据设计图写出来的样式还是不如人意,虽然表面上 ...

  2. 列名无效怎么解决_电脑win键失效怎么办? 键盘win键无效的解决办法

    电脑win键失效怎么办?在使用windows系统的时候,发现一个问题,就是win键失效了,怎么按都没有反应,该怎么办呢?羡慕我们就来分享键盘win键无效的三种解决办法,需要的朋友可以参考下 对于编程人 ...

  3. 电脑卡顿不流畅怎么解决_电脑卡顿是什么原因,电脑卡顿严重解决方法【详解】...

    电脑运行卡对用户来说是件头疼的事情,尤其是对电脑不太了解的小白用户来说更是如此,电脑卡顿是什么原因呢?今天小编就带大家首先简单的了解一下电脑的基本知识. 电脑主要由 处理器,内存,硬盘,显卡,声卡,主 ...

  4. 如何解决文件不存在_传奇微端配置Pak密码文件不存在怎么解决?传奇分享汇

    在架设gom引擎的版本时,你是否有遇到和我一样的情况呢?微端配置后pak密码文件不存在是怎么回事呢?今天分享pak密码文件不存在的解决方法 为什么会出现pak密码文件不存在呢?总结分析有以下2种原因会 ...

  5. 苹果手机软件闪退怎么解决_和平精英闪退怎么办 和平精英无法登陆怎么解决...

    [海峡网] 和平精英闪退怎么办?和平精英无法登陆怎么解决?一些玩家在玩和平精英手游的时候就会遇到闪退.无法登陆等各种各样的问题,下面小编为大家带来了和平精英闪退.无法登陆游戏的解决方法,一起来看看吧. ...

  6. 308 permanent redirect怎么解决_「网站」WordPress网站更改固定链接以后怎么解决404错误...

    细心的人可能会发现,这篇文章跟如何应公安备案要求将备案编号HTML代码和备案编号图标粘贴到网页的底部位置发布的时间相差并不长,因为我搞定一个问题又跑去搞另一个问题了,之后再一起写的文章 回到正题,Wo ...

  7. wifi丢包率高怎么解决_网络Ping延时高怎么办 网络丢包高怎么解决

    电脑打开网页慢怎么办?利用Ping检测网络时延时高怎么解决呢?小编最近在玩LOL时出现Ping延时高的情况,导致游戏界面非常卡,打开网页时也显得很慢,由于使用笔记本电脑无线网卡来连接外网,因此可以通过 ...

  8. 安卓手机卡顿怎么解决_安卓手机卡顿反应慢怎么办?我教你解决根本原因

    你的手机是不是经常会莫名其妙的变卡?明明点击了某个应用却半天都反应不过来?有了电话打来却迟迟看不到电话界面?甚至多个软件无缘无故的停止运行?这些状况都是安卓手机用户都会遇到的问题,其实主要原因是由于手 ...

  9. efipart红色怎么解决_说说冷热冲击实验箱发生水压力不够的解决方法

    大家都知道冷热冲击实验箱是用来检测金属.塑料.橡胶.电子等材料行业必备的测试设备,用于测试材料结构或复合材料,在瞬间下经极高温及极低温的连续环境下忍受的程度,得以在最短时间内检测试样因热胀冷缩所引起的 ...

  10. iwrite提交不了作业_痛点!为什么开发了那么多软件,还是解决不了教学问题!...

    先为今天的主题铺一段对话吧 线上授课快一个月过去了,老师们的感受如何呢?不管咱们学校是选用强大的钉钉还是小众的其它(点名不礼貌)预测在复学后放弃现有授课软件的老师会达到五分之四以上. 因为" ...

最新文章

  1. java将输出结果写入csv文件_如何在Java中将数据写入.csv文件?
  2. 解决 DNS general: warning: *** POKED TIMER ***
  3. jetson nano 采坑记录
  4. 承受海量访问建站方案
  5. 06 Jquery 基础
  6. python和arduino串口通信_利用串行通信实现python与arduino的同步
  7. pptx模块的安装与基本使用
  8. java系列8:private修饰的成员变量怎么传参
  9. 网络基础知识:FTP命令及应答码
  10. Unity 序列化的问题
  11. PHP高并发高负载下的3种实战场景解决方法
  12. wps office 2013 利用wps文字制作一张漂亮的座位表
  13. win10升级助手_快升级!win10精简版不到10G,比win7还干净流畅,无需更新!
  14. 3.1 埃拉托色尼筛选
  15. 软件测试之 对朋友圈点赞功能进行测试
  16. 汽车电子(二)--- 车机娱乐系统介绍
  17. 剑指offer_4 二叉树遍历
  18. 大学里可以考的证书有哪些?
  19. 海关爬虫7代(圣佛版)
  20. python gevent安装_gevent

热门文章

  1. Nginx负载均衡与反向代理——基础功能
  2. JMETER从数据库获取数据作为脚本参数
  3. Fedora25安装mariadb并设置权限
  4. PAT---数字分类
  5. AjaxUpload
  6. HDOJ--2112--HDU Today
  7. TCP\IP协议实践:wireshark抓包分析之链路层与网络层
  8. mongodb C++ Driver安装
  9. Unreal Engine 4 C++ UCLASS构造函数易出错分析
  10. 《Cocos2D-x权威指南》——3.1 节点类