HTML

viewport

在vscode中自动生成html框架代码后,其中有这么一句

1
<meta name="viewport" content="width=device-width, initial-scale=1.0">

此语句是为了解决移动设备上网页的视窗问题。

什么是viewport

viewport是设备上能显示网页的那一块区域,也是浏览器上用来显示网页的区域。但是,viewport并不是与浏览器的可视区域完全相同,一般来说设备上的viewport要大于浏览器的可视区域。因为移动设备的分辨率要小于桌面电脑的分辨率,所以为了让移动设备能够正常显示为桌面电脑而设计的网站,移动设备的浏览器默认的viewport设置为980px或1024px,当然是由设备决定的。因此移动设备上浏览为桌面电脑设计的网页就会产生横向滚动条。

iPhone iPad Samsung HTC CHrome Opera Presto BlackBerry IE
980 980 980 980 980 980 1024 1024

viewport种类

ppk大神认为移动设备上有3个viewport:

· layout viewport:显示网页的所有内容,可以全部或部分展示给用户

· visual viewport:当前显示给用户内容的窗口,可以拖动,放大缩小。

· ideal viewport:移动设备理想的viewport

​ 首先,css中的1px和设备中1px是不相同的,css中用1px表示电脑屏幕的一个像素,但是现在手机的分辨率越来越高,物理像素密度越来越高,屏幕大小未变,因此可以看出,手机设备的1px和网页css的1px必然不同。在早期,如iPhone3,分辨率为320×480,此时css的一个像素确实是一个屏幕物理像素,然而从iPhone4开始,分辨率提高了一倍,屏幕尺寸未变,意味着同样大小的屏幕上,像素翻了一倍,此时一个css像素是两个物理像素。用户缩放也会引起css像素的改变,用户将页面放大一倍,css所代表的物理像素增加一倍,反之缩小一倍。

​ 如果强行将一个为桌面浏览器设计的页面塞进手机屏幕中,某些网页就会因为设备viewport太窄而显示错乱,因此浏览器就决定将默认viewport设置大一些,这样就算是那些为桌面浏览器设计的网页也能够正常显示,ppk将浏览器上默认的viewport叫做layout viewport。相应的,需要一个viewport表示浏览器可视区域的大小。ppk将这个viewport叫做visual viewport

​ 此外,浏览器认为需要一个更加完美的viewport,因为越来越多的网页都会为移动设备单独设计网页,所以要有一个完美适配设备的viewport,无需用户缩放,文字大小合适。ppk将此viewport叫做ideal viewport,ideal viewport并不是一个固定的尺寸,不同设备都不同。https://www.quirksmode.org可以查看大部分设备的理想宽度。

控制viewport

​ 移动设备中默认的viewport是layout viewport,但是我们需要的是ideal viewport,那么怎么得到呢?

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

​ 此mate标签可以起到这个作用。让当前viewport等于设备的宽度,不允许用户缩放。否则会使用默认的viewport,会出现横向滚动条。

​ mate viewport标签首先是苹果公司引入的,目的就是解决设备的viewport问题。后来安卓纷纷效仿,引入对mate viewport的支持,事实证明非常有用。

​ 在苹果规范中,mate viewport有6个属性

width 设置layout viewport的宽度,正整数或“width-device”
initial-scale 设置初始缩放值
minimum-scale 最小缩放值
maximum-scale 最大缩放值
height 设置layout viewport的高度
user-scalable 是否允许用户缩放,值为no或yes

​ 此外安卓还支持一个私有标签

target-densitydpi 值可以为一个数值或 high-dpi 、 medium-dpi、 low-dpi、 device-dpi 这几个字符串中的一个

​ 当 target-densitydpi=device-dpi 时, css中的1px会等于物理像素中的1px。

设置viewport

​ 要得到ideal viewport就必须将默认的layout viewport设为移动设备的屏幕宽度。

1
<meta name="viewport" content="width=device-width">
1
<meta name="viewport" content="initial-scale=1">

​ 这两句都可以达到同样的效果,将当前的viewport设置为ideal viewport。

​ 第一句显而易见,重点解释一下第二句。

​ 第二句的作用是不对当前页面进行缩放,也就是说页面本来是多大就是多大。首先要理解缩放的意义,是相对什么进行缩放,因为此处缩放值是1,也就是未缩放,但是达到了ideal viewport的效果,那就是说缩放是相对于ideal viewport进行缩放的。

​ 但如果width和initial-scale=1同时出现,而且冲突怎么办?

1
<meta name="viewport" content="width=400, initial-scale=1">

​ 假如ideal viewport是450px,此处就冲突了,一个设置为400,一个设置为450,那么执行哪个呢?浏览器遇到这种情况,会执行较大的值,450。需要注意的是,在uc9中,当initial-scale=1时,无论width设置为多少,viewport都是ideal viewport。

​ 由于两种方法都有部分的小瑕疵,因此两者都使用就可以完美的适配各种问题

1
<meta name="viewport" content="width=device-width, initial-scale=1">