思考一下

什么是物理像素?什么是css像素?


在 《掌握web开发基础系列--长度单位》 这篇文章中已经介绍过了css像素单位--px,这篇文章详细探讨一下设备物理像素和css像素之间的关系。

“像素”,是一个名词,在不同的上下文中所描述的东西可能不一样,但是也可能存在一定关系。

两种像素

注:下面很多是直接引用参考文章中的描述,主要原因是原文写的很棒,为作者点赞!

物理像素

设备屏幕实际拥有的像素点,屏幕的基本单元,是有实体的。比如iPhone 6的屏幕在宽度方向有750个像素点,高度方向有1334个像素点,所有iPhone 6 总共有750*1334个像素点。

屏幕普遍采用RGB色域(红、绿、蓝三个子像素构成),而印刷行业普遍使用CMYK色域(青、品红、黄和黑)。


逻辑像素

也叫“设备独立像素”(Device Independent Pixel,DIP),可以理解为反映在CSS/JS程序里面的像素点,也就是说css像素是逻辑像素的一种。

除了css像素是逻辑像素还有其他常见的逻辑像素吗?

我们平时描述一张图片宽高时一般用 200px * 100px,这里的px也是逻辑像素。

设备像素比(Device Pixel Ratio,DPR)

一个设备的物理像素与逻辑像素之比。

像素为什么会有“物理”和“逻辑”之分,它们之间什么区别?

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

后来苹果公司为其产品mac、iPhone以及iPad的屏幕配置了Retina高清屏,也就是说这种屏幕拥有的物理像素点数比非高清屏多4倍甚至更多。如果还按照DPR=1进行展示,那么同一张图片在高清屏上面显示的区域面积会是非高清屏的1/4,这样的话由于图片在屏幕上的展示面积大大缩小,也会导致出现“看不清”的问题。

苹果公司既然推出了Retina技术,那么这种技术带来了高清展示福利的前提下也要解决“DPR=1”的问题。怎么解决呢?DPR!=1。苹果公司经过一系列技术使用4个乃至更多物理像素来渲染1个逻辑像素,这样一来,同样的CSS代码设置的尺寸,在Retina和非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.widthscreen.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的“物理像素”,包括UI小姐姐们出图也是以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一下,完事~

再次感谢原文作者!

总结

1个逻辑像素等于1个物理像素还是等于多个物理像素是由设备本身决定的,我们可以通过DPR也就是window.devicePixelRatio获知,至于设备怎么做的控制和转换我们不去做深究。

 热 文 推 荐 

☞ 可能这些是你想要的 H5 软键盘兼容方案

☞ 金三银四魔都两年半前端面经

☞ 从0到1完成一个Babel插件

☞ 如何优雅处理前端的异常?

☞ 面试官:自己搭建过vue开发环境吗?

你也“在看”吗?

掌握web开发基础系列--物理像素、逻辑像素、css像素相关推荐

  1. web开发基础,8个优秀的CSS实践

    在敲下这个标题的时候,心里好虚.话说我一直不太喜欢发表这些看上去很假大空的文字,每个人的职业规划都是独有的,不具有太大的可复制性,把自己的经历放出去,容易误人子弟.只是最近很多师弟们(别问我为什么都是 ...

  2. (一)移动端 Web 开发基础

    文章目录 一.移动 Web 开发基础概念 1. 像素 (1) 分辨率 (2) 物理像素 (3) CSS 像素 (4) 设备像素比 (5) 标清屏和高清屏 (6) 缩放 (7) PPI / DPI 2. ...

  3. 移动Web开发基础-Viewport

    导语:移动Web开发自然要从Viewport说起,那什么是Viewport呢?字面意思为视图窗口,在移动设备上就是指用来显示页面的那部分区域. 用移动设备来访问没有做特殊处理的PC页面,移动设备是显示 ...

  4. web开发基础(html+CSS)

    web开发基础 html+CSS 概念 万维网概念 Web浏览器 Web服务器 URL web应用领域 B/S架构(Browser/Server) C/S架构(Client/Server) web系统 ...

  5. 移动Web开发基础-flexible布局方案

    概述 前面我们已经已经了解了两种基本的布局方案,移动Web开发基础-百分比+flex布局方案 和 移动Web开发基础-rem布局,其中rem布局方案和我们今天要了解的flexible布局方案是有关系的 ...

  6. Web开发(一)·期末不挂之第一章·Web开发基础(不背就挂的基础知识)

    Web开发基础 一.网站的访问过程 ✪✪✪ 二.Web应用 ✪✪✪ 三.其他 一.网站的访问过程 ✪✪✪ 网址: URL(互联网上标准资源的地址)组成部分: 协议:http:// 域名:-com/cn ...

  7. Web开发兼容性系列文章(一):不同设备浏览器的userAgent值大全

    Web开发兼容性系列文章(一):不同设备浏览器的userAgent值大全 Posted on 2011-07-22 12:37 随它去吧 阅读(1388) 评论(11) 编辑 收藏 http://ww ...

  8. 提高生产力:Web开发基础平台WebCommon的设计和实现

    Web开发中,存在着各种各样的重复性的工作.为了提高开发效率,不在当码农,我在思考和实践如何搭建一个Web开发的基础平台. Web开发基础平台的目标和功能 1.提供一套基础的开发环境,整合了常用的框架 ...

  9. 移动Web开发基础-比例盒子

    前言 上篇在移动Web开发基础-百分比+flex布局方案中说到了比例盒子的实现,因为在移动端,需要适应各种屏幕宽度的设备,所以我们的图片以及其他一些元素需要根据屏幕宽度自适应的等比例缩放,这里就需要用 ...

最新文章

  1. 《人脸识别原理及算法——动态人脸识别系统研究》—1章1.2节人脸识别相关学科的进展...
  2. HTTP的请求头标签 If-Modified-Since与Last-Modified 相等就是200新的请求 不等就是304没有变化
  3. Js数据类型之——Date
  4. C语言 | 直接插入排序
  5. CGI脚本跨站截取Cookie/附ASP的版本
  6. Navicat 复制多条数据
  7. MyEclipse控制台报错:java.lang.OutOfMemoryError: PermGen space
  8. 反射系数、驻波比、S参数之间的关系!
  9. git的版本回溯(git想要退回到之前写过的某一个版本)
  10. Tensorflow概念详解
  11. 冰河在大学是如何度过的?
  12. 2、Gantt 入门 (vue3 + ts)
  13. 使用selenium自动爬取斗鱼直播平台的所有房间信息
  14. 视频加水印,怎么给视频加水印?
  15. 软件测试中自上而下与自下而上的区别
  16. numpy获得前n大元素下标
  17. 运行Intel realsense L515相机
  18. R语言-基于豆瓣电影详情数据的清洗和多元回归分析
  19. 利用Github Page 搭建个人博客网站
  20. 测评:借助6款强大的工具阻止内部攻击

热门文章

  1. PacBio hdf5 格式 向 FASTA格式转换
  2. pc端/web端/移动端
  3. MySQL8高级优化,持续更新......
  4. 原生Android设置sim卡锁定,如何为更安全的Android手机设置SIM卡锁 | MOS86
  5. 记录一次神奇的大物实验——用模拟法测绘静电场——别人都是打铁~我们打孔~~~
  6. 将本地文件上传到码云(gitee远程仓库)
  7. 用虚拟信用卡支付的时候经常出现交易失败、无法付款?一篇文章帮你解决这些问题
  8. Spring事务管理中异常回滚知识点总结
  9. 【Havel 定理】Degree Sequence of Graph G
  10. OC和Clover黑苹果USB定制和注入