理解viewport与device-width

来源:互联网 发布:证大财富淘宝达人贷 编辑:程序博客网 时间:2024/05/21 15:42

原文  http://www.xiaocaoge.com/understanding-viewport-and-device-width.html

在响应式设计或移动Web开发当中经常见到的一句代码:

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

content属性还包括initial-scale,user-scalable等,不过这里不谈,它们的意思都很容易理解。这里要谈得是:viewport代表什么?device-width又是啥?

先来理解两个概念:device pixels与CSS pixels。

device pixels指设备的物理像素,在PC端就是你在操作系统里设置的屏幕分辨率y,其值可以通过 screen.width/screen.height 获取。在移动端下面再说。

CSS pixels指在CSS文件中设置的字体大小、元素宽度等,如 font-size: 14px;width: 100px; 。在PC端,浏览器缩放比例为100%,也即默认情况下,1 CSS pixel = 1 device pixel。

当你放大页面到200%时,字体大小与元素宽度的像素值不会改变,是因为这些像素值是用CSS pixels表示的,实际上放大的是CSS pixels,此时 1 CSS pixel = 4 device pixels,高和宽都是200%。此时你获取 screen.width/screen.height 的值,并没有变化,而 window.innerWidth 和 window.innerHeight 的值变成了原来一半,是因为window.innerWidth/window.innerHeight 的值也是用CSS pixels来表示的。

当你进行流式布局时,会用百分比设置元素的宽度,比如一个块级元素宽度为10%,那么你也知道10%实际上是父级元素宽度的10%。但是你并没有设置父级元素的宽度啊,好吧,你也知道父级元素的宽度与其父级元素宽度一样(通过继承得来,假设这些元素都是块级元素)。然后向上到body元素的宽度,最终为html元素的宽度,其值可以通过 document.documentElement.clientWidth 获取。那这个宽度怎么来得呢?

Viewport

viewport,翻译为视口,也即可视区域的大小,PC端通过 window.innerWidth 和window.innerHeight 获取。

html元素也即文档的宽度,来自于viewport的宽度,在PC端要加上滚动条的宽度才会与viewport的宽度一样。因此,文档的宽度最终来自于viewport的宽度,PC端通过window.innerWidth 获取。

而在移动端,情况将变得复杂。

首先,上面提到文档的宽度来自于viewport的宽度,我们把这个viewport称为layout viewport,因为它和布局有关。在手机上面,因为手机的屏幕很小,当初iphone发布时,为了显示完整的桌面网页,就把给layout viewport设置了一个980px的值。手机上,可以通过 document.documentElement.clientWidth 来获取,我在安卓手机上测试也是980px。

但是这样显示网页,那网页的字体、元素都很小,小到打开这样一个网页,首先要做的就是放大页面。为了提高可读性,Apple允许通meta标签来设置layout viewport的宽度,也即文章开头的那行代码。

但是,device-width又是什么呢?

第一代iphone的分辨率为320*480,屏幕尺寸为3.5寸。当时把layout viewport设置成与浏览器宽度一样(而手机上浏览器宽度与手机屏幕宽度一样)时,不用每次打开网页放大了,而且显示的字体与桌面上差不多,可读性很好。因此就定义了一个device-width,即是手机的屏幕分辨率,此时device翻译为“设备”还合适。

但是第二代iphone发布时,屏幕的分辨率变成了480*960,而屏幕尺寸仍然为3.5寸,如果device-width仍然为手机的屏幕分辨率宽度,那么字体将会比第一代小很多。所以,维持device-width的值不变将会是个很好得选择,能与前面兼容。也因此,iphone上的device-width的值一直为320,只不过device再表示“设备”已经不合适了,实际上代表的是一个中间层。而Android也采用了这一概念,其device-width的值为360的多,360=540/1.5,360=720/2。

如何获取device-width的值呢?

浏览器并没有提供一个获取device-width的属性或方法,但是通过window.innerWidth 可以获取,需要注意的是,必须添加文章开头那行代码才可以跨浏览器获取。如果不添加那行代码,我自己在HTC G18/ Andoird OS 4.0.3中测试,自带浏览器/UC9.6/QQ5.0可以获取,而在Chrome33和Opera20中通过screen.width可以获取。iPhone与iPad我没测试。这是测试网页地址:

http://www.xiaocaoge.com/demo/viewport-screen-device-width-mobile.html。

Chrome与Opera比较深入实现了中间层的概念,屏幕的实际分辨率与Web开发关系并不大,Chrome与Opera就将 screen.width 返回中间层的宽度。这里我也不明白哪种设计更好些。

这里 有个链接 可以查看各种手机型号的device-width/device-height大小,虽然链接称为viewport size。

参考资源:

  • A tale of two viewports – part one:http://www.quirksmode.org/mobile/viewports.html
  • A tale of two viewports – part two:http://www.quirksmode.org/mobile/viewports2.html
  • (上面译文) 两个viewport的故事 – 第一篇:http://weizhifeng.net/viewports.html
  • 两个viewport的故事 – 第二篇: http://weizhifeng.net/viewports2.html
  • Using the viewport meta tag to control layout on mobile browsers:https://developer.mozilla.org/en-US/docs/Mozilla/Mobile/Viewport_meta_tag
  • An introduction to meta viewport and viewport:http://dev.opera.com/articles/view/an-introduction-to-meta-viewport-and-viewport/
  • 什么事viewport,为什么需要viewport:http://zhanchaojiang.iteye.com/blog/1470586
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 吃了土豆呕吐怎么办 煤烟中毒后头疼怎么办 身上长毒气疙瘩怎么办 宝宝肚子寒疼怎么办 小孩腹胀腹痛不消化怎么办 颠茄片服用过量怎么办 狗吃番茄拉肚子怎么办 颠茄片中毒了怎么办 拉肚子半个月怎么办啊 肚子里有细菌怎么办 文珠兰叶子黄了怎么办 文殊兰叶子太长怎么办 桑叶牡丹有虫子怎么办? 米兰花叶子枯萎怎么办 一品红叶子不红怎么办 兰花叶有白点怎么办 旱莲花叶子黄怎么办 旱莲花叶子发黄怎么办 长寿冠叶子枯萎怎么办 长寿花枯萎了怎么办 竹节海棠植株发软怎么办 竹节海棠烂根怎么办 倒挂金钟晒伤了怎么办 长寿花已经徒长怎么办 夏天长寿花徒长怎么办 吊金钟叶子蔫了怎么办 四季海棠长虫子怎么办 小金鱼花不开花怎么办 杜鹃花浇肥大了怎么办 四季海棠烂叶子怎么办 竹节海棠叶子干枯怎么办 月月菊花花朵发黑怎么办 枯萎的四季海棠怎么办 夏天蟹爪兰叶子发软怎么办 夏天蟹爪兰掉叶子该怎么办 天竺葵木质化了怎么办 绿萝烂根且叶子发黄怎么办 海棠树叶子发黑怎么办 四季海棠花干叶怎么办 海棠花叶子蔫了怎么办 海棠花叶子发黑枯萎怎么办?