一直不太清楚CSS中的1px与逻辑像素、物理像素是个什么关系(作为一名前端感觉很惭愧 -_-!),今天终于花时间彻底弄清楚了,其实弄清楚之后就觉得事情很简单,但也只有在弄清楚之后,才会觉得简单(语出《禅与摩托车维修艺术》,哈哈哈哈)。

两种像素

物理像素:设备屏幕实际拥有的像素点。比如iPhone 6的屏幕在宽度方向有750个像素点,高度方向有1334个像素点,所以iPhone 6 总共有750*1334个物理像素。

逻辑像素:也叫“设备独立像素”(Device Independent Pixel, DIP),可以理解为反映在CSS/JS代码里的像素点数。

设备像素比(Device Pixel Ratio, DPR):一个设备的物理像素与逻辑像素之比。

像素还分物理和逻辑?这两个玩意有啥区别?

其实在很久以前,的确是没区别的,CSS里写个1px,屏幕就给你渲染成1个实际的像素点,DPR=1,多么简单自然~

但是后来事情起了变化,搞事的就是Retina技术,这种技术使用4个乃至更多物理像素来渲染1个逻辑像素,这样一来,同样的CSS代码设置的尺寸,在Retina和非Retina屏幕上看起来大小是一样的,但在Retina屏幕上要精细得多。

在Retian屏上,DPR不再是1,而是大于1,比如2(iPhone 5 6 7 8)或3(iPhone 6 Plus等一系列Plus)或者为非整数(一些Android机),说不定还会涨。

举个例子,iPhone 6的物理像素上面已经说了,是750*1334,那它的逻辑像素呢?我们只需在iPhone 6的Safari里打印一下screen.width和screen.height就知道了,结果是 375*667,这就是它的逻辑像素,据此很容易计算出DRP为2。当然,我们还可以直接通过window.devicePixelRatio这个值来获取DRP,打印结果是2,符合我们的预期。

奇葩的iPhone 6 Plus

这里不得不提一下iPhone 6 Plus(以及同尺寸的其他果机),它的实际物理像素点个数是1080*1920,但如果你截个屏,你会发现截屏图片的宽高是1242*2208;浏览器的screen对象会告诉你,6 Plus的逻辑像素是414*736,正好是截屏宽度的三分之一,window.devicePixelRatio值也为3。

所以现在我们有了3种不同的像素值?什么情况?

是这样的,iPhone 6 Plus系统定义的屏幕像素就是1242*2208,系统会自动把这些像素点塞进1080*1920个实际像素点来渲染,这个过程对于开发者是透明的,无需理会。

所以对于前端来说,可以直接把1242视为6 Plus的“物理像素”,包括UE小姐姐们出图也是以1242为标准的,因此不妨把1242*2208称为6 Plus的“设计像素”。

苹果这是要闹那样?

其实,当初苹果公司在确定6 Plus的DRP时,纠结了半天:选2吧,同样的字号在6 Plus上看起来比6更小,不好;选3吧,字又显得太大了,导致一屏能展示的内容还没有6多;最适合视觉的DRP值是2.46,但这样一个数字能把设计师和程序员们逼疯。最后就想出了引入“设计像素”这样一个两全其美的方案,既让开发者开心,又让用户爽,岂不美哉?

1px边框问题

在苹果的带动下,Retina技术在移动设备上已经成了标配,所以前端攻城狮必须直面如下事实:

  1. 你想画个1px的下边框,但屏幕硬是塞给你一条宽度为2—3个物理像素的线。
  2. 你没法像安卓或iOS的同事那样直接操纵物理像素点。

这就是初级前端面试必考题之“1px边框问题”的由来。

1px边框问题的解法千奇百怪,各显神通,但以我的实践经验,最推崇的方法还是利用CSS3的transform: scale,因为简单直接、适用性和兼容性好。

你不是给我两个物理像素点吗?加个transform: scale(0.5),只剩一个点了~

三个物理像素点?那就scale(0.33)!

使用CSS的-webkit-min-device-pixel-ratio媒体查询可以针对不同的DPR做出处理 ,下面以Less代码为例:

@media (-webkit-min-device-pixel-ratio:2),(min-device-pixel-ratio:2){.border-bt-1px(@color) {position: relative;&::after {position: absolute;bottom: 0;width: 100%;height: 1px;background-color: @color;transform: scaleY(0.5);}}
}

上面介绍的是只有一边的情景,如果是四面都要有框,咋办?

那就画个DPR倍大小的矩形框,再scale一下,完事~

至此,本文的关于像素的知识,应是足够应对一般前端的工作需要了。

CSS中的px与物理像素、逻辑像素、1px边框问题

标签:面试   物理   宽高   两种   艺术   代码   直接   end   scale

原文地址:https://www.cnblogs.com/leegent/p/9404572.html

转载于:https://www.cnblogs.com/xiaocaiyuxiaoniao/p/10156680.html

CSS中的px与物理像素、逻辑像素、1px边框问题相关推荐

  1. css中的px与屏幕实际的分辨率的关系

    1.css中的px称为逻辑像素 :也叫"设备独立像素"(Device Independent Pixel, DIP),可以理解为反映在CSS/JS代码里的像素点数. 2.屏幕的分辨 ...

  2. 我应该在CSS中使用px或rem值单位吗?

    本文翻译自:Should I use px or rem value units in my CSS? I am designing a new website and I want it to be ...

  3. CSS媒体查询-物理像素-逻辑像素

    媒体查询 基本使用 媒体查询是一种提供给开发者针对不同设备需求进行定制化开发的一个接口. 你可以根据设备的类型(比如屏幕设备.打印机设备)或者特定的特性(比如屏幕的宽度)来修改你的页面. 媒体查询的使 ...

  4. css中的px、em、rem 详解

    概念介绍: 1.px (pixel,像素): 是一个虚拟长度单位,是计算机系统的数字化图像长度单位,如果px要换算成物理长度,需要指定精度DPI(Dots Per Inch,每英寸像素数),在扫描打印 ...

  5. CSS中那些px、em、pt、rem、%、dp(android)单位

    http://blog.csdn.net/ime33 未经允许,不得转载!! 水平有限,写的不周之处欢迎指正.交流! 在前端开发中,遇到单位的时候会有几种选择,那到底用哪种单位才是最合适的呢? 在国内 ...

  6. css中单位px和em,rem的区别

    1.PX 相对长度单位.像素px是相对于显示器屏幕分辨率而言的. 1. IE无法调整那些使用px作为单位的字体大小: 2. 国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位: 3. ...

  7. 彻底弄懂css中单位px和em,rem的区别

    2019独角兽企业重金招聘Python工程师标准>>> rem: rem一般用于设置字体的大小,1rem就是html根元素的字体大小,2rem就是html字体大小的2倍,1.5rem ...

  8. 总结css中单位px和em,rem的区别

    国内的设计师大都喜欢用px,而国外的网站大都喜欢用em和rem,那么三者有什么区别,又各自有什么优劣呢? PX特点 1. IE无法调整那些使用px作为单位的字体大小: 2. 国外的大部分网站能够调整的 ...

  9. css中单位px、pt、em和rem的区别

    国内的设计师大都喜欢用px,而国外的网站大都喜欢用em和rem,那么三者有什么区别,又各自有什么优劣呢? px :像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的.(引自CSS ...

最新文章

  1. java数据类型相互转换工具类
  2. 必须进行支持的游戏方可使用此功能_企业微信 3.0上线,开放朋友圈功能,又一风口?...
  3. 全面分析Web应用程序安全漏洞——《黑客攻防技术宝典:web实战篇》
  4. [译]15个关于Chrome的开发必备小技巧
  5. Embedding技术在房产推荐中的应用
  6. 利用Mesos构建多任务调度系统
  7. cuda安装和卸载(ubuntu)
  8. java实现人民币数字和大写转换
  9. Win10桌面背景(壁纸)导出工具
  10. linux下对IP地址的转发和端口的伪装----利用iptables部署
  11. Android之Intent详解
  12. ionic 实时调试android手机
  13. 计算机c语言与数学知识的联系,计算机数学基础知识
  14. iOS UIButton 图标与标题位置调整
  15. MySQL#在指定的列中添加数据
  16. 微指数批量查询工具V1.0发布了
  17. NPL基础入门之新闻本分类赛题理解Test1
  18. 2020年高教社杯全国大学生数学建模竞赛赛题 C题分析与思路!(持续更新)
  19. [转载]14-28岁必看,还算青年的你该用什么手机
  20. 女儿心、女儿情、女儿城

热门文章

  1. 【Python 必会技巧】使用 zip() 函数对序列进行压缩和解压操作
  2. oracle卸数什么是ctrl文件,Oracle数据库的安装和卸载之道
  3. java 里面matches什么意思_Java Regex中的matches()和find()之间的区别
  4. 安装mlxtend_python机器学习包mlxtend的安装和配置详解
  5. Coursera自动驾驶课程第12讲:Semantic Segmentation
  6. Google Colab——谷歌免费GPU使用教程
  7. 图解算法学习笔记(九):动态规划
  8. sql server查询历史进程_学习笔记 | SequoiaDB SQL查询语句执行过程
  9. Java单例模式的几种实现方式
  10. 长春金桥计算机学校,金桥学校2017年招生简章