HTML meta viewport属性说明(mark)

什么是Viewport

手机浏览器是把页面放在一个虚拟的“窗口”(viewport)中,一般这个虚拟的“窗口”(viewport)比屏幕宽,这样就不用把每一个网页挤到很小的窗口中(这样会破坏没有针对手机浏览器优化的网页的布局),用户能够经过平移和缩放来看网页的不一样部分。移动版的 Safari 浏览器最新引进了 viewport 这个 meta tag,让网页开发者来控制 viewport 的大小和缩放,其余手机浏览器也基本支持。html

 

Viewport 基础

一个经常使用的针对移动网页优化过的页面的 viewport meta 标签大体以下:android

<meta name=”viewport” content=”width=device-width, initial-scale=1, maximum-scale=1″>ios

width:控制 viewport 的大小,能够指定的一个值,若是 600,或者特殊的值,如 device-width 为设备的宽度(单位为缩放为 100% 时的 CSS 的像素)。
height:和 width 相对应,指定高度。
initial-scale:初始缩放比例,也便是当页面第一次 load 的时候缩放比例。
maximum-scale:容许用户缩放到的最大比例。
minimum-scale:容许用户缩放到的最小比例。
user-scalable:用户是否能够手动缩放web

 

关于viewport的一些问题

viewport并不是只是ios上的独有属性,在android、winphone上一样也有viewport。它们要解决的问题是相同的,即无视设备的真实分辨率,直接经过dpi,在物理尺寸和浏览器之间重设分辨率,这个分辨率和设备的分辨率无关。好比,你拿个3.5寸-320 * 480的iphone3 gs、3.5寸-640 * 960的iphone4或者9.7寸-1024*768的ipad2,虽然设备的分辨率不一样,物理尺寸也不一样,但你能够经过设置viewport让它们在浏览器里有相同的分辨率。好比说,你的网站是800px宽,你能够经过设置viewport的width=800,来让你的网站在这三个不一样的设备上都恰好满屏显示你的网站。浏览器

 

以上的知识,相信每一个对viewport稍有了解的同窗应该都已经了解了。这不是我今天想说的重点。我想说明的是viewport在ios和android上的一些差别表现。app

 

网上一搜关于viewport的知识,基本上全都是以下信息:iphone

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />布局

这段代码的意思是,让viewport的宽度等于物理设备上的真实分辨率,不容许用户缩放。一都主流的web app都是这么设置的,它的做用实际上是故意舍弃viewport,不缩放页面,这样dpi确定和设备上的真实分辨率是同样的,不作任何缩放,网页会所以显得更高细腻。玩ps的同窗应该都知道,当你将一张1000 * 1000的图片直接缩放至500 * 500分变成什么样,对吧?图片的失真必定逃不掉。测试

 

但我要作的一个应用却偏偏相反,须要利用viewport,利用缩放。不论真实分辨率是多少,不管物理尺寸是多少,我都但愿在浏览器里,能有统一的分辨率,同时也不容许用户缩放。我用来测试的设备有:iphone四、ipad二、htc的g十一、不知道什么厂商的aquos phone(android系统)、华硕的android pad、dell的winphone而后我一路遇到了以下问题:优化

 

1)若是不显示地设置viewport,那么width的默认为980。若是页面的全部元素宽度都小于980,此时width为980,若是页面最宽的位置超过980,那么width等于最大宽度。总之,默认能将整个页面从左到右显示出来。若是设置了viewport,好比,只单纯地设置了user-scalable=no,例如<meta name="viewport" content="user-scalable=no" />,那么ios下width仍是按980显示(即默认就会经过dpi缩放),但android和winphone下却不会再缩放了,浏览器分辨率和真实设置分辨率一致。

 

2)对于ios设备,设置width能够生效,但对于android,设置width并不会生效。ios设备,缩放的比率即dpi是经过你设置的width和设置真实分辨率自动计算的,而android下你设置width无效,你能设置的是一个特殊的字段target-densitydpi,关于target-densitydpi能够参考一下这篇文章:http://hi.baidu.com/j_fo/blog/item/748361279ebccd18908f9d7d.html。也就是说,有三个变量:浏览器width、设备真实width、dpi。 咱们简单地用个公式来表达它们之间的关系吧(并不是真实关系,简单说明用) 设备真实width * dpi = 浏览器width,这里的三个变量,设备真实width是个咱们不能操做的已知值,另外两个变量咱们能够设置一个来影响另外一个,在ios中,咱们能改的是浏览器width,dpi自动生成,而在android中,咱们能改的是dpi,浏览器width自动生成。对于android,不管咱们如何设置width,也不会对浏览器width产生影响。

 

ps:这里我另外再说一个奇怪的问题:在htc的g11里(htc的手机我只有这一个,别的没有测),若是设置了dpi而不显示地设置width,则user-scalable=no不生效,便是说:<meta name="viewport" content="target-densitydpi=300,user-scalable=no" />,没法阻止用户缩放屏幕。咱们须要显示地设置一下width值,仅管这个值对android下的浏览器分辨屏并不产生任何影响(对ios仍是会产生影响的),咱们仍然要设置它,并且这个值必定要大于320,若是小于等于320,也没法使user-scalable=no生效。这个问题只在htc的g11手机上出现,在aquos phone没有这个问题。兼容android真是件头痛的事 @_ @,将来还不知道有多少坑呢。而在winphone上,结果就更奇怪了:我给viewport的width设一个大于480的值,user-scalable=no就失效了,而设一个小于480的值,user-scalable=no能生效。但不管我给viewport的width设多少值,对winphone真正显示的width却并不产生我预期的影响,经过target-densitydpi也没有影响。设置width,若是小于480的话,屏幕会缩放,但缩小的比例却和我预期彻底不同,我不知道它是按照什么规律缩放的。不知道这是winphone的问题,仍是dell实现的问题。

 

3)这一条和上一条应该是直接相关的:ios设备在横竖屏时,会自动调整dpi,不管横屏仍是竖屏,都能保证浏览器width等于viewport中设置的值,因此横竖屏的时候,页面里显示的内容的大小是会自动缩放产生变化的。而android手机在横竖屏的时候,不会改变dpi,在横竖屏的时候,网页不会产生缩放。也正所以,ios能够保证横竖屏页面都不会产生滚动条,满屏显示,而android却没法保证这一点,横着满屏则竖着没法满屏,反之亦然。

 

4)对于ios设备,若是width显示定义了,而页面最宽的位置超过width的话,width无效,仍按最宽的宽度来显示(不会有滚动条)。但此时会出现一个很奇怪的问题,当你将手机横竖屏切换几回以后,会发现你的页面自动放大了,出现了滚动条,但其实放大后的宽度其实和你设的width也并无关系。为了防止这种状况出现,你须要将width的宽度设置得比页面最宽的地方更大,或者相同

相关文章
相关标签/搜索