移动开发中“单位”的那些事儿(4)

介绍viewport的概念之前再看一个例子,我们在手机浏览器中打开一个PC网站时我们发现可以看到网页的全貌,而并非出现了滚动条:

这里写图片描述

如上图,左边是chrome的手机调试工具,右边的是Nexus 4的安卓模拟器,之所以能看到1000多像素宽的PC网页的全貌是因为viewport的存在,手机浏览器将PC页面渲染在一个比较大的viewport里面(android4.x普遍为980px,ios也为980px),然后再进行缩放,就能看到整个页面的全貌了。所以明确一下手机浏览器的工作分为两步:

将页面渲染在一个比较大的viewport里面并进行缩放(这个viewport也叫layout viewport),保证页面排版以及css布局不会乱。

通过大小等于手机浏览器可视区域的viewport(这个viewport也叫visual viewport)选取可视区域进行展示。

OK,接下来就具体介绍一下viewport的分类,viewport分为layout viewport和visual viewport,layout viewport可以理解为一个大的窗体,处在底层,包含整个PC浏览器页面,如下图所示:

这里写图片描述

layout viewport的值可以通过以下js代码来获取:

document.documentElement.clientWidth

而visual viewport则代表手机浏览器当前可视区域的窗体,处在上层,如下图所示:

这里写图片描述

visual viewport的值可以通过以下js代码来获取:

window.innerWidth

接下来就分别看一下Nexus 4下的layout viewport和visual viewport的值:

这里写图片描述

如上图所示,都是980px,至此就可以解释最开始的那个问题——1280*768px的div为什么不能在Nexus 4上全屏显示。答案很简单,默认的layout viewport的值是980px,而这个图片的宽度是768px,所以无法铺满屏幕。然而在实际开发中我们并不会用默认的980px的viewport,原因很简单,上面显示pc页面的效果虽然没有滚动条可以看到页面的全貌,但是可以发现缩放的太小了以至于有些看不清,这样明显是不合适的,所以在实际开发中我们都会自定义layout viewport的值从而得到合适的缩放效果,那么该如何自定义layout viewport的值?很简单,都过设置Meta标签就可以完成。

下面就介绍一下如何通过Meta标签来设置layout viewport的值,Meta viewport有以下6个属性值:

Content属性value
width   设置layout viewport 的宽度,可以是固定值或“width-device”  
initial-scale   设置页面的初始缩放值  
minimum-scale   允许用户的最小缩放值  
maximum-scale   允许用户的最大缩放值  
user-scalable   是否允许用户进行缩放,值为“no”或“yes”  

再看一下Meta标签的格式:

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

如上所述,设置width的值为device-width(即设备宽度)就表示将layout viewport的值设置为设备宽度,比如Nexus 4就是384px,加上这个Meta标签后我们再看看上面Yellow的效果,看之前首先要理清,div的宽度依旧是1280*768px,而我们chrome手机调试工具选择的设备是Nexus 4,也就是说此时的layout viewport的值是384px,在html源文件中添加<meta content="width=device-width"> 后再看看渲染的效果:

这里写图片描述

如上图所示,layout viewport的值变成了384px,和Nexus 4的设备宽度保持一致,而visual viewport的值变成了776px,因为我们页面的div给的是768px,所以为了容纳下这个div我们的visual viewport的值就为776px,如标尺上的一致,注意第三行js:

window.innerWidth/document.documentElement.clientWidth

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/375f833c7a9b6ad1e559473101f65f34.html