此篇文章总结物理像素,像素密度,分辨率,CSS像素,设备像素比,二倍图,layout viewport、visual viewport 、ideal viewport、meta。

首先我们来谈谈最基础的物理像素。

物理像素(设备像素)

物理像素是真实存在的像素,显示设备中一个最微小的物理部件,即屏幕上可以显示的最小颗粒,在同一个设备上,它的物理像素是固定的,即一个设备的分辨率是固定的。
所谓的一倍屏、二倍屏,指的是设备以多少物理像素来显示一个CSS像素,越多的物理像素去显示一个css像素就会提高其清晰度。

可以通过以下代码获得屏幕真实物理像素

window.screen.width //获得屏幕水平方向上的像素数
window.screen.height //获得屏幕垂直方向上的像素数

分辨率:用像素度量,表示屏幕水平和垂直方向的像素数,分辨率越高,像素的数目越多,感应到的图像越精密

在web开发中,可以使用px(像素)、em、pt(点),in(英寸),cm(厘米)等作为长度单位。我们可以将上述单位划分为相对长度单位和绝对长度单位。

  • 相对长度单位:px、em
  • 绝对长度单位:in、cm、pt

可以从下图看出,屏幕都是3.5英寸,但是屏幕分辨率却相差一倍,有此我们可以看出,英寸是绝对长度,像素是一个相对长度,像素没有固定的长度

由此,我们引出像素密度的概念

像素密度

一开始像素密度DPI是应用于印刷业用来表示打印机每英寸可以喷出的墨汁点数,现在计算机借鉴了其概念,而最小的单位是像素,可以用PPI值来表示屏幕每英寸的像素数量,通过下图我们可以很直观的看到,都是一英寸的情况下,其物理像素数量上的区别。
由此我们可以看出,像素密度越高,说明单位尺寸内所能容纳的像素数量越多,显示出来的画面越清晰。

而我们常说的视网膜屏幕(Retina),知道是有较高PPI(大于320)的屏幕

那么如何计算像素密度呢?
公式:

例如:
iPhone3G/S的屏幕分辨率是480320px,而iPhone4/S的屏幕分辨率是960480px,屏幕尺寸都是3.5英寸,那么我们可以通过勾股定理计算:
由上图可以看出,iPhone4/S的像素密度是iPhone3G/S的两倍

至此我们了解了像素密度对显示清晰程度的影响,但是这又出现一个问题,低分辨率和高分辨率的设备共存,就会引发一个问题,对于同一张图片,低像素的可以填满整个区域,高像素的无法填满。这里我们就需要引入一个新的单位,叫设备独立像素

CSS像素

也称为设备独立像素、逻辑像素、设备无关像素,IOS称之为PT,Android称之为DIP或DP,默认情况下在PC端等于一个物理像素,通过浏览器的缩放,会出现大于小于等于的三种情况

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

一个设备的物理像素与逻辑像素之比:设备像素比 (dpr)= 物理像素(dp) / 设备独立像素(dip)

可以通过以下代码获得,设备上物理像素和设备独立像素的比例

window.devicePixelRatio

在Retina屏的iphone上,devicePixelRatio的值为2,也就是说1个css像素相当于2个物理像素。通常所说的二倍屏(retina)的dpr是2, 三倍屏是3。
可以通过获取比例来进行相应处理。即可以通过获取对应的比例来使图片放大到对应的比例

但是这又引发一个问题,图片放大,会降低精度。

由此我们引入二倍图的概念,可以通过二倍图或者三倍图,将原图片进行缩小,以保持其精度。

看完像素这部分,我们再来看看移动端最重要的视口

视口(viewport)

PC端的viewport的大小取决于浏览器的大小,以CSS像素为单位
可以通过以下代码获得html元素的大小,即PC端viewport的宽高:

document.documentElement.clientWidth
document.documentElement.clientHeight

提示:如果调整浏览器的宽度,viewport的宽高就会跟着改变

视口这个概念更多的应用于移动端

(1)layout viewport(布局视口)

指的是我们可以进行网页布局区域的大小,以CSS像素做计量单位。移动设备默认会设置一个较大的viewport(如IOS一般默认是980px),layout viewport 的宽度是大于浏览器可视区域的宽度的。

layout viewport的宽度可以通过 document.documentElement.clientWidth来获取。

document.documentElement.clientWidth
document.documentElement.clientHeight

(2)visual viewport (视觉视口)

即设备的像素分辨率,以iphone8为例,分辨率为750*1334像素
visual viewport的宽度可以通过window.innerWidth来获取。

window.innerWidth
window.innerHeight

这里简单看一下布局视口和视觉视口的区别:

(3)ideal viewport(理想视口)

ideal viewport是一个能完美适配移动设备的viewport。无论是在何种密度屏幕,何种分辨率下,显示出来的大小都差不多。ideal viewport并没有一个固定的尺寸,不同的设备有不同的ideal viewport。理想视口与设备的宽度一致,例如iphone8的理想视口是375px

ideal viewport 的意义在于,无论在何种分辨率的屏幕下,针对ideal viewport 而设计的网站,不需要缩放和横向滚动条都可以完美地呈现给用户。

window.screen.width
window.screen.Height

翻转屏幕

当你拿着手机屏幕进行翻转的时候:

如果visual viewport 的宽度 > layout viewport 的宽度,那么viewport需要zoom in(放大,拉近),以适应visual viewport的宽度

如果visual viewport 的宽度 < layout viewport的宽度,那么viewport需要zoom out(缩小,拉远),以适应visual viewport的宽度

<meta name="viewport" content="width:device-width">

device-width会将手机横向物理像素/转化系统作为其值,并重置相应的layout viewport的值,并适应visual viewport。

meta标签作用

利用meta标签对viewport进行控制

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

在苹果的规范中,meta viewport 有6个属性如下:

参数 含义
width 设置layout viewport 的宽度,为一个正整数,也可为字符串"width-device",一般为字符串"width-device"
initial-scale 设置页面的初始缩放值,为一个数字,可以带小数,一般为1.0
minimum-scale 允许用户的最小缩放值,为一个数字,可以带小数,一般为1.0
maximum-scale 允许用户的最大缩放值,为一个数字,可以带小数,一般为1.0
user-scalable 是否允许用户进行缩放,值为"no"或"yes", no 或0代表不允许,yes或0代表允许
height 设置layout viewport 的高度,这个属性对我们并不重要,很少使用

由于initial-scale = ideal viewport /layout viewport 也就相当于设置width=device-wdith,但是为了解决一些兼容性问题比如iphone、ipad以及IE 会横竖屏不分,会选择将两个属性都写上

最后总结

物理像素是真实存在的,但是没有固定的长度,在屏幕大小相同情况下,屏幕的物理像素越多,图片越清晰,也就是像素密度越高,图片越清晰;
为了解决不同屏幕的分辨率高低问题导致的图片大小不同,引入了CSS像素,由此推算除设备像素比,也就是物理像素与CSS像素的关系,当设备像素比为2时,二倍屏下的1个css像素相当于2个物理像素,那么我们就采用二倍图并缩小一倍的方式来保证图片精度及大小。

视口的话分为三种layout viewportvisual viewportideal viewport,deal viewport是一个能完美适配移动设备的viewport。

meta标签推荐写法:

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

本篇文章参考资料:
https://www.cnblogs.com/jianxian/p/11178378.html
https://blog.csdn.net/zhouziyu2011/article/details/60570547
https://www.cnblogs.com/2050/p/3877280.html
https://blog.csdn.net/weixin_34348174/article/details/87962105
https://segmentfault.com/a/1190000006068808
https://segmentfault.com/a/1190000011586301

有用的话点个赞哦!

作为前端的你不能不知道的知识,总结物理像素,像素密度,分辨率,CSS像素,设备像素比,二倍图,layout viewport、visual viewport 、ideal viewport、meta。相关推荐

  1. 计算机不得不知道的知识,术业有专攻计算机维修人员不得不知道的知识

    在计算机行业里面,大类有软件跟硬件的区别,小类才小编这里就不一一来说明了,因为太多了,这里说不清楚. 术业有专攻:计算机维修人员不得不知道的知识 编辑作者:http://doc.xuehai.net ...

  2. 作为前端,你不得不知道的SEO

      研发的同学,其实很多人并没有深入了解SEO这个概念.在技术博客里,提及这一块的也寥寥无几.我今天就拿自己的经验,简单给大家扫个盲,有什么遗漏的地方,欢迎大家补充.   文字内容有点多,但是干货满满 ...

  3. 前端新手程序员不知道的 20个小技巧

    1.作为前端开发者,使用双显示器能大幅提高开发效率. 2.学编程最好的语言不是PHP,是English. 3.东西交付之前偷偷测试一遍. 4.问别人之前最好先自己百度,google一下,以免问出太低级 ...

  4. 数据传输:XML JSON 你不得不知道的知识

    XML & JSON的基本知识 XML 基础概念 XML的语法格式 XML的解析方法 DOM4J使用实例 生成XML JSON 基础概念 Java与JSON的转换 XML 基础概念 可扩展标记 ...

  5. 优化应用不可不知道的知识

    原文:http://android.eoe.cn/topic/android_sdk http://developer.android.com/images/develop/resources.png ...

  6. [知识普及贴]中国人不可不知道的知识(怕以后找不到了~~) [经典,值得收藏]

    导读: [四大名绣]苏绣[苏州].湘绣[湖南].蜀绣[四川].广绣[广东] [四大名扇]檀香扇[江苏].火画扇[广东].竹丝扇[四川].绫绢扇[浙江] [四大名花]牡丹[山东菏泽].水仙[福建漳州]. ...

  7. 【总结】自己不知道的知识

    1.linux命令  awk awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符 ...

  8. get到java7自己不知道的知识

    switch语句中的String 在Java6及之前,case语句中的常量只能是byte,char,short和int(也可以是对应的封装类型Byte,Character,Short和Integer) ...

  9. 转载:中国人不可不知道的知识(怕以后找不到了~~)

    [三教]儒教.道教.佛教 [九流]儒家.道家.阴阳家.法家.名家.墨家.纵横家.杂家.农家 [三皇]伏羲.女娲.神农 [五帝]太皞.炎帝.黄帝.少皞.颛顼 [三山]安徽黄山.江西庐山.浙江雁荡山 [五 ...

最新文章

  1. IDEAWebstorm使用
  2. 简述用决策表设计测试用例的步骤_决策表快速入门
  3. C#正则表达式引发的CPU跑高问题以及解决方法
  4. linux adb 点击屏幕,ADB 操作命令(二)
  5. python中求包含5的数_Python 内置函数 ( ) 可以返回列表、元组、字典、集合、字符串以及 range 对象中元素个数。_学小易找答案...
  6. Python中socket入门例子
  7. 阿里社交梦不灭,再推校园社交App,“Real如我”能成吗?
  8. LINUX安装依赖库冲突的最终版本:下列软件包有未满足的依赖关系/但是它将不会被安装/无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系
  9. python nltk.download报错_python 文本转语音机器学习之nltk download安装测试包
  10. python机器人编程——VREP数字孪生四轴机械臂联合仿真
  11. 深入PCI与PCIe
  12. 砸盘、销号、解散社群,Merlin Lab“跑路三连”暴露了DeFi哪些问题?
  13. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day34】—— 消息队列2
  14. php验签,在php中验证签名
  15. react-native 调用第三方 SDK
  16. 基于Python,从零开始,裸写一套期权定价程序
  17. 04-0002 PCA算法
  18. 硬核:如何用「区块链」改进传染病监测预警网络?
  19. java英语面试自我介绍_java自我介绍的英文面试
  20. linux如何彻底删除mysql_Linux下如何彻底删除MySQL

热门文章

  1. 【node.js】知识点总结
  2. 将来哪些国产软件会崛起?(离我们很近还有很多)
  3. HTML设置网站横屏显示的几种方式
  4. 查全率和查准率两者概念的简单介绍
  5. 基于Frida实现OKHttp的抓包
  6. Excel 2010 SQL应用037 满足两个条件之一的查询
  7. 电脑麦块java环境安装包下不上怎么办
  8. Hive表数据量统计原理和源码分析
  9. python支持哪些数据类型_python有什么数据类型
  10. 机器学习之神经网络与支持向量机