Viewport 不权威指南

什么是 Viewport,为什么需要 Viewport:

Viewport:视口,视觉窗口,显示区域。

在显示面积上手机屏幕相对桌面显示器要小很多,在几年前(现在也如此)大部分网站都是为桌面显示器浏览而设计,很少考虑到适应手机屏幕,所以如果用手机浏览大多网站时会出现问题,比如常见固定宽度的网页会出现横向竖向滑动条,当然这不算什么大问题;但如果是浏览流动布局的网页那情况会非常糟糕,设想一个宽度为 30% 的侧边栏对于 320px 手机屏幕而言也就 96px,只能容纳八个 12px 的汉字,可阅读性非常差。

为了让手机也能获得良好的网页浏览体验,Apple 找到了一个办法:在移动版的 Safari(iOS平台)中定义了 viewport meta 标签①,它的作用就是创建一个虚拟的窗口(viewport),而且这个虚拟窗口的分辨率接近于桌面显示器,Apple 将其定位为 980px②。

以一代 iPhone 下的 Safari 来说就是:
在 iPhone 的 320px 物理屏幕上——视觉窗口(visual viewport),创建出了一个 980px 的虚拟窗口——布局窗口(layout viewport),在视觉窗口(visual viewport)中我们可以拖动横向竖向滑动条或者放大缩小网页,来达到最佳的浏览效果(类似桌面浏览器);而布局窗口(layout viewport)用来配合 CSS 渲染布局,例如当我们设置一个容器的宽度为 100% 时,这个容器的实际值为 980px 而不是 320px。如此一来大部分网页就能以缩放的形式正常的显示在手机屏幕上了。

如何设置 Viewport

有了 layout viewport 似乎解决手机浏览网页的难题,但如果遇到专门为手机优化的网页就又有新的问题:

是的,因为 iPhone 的 layout viewport 默认为 980px,导致专为其优化的 320px 宽的页面只能以缩放的方式显示,这时就需要对 viewport 进行设置:

<head>
...
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"/>
...
</head>

这个是最常见的一条 viewport meta 代码,将 viewport 定义为:宽度为设备宽度,初始缩放比例为 1 倍,禁止用户缩放。设置好后我们的页面就显示完美了:

viewport 全部属性&值如下:

width: viewport宽度
height: viewport高度
initial-scale: 初始缩放比例
maximum-scale: 最大缩放比例
minimum-scale: 最小缩放比例
user-scalable: 是否允许用户缩放

例:

width=960 或 device-width
height=1000 或 device-height
initial-scale=0.5
maximum-scale=2
minimum-scale=1
user-scalable=1 或 0 (yes 或 no)

layout viewport的默认值

在Apple实现viewport后,其他浏览器也加入了对viewport meta的支持,但彼此间还是有些差异,差异最大的是layout viewport的表现:

Safari iPhone: 980px
Opera: 850px
Android WebKit: 800px
IE: 974px

最后关注下 width=device-width

其实这个属性&值很有意思,字面意应该是 viewport 宽度等于设备宽度,但在实际中不同的浏览器都给出了个定值:320px;这个值还是源于 Apple,因为早期 iPhone 的分辨率为 320px × 480px,大量为 iPhone 量身定制的网站都设置了width=device-width,并且按照宽度 320px 来设计制作,所以其他浏览器加入 viewport 支持时为了兼容性也将 device-width 定义为了 320px。

注解

① 除此之外不同移动浏览器厂商也有不同的解决方案,例如 UCweb 就是使用中间件技术。
② 不同的浏览器厂商对于 layout viewport 的大小定义不同,详见”layout viewport的默认值”。

参考文章:

http://dev.w3.org/csswg/css-device-adapt/
http://www.quirksmode.org/mobile/viewports2.html
https://developer.mozilla.org/en/Mobile/Viewport_meta_tag
http://blogs.msdn.com/b/iemobile/archive/2010/11/22/the-ie-mobile-viewport-on-windows-phone-7.aspx

15 comments

  1. 很想知道WEBQQ在IPAD上运行时候禁止手指上下滑动反弹的效果是怎么实现的~~添加了禁止缩放的代码实现不了这个效果~望指教。。

发表评论

电子邮件地址不会被公开。 必填项已用*标注