两个viewport的故事

概念:设备像素和CSS像素

你需要明白的第一个概念是CSS像素,以及它和设备像素的区别。

设备像素是我们直觉上觉得「靠谱」的像素。这些像素为你所使用的各种设备都提供了正规的分辨率,并且其值可以(通常情况下)从screen.width/height属性中读出。

如果你给一个元素设置了width: 128px的属性,并且你的显示器是1024px宽,当你最大化你的浏览器屏幕,这个元素将会在你的显示器上重复显示8次(大概是这样;我们先忽略那些微妙的地方)。

如果用户进行缩放,那么计算方式将会发生变化。如果用户放大到200%,那么你的那个拥有width: 128px属性的元素在1024px宽的显示器上只会重复显示4次。

现代浏览器中实现缩放的方式无怪乎都是「拉伸」像素。所以,元素的宽度并没有从128个像素被修改为256个像素;相反是实际像素被放大了两倍。形式上,元素仍然是128个CSS像素宽,即使它占据了256个设备像素的空间。

换句话说,放大到200%使一个CSS像素变成为一个设备像素的四倍。(宽度2倍,高度2倍,总共4倍)

100%缩放

在缩放比例100%的情况下一个CSS像素完全等于一个设备像素。

屏幕尺寸 screen.width/height

它们的尺寸是以设备像素来进行度量的,因为它们永远不会变:它们是显示器的属性,而不是浏览器的

  • 意义:用户屏幕的整体大小。
  • 度量单位:设备像素。
  • 浏览器错误:IE8以CSS像素对其进行度量,IE7和IE8模式下都有这个问题。

窗口尺寸 window.innerWidth/Height

注意度量的宽度和高度是包括滚动条的。它们也被视为内部窗口的一部分

很显然,窗口的内部宽度是以CSS像素进行度量的。你需要知道你的布局空间中有多少可以挤进浏览器窗口,当用户放大的时候这个数值会减少。所以如果用户进行放大操作,那么在窗口中你能获取的空间将会变少,window.innerWidth/Height的值也变小了

  • 意义:浏览器窗口的整体大小,包括滚动条。
  • 度量单位:CSS像素。
  • 浏览器错误:IE7不支持。Opera以设备像素进行度量。

    相反,你想知道的是浏览器窗口的内部尺寸。它告诉了你用户到底有多少空间可以用来做CSS布局。你可以通过window.innerWidth和window.innerHeight来获取这些尺寸

    滚动距离

    window.pageX/YOffset

  • 意义:页面滚动的距离。

  • 度量单位:CSS像素。
  • 浏览器错误:无。
  • window.pageXOffset和window.pageYOffset,包含了文档水平和垂直方向的滚动距离。所以你可以知道用户已经滚动了多少距离

度量viewport

document.documentElement.clientWidth/Height

  • 意义:Viewport尺寸。
  • 度量单位:CSS像素。
  • 浏览器错误:无。
  • 你可能想知道viewport的尺寸。它们可以通过document.documentElement.clientWidth和-Height得到。

两个属性对

但是难道viewport宽度的尺寸也可以通过window.innerWidth/Height来提供吗?怎么说呢,模棱两可。

两个属性对之间存在着正式区别:document.documentElement.clientWidth和-Height并不包含滚动条,但是window.innerWidth/Height包含。这像是鸡蛋里挑骨头。

当时Netscape只支持window.innerWidth/Height,IE只支持document.documentElement.clientWidth和Height。

从那时起所有其他浏览器开始支持clientWidth/Height(视口宽高),
但是IE没有支持window.innerWidth/Height(视口宽高)。

度量<html>元素,即整个文档的宽高

document.documentElement.offsetWidth/Height

  • 意义:<html>元素(也就是页面)的尺寸。
  • 度量单位:CSS像素。
  • 浏览器错误:IE度量的是viewport,而不是<html>元素。
  • 所以clientWidth/Height在所有情况下都提供viewport的尺寸。
  • 但是我们去哪里获取<html>元素本身的尺寸呢?它们存储在document.documentElement.offsetWidth和-Height之中。

事件中的坐标

pageX/Y, clientX/Y, screenX/Y

  • 意义:见正文。
  • 度量单位:见正文。
  • 浏览器错误:IE不支持pageX/Y。IE和Opera以CSS像素为单位计算screenX/Y。
  • 然后是事件中的坐标。当一个鼠标事件发生时,有不少于五种属性对可以给你提供关于事件位置的信息。对于我们当前的讨论来说它们当中的三种是重要的:

pageX/Y提供了相对于<html>元素的以CSS像素度量的坐标。

clientX/Y提供了相对于viewport的以CSS像素度量的坐标。

screenX/Y提供了相对于屏幕的以设备像素进行度量的坐标

90%的时间你将会使用pageX/Y;通常情况下你想知道的是相对于文档的事件坐标。其他的10%时间你将会使用clientX/Y。你永远不需要知道事件相对于屏幕的坐标。

媒体查询

参考文章见于[http://weizhifeng.net/viewports.html]篇目二下次再看