你真的了解css像素嘛?

在日常开发中,px一定是大家接触过最多的css单位,但是你真的了解px嘛?1px在屏幕中到底是多大呢?另外不知道大家有没有过下面这些疑惑:

  • 为什么一个元素在pc上和移动端的物理尺寸不一样,但是两者的视觉效果上却差不多呢?
  • 改变屏幕的分辨率时,屏幕上显示的内容大小为什么会跟着改变?
  • 缩放浏览器时,浏览器中的内容的大小为什么会跟着改变?

想回答以上问题,我们就要知道css中的px到底指的是什么?

什么是css px?

在回答什么是css px之前,我们先要了解两个概念——设备像素和参考像素。

设备像素(device pixel)

来看这张显示器屏幕的放大图。

device pixel

从图中可以看到,显示器屏幕实际上是由一个一个"点"组成的(每个"点"又包含3个单位,也称三元素组),这些"点"就是设备像素

需要注意的是,device pixel实际是可以"变化"的,当你降低设备分辨率时,一个"点"就需要更多的三元素组来组成,此时"点"的物理尺寸就增大了。以下是维基百科关于这点的说明,想了解更多,请点击这里查看。

因为多数计算机显示屏的分辨率可以通过计算机的操作系统来调节,显示屏像素的分辨率可能不是一个绝对的衡量标准。
现代液晶显示屏按设计有一个原始分辨率,它代表像素和三元素组之间的完美匹配。
对于该显示器,原始分辨率能够产生最精细的视频。但是因为用户可以调整分辨率,显示器必须能够显示其它分辨率。非原始分辨率必须通过在液晶显示屏上拟合重新取样来实现,要使用插值算法。这经常会使显示屏看起来破碎或模糊。例如,原始分辨率为1280×1024的显示器在分辨率为1280×1024时看起来最好,也可以通过用几个物理三元素组来表示一个像素以显示800×600,但可能无法完全显示1600×1200的分辨率,因为物理三元素组不够。

由于不同的设备屏幕分辨率和尺寸可能不一样,所以设备上物理像素的大小也就不一样。但是对于css来说,它希望在所有的设备上元素的显示效果看起来都是差不多的。

那怎么才能让同一元素在不同的设备上显示的效果差不多呢?w3c提出了一个概念,也就是下面将要介绍的参考像素(reference pixel)。

参考像素(reference pixel)

近大远小
从上面这幅图可以看到,近处的铁轨看起来很大,而远处的铁轨看起来很小。这是由于我们眼睛的视角所产生"近大远小"的透视现象所造成的。

那设想一下,如果远处的铁轨比近处的铁轨尺寸大一些,是不是我们看远处的铁轨就和看近处的差不多大了呢。

css参考像素(reference pixel)就是应用了这个原理,w3c是这样定义参考像素的

The reference pixel is the visual angle of one pixel on a device with a pixel density of 96dpi and a distance from the reader of an arm's length. For a nominal arm's length of 28 inches, the visual angle is therefore about 0.0213 degrees.

reference pixel图示

注意了,css参考像素它是一个visual angle,即一个约等于0.0213度的角。当设备的典型观看距离越远时,参考像素就越大(注意这里的大,不是指视角变大,而是角度对应在屏幕上的尺寸变大)。

在介绍完设备像素和参考像素之后,下面该轮到今天的主角——css像素出场了。

css像素(css pixel)

顾名思义,css pixel是css样式表语言中用来表示长度的一个单位,类似的单位还有pt,in,cm等。像pt,in,cm等都是物理单位,相对好理解,而px则有点抽象。

一个px到底是多大? 它又和pt,in,cm的长度等有什么联系呢?这些都是亟待我们思考的问题。

在思考这些问题之前,先看下面这段w3c规范

For a CSS device, these dimensions(指in,pt,px等length单位) are either anchored by relating the physical units to their physical measurements, or by relating the pixel unit to the reference pixel. For print media and similar high-resolution devices, the anchor unit should be one of the standard physical units (inches, centimeters, etc). For lower-resolution devices, and devices with unusual viewing distances, it is recommended instead that the anchor unit be the pixel unit.For such devices it is recommended that the pixel unit refer to the whole number of device pixels that best approximates the reference pixel.

对于css length单位(当然也包括px)来说,不同的分辨率设备对它们的影响是不同的。

对高分辨率显示设备(如打印机),length的anchor unit(可以理解为基准单位)推荐使用基于物理测量的inches,centimeters等。而对于低分辨率的设备(如电脑显示器),anchor unit推荐使用pixel单位。下面具体来讲讲这两者的区别:

高分辨率设备(high-resolution devices)

关于分辨率的东西这里不多讲,不熟悉的同学可以点击这里查看。我们之前说了,对于高分辨的显示设备,基准单位是基于物理测量的inches, centimeters。

基于物理测量是什么意思呢?就是它实际的物理长度。如单位cm, 用css设置一个盒子的宽度为1cm,那它就等于物理上的1cm,你用尺子去量,它就是1cm。

那现在问题来了,px呢?px怎么去基于物理测量呢?

这个问题我们结合w3c和mdn,就能得到解答:

Alternatively if the anchor unit is a physical unit, the pixel unit might not map to a whole number of device pixels.

However, for printers and high-resolution screens, one CSS pixel implies multiple device pixels. 1px = 1/96th of 1in.

现在知道了,在高分辨率设备下,1px就等于96分之一英寸,约等于0.2646mm。

低分辨率设备(low-resolution devices)

对于低分辨率设备来说,anchor unit是基于pixel unit的,那pixel unit又是什么呢?如果有仔细看过css像素那小节里引用w3c的那段说明的话,答案你应该已经知道了。为了说明方便,还是把那句最重要的话再写一遍。

For such devices it is recommended that the pixel unit refer to the whole number of device pixels that best approximates the reference pixel.

这句话非常重要!!!

可以说理解了这句话,你就基本上理解了什么是css像素。这里为了照顾部分英语不好的同学,我把这句话翻译一遍

对于这样的设备(这里指低分辨率设备),建议像素单位参考最接近参考像素的整数个设备像素。

我们举个例子来说明一下,一个分辨率为1680 * 1050的22寸电脑显示器。对于电脑显示器来说,它的参考像素约为0.26mm(这个值的大小由设备的典型视距决定,出厂时已经确定)。

确定了参考像素之后,再来计算设备像素。通过分辨率和尺寸,计算出该显示器的ppi 为90.05,此时一个设备像素的值就等于0.28mm。

对比这两个像素值之后发现,一个设备像素的值是最接近参考像素的。所以对于这个设备来说,一个像素单位(1px)就等于一个设备像素。

到这里,相信大家对css px是什么应该有了一个基本的概念。下面我们通过分析文章开始时提出的几个问题,来进一步加深对css px的印象。

分析问题

(1)为什么一个元素在pc上和移动端的物理尺寸不一样,但是两者的视觉效果上却差不多呢?

因为css px是基于参考像素确定的,而参考像素就是为了让同一元素在不同设备上显示效果尽量一致而设计的(对于移动端和pc端来说,参考像素的物理大小肯定不一样,但是显示效果基本是一致的)。所以同一个元素,尽管在pc端和移动端尺寸不一样,但视觉效果却是差不多的。

(2)当改变屏幕的分辨率时,屏幕上显示的内容大小为什么会跟着改变?

我们举一个例子来说明这个问题,还是以上面那个典型的22寸显示器为例:

  • 正常分辨率下,即1680 * 1050,此时的ppi是90.05,那一个device pixel的长度就约为0.28mm。这时一个device pixel就约等于一个参考像素对应的大小。如果你用css定义了一个盒子宽为375px,此时你用尺子去屏幕上量,会发现375px盒子的实际宽度是0.28(mm) * 375 ≈ 10.5cm。

  • 调整显示器的分辨率为1024 * 640时,此时一个device pixel对应的长度是0.46mm,虽然它和参考像素对应的大小有差距,但是没办法,你还得使用它,毕竟它现在就是最接近参考像素大小的device pixel了。上面那个375px的盒子,此时的实际宽度则为0.46 * 375 ≈ 17.4cm。所以降低分辨率之后,相同的内容会显得大了。

  • 调整显示器的分辨率为1920 * 1080,此时一个device pixel对应的长度是0.25mm,此时375px的盒子实际宽度是0.25 * 375 ≈ 9.3cm,所以提高分辨率后,内容自然就变小了。

(3)当你缩放浏览器大小时,浏览器中的内容的大小会跟着改变?

这个现象,ppk在之前的一篇文章里提到过。缩放浏览器时,也就相当于改变了浏览器的分辨率,所以这个问题和第2个一样,这里也就不多赘述了。

总结

1.对于低分辨率设备(绝大部分显示器,手机屏幕),1个css像素相当于最接近参考像素的整数个设备像素。

2.对于高分辨率设备(打印机)来说,1个css像素就是96分之一英寸。

3.参考像素(reference pixel)就是从一臂之遥看解析度为96DPI的设备时,1个设备像素的视角(但为了方便计算,都把这个视角转换为其在显示设备上对应的大小)。

3.在低分辨率设备中,pt,cm,in等单位的大小不等于它的物理大小,它们的大小需要px(这时等于xx个设备像素)来进行转换,如1in此时等于96个设备像素的大小(即96px)。

4.在高分辨率设备中,1px也不等于xx个设备像素,px的大小就等于固定值。

5.设备像素(device pixel)不是固定不变的,除非你的设备不能调整分辨率。

参考文献

A tale of two viewports — part one

w3c css规范

CSS像素、物理像素、逻辑像素、设备像素比、PPI、Viewport

wiki pixel

wiki 液晶显示器

移动端高清、多屏适配方案

rethinking the pixel it‘s all relative now

A Pixel Identity Crisis

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql for mac中文_mysql for Mac 下创建数据表中文显示为?的解决方法

在我的绝版Mac mini下安装了mysql 5.7版本,实例中,在通过load data 导入数据时发现表中的中文显示为 ?通过百度,发现多个版本的解决方法,将其中一个成功解决的方法贴上来:大多方法都是这样:需要…

计算机科学计算方面分为,计算机方面的专业分为哪些类?【资讯与计算科学】和【电脑科学与技术专业】有什么不同?...

计算机方面的专业分为哪些类?【资讯与计算科学】和【电脑科学与技术专业】有什么不同?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!计算机方面的专业分为哪些类&am…

Java异常处理教程(包含示例和最佳实践)

异常是可能在程序执行期间发生的错误事件,它会破坏其正常流程。 Java提供了一种健壮且面向对象的方式来处理异常情况,称为Java异常处理 。 我们将在本教程中研究以下主题。 Java异常处理概述 异常处理关键字 异常层次 有用的异常方法 Java 7自动资源…

GMTC 大前端时代前端监控的最佳实践

本文来自阿里云前端监控团队,转载请注明出处本文为2018年6月21日,在北京举办的GMTC(全球大前端技术大会),下午性能与监控专场,由阿里云前端监控团队前端技术专家彭伟春带来的演讲稿,现场反馈效果非常好,地上…

Alpha阶段敏捷冲刺②

1.提供当天站立式会议照片一张 每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作。 购买云服务器 注册账号 界面布局初步规划 今天计划完成的工作。 界面雏形设计 数据库初步设计 完成后端框架初步…

透明地持久保存并从数据库中检索加密的数据

自从我在这里发表上一个帖子以来已经有两个多月了,但是今年六月和七月非常忙碌而密集。 首先, Confitura的组织(欧洲最大的Java开发人员免费会议)参加了我所有的免费晚会,然后在相当紧张的住院期间,我们的第…

[译] 2017 年比较 Angular、React、Vue 三剑客

原文地址:Angular vs. React vs. Vue: A 2017 comparison原文作者:Jens Neuhaus译文出自:掘金翻译计划本文永久链接:https://github.com/xitu/gold-miner/blob/master/TODO/angular-vs-react-vs-vue-a-2017-comparison.md译者&…

centos 离线安装mysql_CentOS6离线安装mysql-5.7.25

1.mysql-5.7.25-1.el6.x86_64.rpm-bundle.tar下载百度云资源提取码:ej1y2.把下载的mysql安装包上传到Centos上解压mysql,我这是在Windows上解压的上传到Centos上,我在Centos上解压mysql不知道为什么少了rpm -ivh mysql-community-common-5.7.…

Linux自动化之Cobbler补鞋匠安装

cobbler介绍: 快速网络安装linux操作系统的服务,支持众多的Linux发行版:Red Hat、 Fedora、CentOS、Debian、Ubuntu和SuSE,也可以支持网络安装windows PXE的二次封装,将多种安装参数封装到一个菜单 Python编…

如何以10倍速加速Apache Xalan的XPath处理器

一段时间以来, Apache Xalan中存在一个令人尴尬的错误,该错误是XALANJ-2540 。 此错误的后果是Xalan每次XPath表达式求值将内部SPI配置文件加载数千次 ,可以很容易地进行如下测量: 这个: Element e (Element)documen…

使用ant design Pro开发项目的小结

一、关于上手。 1. 关于ant design Pro的介绍,自己看官网,大致上可以理解为ant design(组件库) ant design Pro (完整的项目) dva(路由 数据流管理)的组合拳。总之这个Pro是一个已经…

Activiti中的高级脚本:自定义配置注入

脚本任务可能是Activiti代码库中“最古老的”类之一,但我认为它仍然未被许多人使用。 (可以理解的?)缺点当然是性能(解释还是编译),并且从IDE角度来看支持较少。 但是,好处&#xf…

帆软决策报表嵌入html,在决策报表中使用网页框控件

假设决策报表里有一个网页框控件,控件名为rHIframe0;同时有三个按钮控件,分别给按钮控件添加下面的点击事件:3.1 setValue(String)设置并刷新网页框控件的地址(保留原参数)1)模板路径var Widget this.options.form.getWidgetByNa…

【前端轶事】Chrome 小恐龙背后的故事

本文转自 FEPulse 公众号(微信搜索 FEPulse,精选国内外最新前端资讯,为你把握前端脉搏)。 如果你是 Chrome 用户,一定对那萌萌哒的小恐龙不陌生,每当互联网连接断开时,你便能看到那只小恐龙&am…

《React源码解析》系列完结!

前言 距离第一篇《React源码解析(一)》已经过去将近4个月的时间,由于是我第一次进行源码解析相关的写作,思路和文笔还不够成熟。一百多天以来,我基于读者反馈反思这几篇文章中的不足,同时也在不断学习借鉴其他优秀作者的写作方法…

html5 css 字体加粗,HTML和CSS实现字体加粗的三种方法

大家在浏览网站时有没有注意到,页面中有些文字或字体加粗了,正在学习HTML和CSS的小伙伴,你知道HTML如何给文字加粗吗?CSS怎么设置字体加粗呢?这篇文章给大家总结了给字体和文字加粗的三种方法,包括HTML中的…

虾扯蛋之函数防抖和节流

背景 今天在coding的时候,做了一个搜索框,也正是这个搜索框,让我和后台小伙伴直接由铁磁变为塑料兄弟。那到底发生啥了呢?其实很简单,其实很无奈,就是我用王者的手速把他的接口访问崩了! 我们在…

四川省内二本计算机公立好的大学排名,四川有哪些二本院校是公立的?附四川省公立二本大学排名及分数线...

选择科目测一测我能上哪些大学选择科目领取你的专属报告>选择省份关闭请选择科目确定v>四川省内的公办大学一直以来都是历年高考生及家长关注的重点,本篇文章我将针对“四川省有多少所二本公立大学?有哪四川省内的公办大学一直以来都是历年高考生及…

NetBeans 7.4 Beta提示警告无效的异常处理

有许多例子说明Java异常处理可能比首次出现时要困难得多,Josh Bloch专门将一整章的《 Effective Java》 (两个版本)专门用于异常处理。 Java中的检查异常模型 仍然 “ 有争议” 。 我很高兴看到我最近下载的NetBeans 7.4 beta有一些提示&…

mysql5.7.17解压版安装_Windows中 MySQL5.7.17解压版安装步骤

1、先去MySQL官网下载。当前最新版是5.7.19,可能安装方法不同了,本人测试没有安装成功,若有安装成功的朋友,希望分享一下安装步骤。2、将下载的压缩包解压出来,然后在“MySQL解压目录”中新建“data”文件夹。如下图&a…