移动端页面你们都遇到过 viewport 的问题。关于 viewport 的文章有不少了,推荐给你们这两篇,写得很是详细。
移动端适配方案(上)
移动端适配方案(下)git
本文对 viewport 作一些补充github
手机屏幕属于硬件属性,咱们不管是经过 JS 仍是 meta 标签都是没法影响到它的。浏览器
手机屏幕物理像素,也就是手机厂商们说的像素、分辨率、PPI这些。布局
安卓常见的有 720X1280 , 1080X1920 等等
iPhone 则是 iPhone5 640X1136,iPhone6 750X1334,iPhone6P 1080X1920code
手机屏幕逻辑像素,物理像素通过折算以后的像素数。也就是理想视口的尺寸blog
iPhone5 屏幕原本是 640px 宽,可是折算成了 320px
iPhone6 物理像素 750px 款,折算成 375px
iPhone6P 略微奇葩一点,物理像素实际 1080px 宽,可是系统向外暴露的确是 1242px,再折算成了 414pxget
screen.width/height
能够获取屏幕的逻辑像素it
刚才讲过的屏幕物理像素和逻辑像素,这些都是手机厂商设置好的,咱们是没法设置的,重点再与接下来的两个视口,你们千万别混淆了。cli
layout viewport 至关于浏览器的宽度。
咱们是能够经过 <meta name="viewport" content="width=XXX">设置的。
默认状况下,layout viewport 通常为 980px 宽。硬件
document.documentElement.clientWidth
能够获取 layout viewport 的宽度。
视觉视口能够看做是手机屏幕这么大的一个窗口,可是它能显示的像素个数却不是屏幕上面的这么多逻辑像素。
视觉视口不太容易理解,虽然手机屏幕的逻辑像素已经固定了,好比 iPhone5 是 320px。
可是屏幕这 320px 宽,却能够显示 980px 宽的内容,因此视觉窗口的宽度是 980px。
不少没有对移动端作适配的网页,咱们用手机打开,发现网页被缩小到手机屏幕这么宽了。
重点就在于缩放,缩放让320px的屏幕能显示更多内容了。window.innerWidth
能够获取 visual viewport 的宽度。
经过 <meta name="viewport" content="initial-scale=x"> 能够设置 visual viewport 的宽度。
visual viewport 的宽度为 screen.width / initial-scale
同时,也会影响到 布局视口 的宽度,由于布局视口的宽度始终大于等于 visual layout 的宽度。
若是不设置 initial-scale ,iOS设备会自动将 visual viewport 缩放到 布局视口同样大。
还记得默认的 布局视口 是多宽吗?
<meta name="viewport" content="width=device-width">
将 layout viewport 的宽度设置为 屏幕宽
<meta name="viewport" content="width=640">
将 layout viewport 宽度设置为 640px (逻辑像素,而不是物理像素)
<meta name="viewport" content="initial-scale=0.5">
将 visual viewport 设置为 屏幕宽度的 2 倍(正确的理解是:visual viewport 的 0.5 倍是屏幕宽度,因此 visual viewport 的宽度就是屏幕的2倍了)
此时 布局视口的宽度也是 屏幕宽的2倍,而再也不是默认的 980px 了
总结:
一、默认状况下 layout viewport 为 980px 二、width=x 设置布局视口,initial-scale=y 设置视觉视口 三、若是只设置 布局视口 和 视觉视口 中的一个,那么另外一个也是一样的宽度 四、布局视口 的宽度始终大于等于 视觉视口
举例 iPhone 5 上面
<meta name="viewport" content="width=600,initial-scale=0.5">
那么视觉视口和布局视口分别是多宽呢?
最后的最后,终于到了咱们耳熟能详的
<meta name="viewport" content="width=device-width,initial-scale=1.0">
你们知道这是什么意思了吧。layout viewport 浏览器窗口,设置为屏幕宽度。visual viewport 也设置为屏幕宽度,不缩放,屏幕有多宽,就显示多少像素。也就是所谓的完美视口。