Skip to content

视口比例的长度 vw 和 vh

  • 使用视口单位vw来实现响应式排版。1vw等同于视口宽度的百分之一,即如果你用vw来设定字体大小的话,字体的大小将总是随视口的大小进行改变。
  • 视口百分比长度定义相对于 viewport 的大小的 <length> 值,即文档的可见部分。视口长度在 @page 声明块中无效。

视口 viewport

视口代表当前可见的计算机图形区域。在 Web 浏览器术语中,通常与浏览器窗口相同,但不包括浏览器的 UI,菜单栏等——即指你正在浏览的文档的那一部分。

文档,比如这篇文章,可能会非常长。你的视口就是你现在所能见到的所有事物。值得注意的是“什么是视口区域”这个问题,页面中的一些导航菜单也包括在其中。视口的大小取决于屏幕的大小,无论浏览器是否处于全屏模式,是否被用户缩放了。视口外的区域,比如这个文档的参见部分,可能需要滚动到其所在的区域才会出现在屏幕上。

  • 在尺寸较大的设备中,在这些设备上,应用显示区域不一定是全屏的,视口是浏览器窗口的大小。
  • 在大多数移动设备中,浏览器是全屏的,视口是整个屏幕的大小。
  • 在全屏模式下,视口是设备屏幕的范围,窗口是浏览器窗口,浏览器窗口大小小于或等于视口的大小,并且文档是这个网站,文档的大小可比视口长或宽。

概括地说,视口基本上是当前文档的可见部分。

视口大小是可变的

视口的宽度并不总是窗口的宽度。

js
document.documentElement.clientWidth; /* 1200 */
window.innerWidth; /* 1200 */
window.outerWidth; /* 1200 */
  • 文档的 Element.clientWidth 是指一个文档使用 CSS pixels 单位表示的内部宽度,包括其 padding(不包括 border、margin 或垂直滚动条)。这就是视口的宽度
  • Window.innerWidth 是用 CSS 像素单位表示的浏览器窗口的视口宽度,包括垂直滚动条。
  • Window.outerWidth 是指包括了浏览器外边框的窗口宽度。

在实测中,innerWidthouterWidth 是相同的,但是 outerHeightinnerHeight 高 100px。这是因为 outerHeight 的测量包括浏览器框架在内,包括了地址栏和书签栏总共 100px 的高度,而浏览器没有左右边框。

innerHeightinnerWidth 所组成的区域通常被认为是布局视口(layout viewport)。浏览器的框架不被认为是视口的一部分。

vw 和 vh

  • vh:视口的初始包含块的高度的 1%。
  • vw:视口的初始包含块的宽度的 1%。
  • vmin:视口高度 vw 和宽度 vh 两者之间的最小值。
  • vmax:视口高度 vw 和宽度 vh 两者之间的最大值。
css
h1 {
  font-size: 6vw;
}

问题在于,当做上面的事情的时候,因为文本总是随着视口的大小改变大小,用户失去了放缩任何使用vw单位的文本的能力。所以你永远都不要只用 viewport 单位设定文本。

这里有一个解决方法,它使用了calc(),如果你将vw单位加到了使用固定大小(例如em或者rem)的值组,那么文本仍然是可放缩的。基本来说,是vw加在了放缩后的值上。

css
h1 {
  font-size: calc(1.5rem + 3vw);
}

这就是说,我们只需要指定标题的字体大小一次,而不是为移动端设定它,然后再在媒介查询中重新定义它。字体会在你增加视口大小的时候逐渐增大。