viewport的方方面面

1,063 阅读3分钟

做Web开发时,通常我们要在head部分设置viewport样式,通常代码为:

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

如果不了解viewport的原理,在兼容各种屏幕时就会出现各种样式上的问题

viewport的分类

在了解viewport中各的种属性的含义前,需要先区分一下viewport的种类

layout viewport

这是浏览器绘制我们Web网页的区域,也可以说是浏览器的画布。如下图所示,黑色箭头所指的部分就是layout viewport的区域

visual viewport

这是通过屏幕能够看到的区域。如下图所示,黑色箭头所指的屏幕上的部分就是visual viewport的区域。visual viewport区域是layout viewport中可以通过屏幕展示的那一部分

如何测量viewport

有时候我们需要知道这两种viewport大小分别是多少的时候,如何获取这些数据呢?

获取layout viewport大小

window.innerWidth

  • 这一个只读属性,返回以像素为单位的窗口的内部宽度
  • 如果存在垂直滚动条,则也会包含垂直滚动条的宽度

document.documentElement.clientWidth

  • clientWidth属性返回一个元素的内部宽度,不包括边框、外边距和垂直滚动条
  • documentElement表示稳定对象的根元素,也就是Web页面中html元素
  • 当作用在根元素上时,clientWidth返回的是viewport的宽度,但是不包括垂直滚动条的宽度

获取visual viewport大小

window.visualViewport

这是一个实验中的功能返回一个VisualViewport的对象,表示给定窗口的visual viewport,通过该对象可以获取到visual viewport的大小。以下是在Chrome中VisualViewport的相关属性: VisualViewport属性

设置viewport时,是在改变什么

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

当我们在Web页面中添加上述标签时,起到的作用可以从以下几个方面进行分析

width的大小影响什么

width的大小直接影响layout viewport的大小,一般来说该width的值等于layout viewport的宽度值。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=750, initial-scale=1.0">
    <title>viewport</title>
</head>

<body>
    <div>
        <span>左边部分</span>
        <span style="margin-left: 250px; margin-right: 250px;">中间部分</span>
        <span>右边部分</span>
    </div>
</body>
</html>

当我们在Chrome中打开上述页面,并切换到移动显示时,可以在Console中打印document.documentElement.clientWidth的值,该值为我们在viewport中设置的750。

*-scale缩放比例是指什么

layout viewport设定之后,不会随着用户的缩放操作而改变。这样也保证了页面上各个元素相对位置的一个稳定性,因为layout viewport是浏览器绘制Web页面的画布。

用户缩放操作可以影响其看到的内容,所以缩放操作直接影响了viewport的大小。在window.visualViewport对象上有scale和width两个属性,这两个属性的乘积等于window.screen.width。

  • 当我们放大页面时,visual viewport就会变小,这个时候能看到的layout viewport部分就会变小
  • 当我们缩小页面时,visual viewport就会变得,这个时候能看到的layout viewport部分就会变大

通过设置这个比例,我们可以限制用户对页面的缩放程度。

user-scalable控制什么

user-scalable控制用户对于Web页面是否可以进行缩放操作。

所以当我们设置viewport时,是在设置layout viewport的大小,同时设置页面缩放相关的属性。

@media是基于哪个viewport

在响应式Web设计中,我们通常会用到@Media来进行不同的媒体设置样式设置。例如:

@media screen and (max-width: 375px) {
     .left {
         color: red;
     }
}

这段代码中,width的比较基准是哪个viewport的宽度呢?

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=750, initial-scale=1.0">
    <title>viewport</title>

    <style>
        @media screen and (max-width: 375px) {
            .left {
                color: red;
            }
        }
    </style>
</head>

<body>
    <div>
        <span class="left">左边部分</span>
        <span style="margin-left: 250px; margin-right: 250px;">中间部分</span>
        <span>右边部分</span>
    </div>
</body>
</html>

可以修改上面代码中viewport的width的值,然后观察效果。width的比较基准是layout viewport的宽度。

总结

通过上述对两种viewport的介绍、viewport标签参数的作用以及@media媒体查询中宽度的基准量进行介绍和相关代码,基本上涵盖了viewport的方方面面,在日常开发中我们再也不用害怕viewport设置了