首先了解几个概念:javascript
物理像素:买手机的时候会有一个 n x m
的分辨率,那是屏幕的n x m
个呈像的点,一个点(小方格)为一个物理像素。它是屏幕能显示的最小粒度.css
CSS像素:就是CSS里的Px,上面已经讲了是viewport中的一个小方格。html
像素密度:即dpi或ppi,屏幕每英寸所占的物理像素点。java
像素密度如何去计算请戳我web
本文主要是说明layout viewport
和visual viewport
二者的区别和在移动端上得表现。chrome
当你在写移动端页面的时候,常常会看到这样一个元素信息segmentfault
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" >
其中name
属性声明了这个meta标签元素想要声明的内容的名称,content
就是声明的具体内容了。浏览器
这也是这篇文章想要探讨的一些问题。app
无论你是用PC端仍是移动端的浏览器去访问一个页面的时候。你所看到的浏览器的窗口就是你visual viewport
(经过window.innerWidth/height
获取),对于移动端来讲,就是你经过浏览器所看到的那部分大小,它的度量单位是px(css中的像素)。这个visual viewport
一般是能够变化的,例如你对屏幕进行缩放,这样就能够改变visual viewport
的大小,或者你移动屏幕的滚轮,这样就能够改变visual viewport
的位置。框架
和visual viewport
相对应的另一个viewport
叫layout viewport
。它就至关于一个大的box
,全部的内容都要在这个box
里面显示。你经过visual viewport
所看到的内容就是layout viewport
上的部份内容。
visual viewport
和layout viewport
到底又有什么区别和联系呢?把layout viewport想像成为一张不会变动大小或者形状的大图。如今想像你有一个小一些的框架,你经过它来看这张大图。(译者:能够理解为「管中窥豹」)这个小框架的周围被不透明的材料所环绕,这掩盖了你全部的视线,只留这张大图的一部分给你。你经过这个框架所能看到的大图的部分就是visual viewport。当你保持框架(缩小)来看整个图片的时候,你能够不用管大图,或者你能够靠近一些(放大)只看局部。你也能够改变框架的方向,可是大图(layout viewport)的大小和形状永远不会变。
当你进行页面缩放的时,你能够想象你拿着这个小框架离这张大图愈来愈近了,那么你所看到的大图的内容也愈来愈少了。本来在未缩放的页面上看起来很小的尺寸,如今经过viewport看上去变大了,事实上这部分的css的px值并无变化,仅仅是由于进行放大后,css的1px的值所占的屏幕分辨率的值变大了。
同理,当你缩小整个页面的时候,看到大图的内容也愈来愈多,同时,本来看起来很大的尺寸,如今再经过viewport看上去的时候又变小了。同理,css的1px的值并无发生变化,可是1px值所占的屏幕分辨率的值变小了。
在放大和缩小的过程当中,visual viewport
和layout viewport
的宽,高都没发生任何的变化,变化的仅仅就像是用户拿着这个visual viewport
去远离或者靠近layout viewport
,在远离或者靠近的过程当中,就会呈现出缩放的效果来。
layout viewport
到底有多宽呢?初始状态:
例如chrome下,初始layout viewport
的宽度是980px,这个时候整个页面是处于彻底缩小的状态下,经过visual viewport
是能够看到layout viewport
中的全部内容的,就好像你拿着visual viewport
,离layout viewport
到正好能够看到layout viewport
全部内容的距离为止。
即在初始状态下,没有设置<meta name="viewport">的状况下,layout viewport
依据不一样浏览器的特性,有一个初始值,并处于彻底缩小的状态。例如 12306官网
声明了< meta name="viewport">的状态下:
当经过meta
标签申明了viewport
的宽度
<meta name="viewport" content="width=300">
layout viewport
初始化的宽度就是300px
,并处于彻底适应于visual viewport
的状态。即经过visual viewport
能够看到layout viewport
中全部的内容(不存在滚轮的状况下)。
当你拿着手机屏幕进行翻转的时候:
若是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
。
此时,无论手机屏幕是否翻转时,visual viewport
都和 layout viewport
的值相同。而不会出现缩放的状况。不过用户是能够经过进行缩放操做的。
若是设置
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
此时用户不能对网页进行缩放。
参考文章: