视频加载失败

CSS3中的视口viewport

1383 字
7 分钟
CSS3中的视口viewport

视口概念#

什么是视口(Viewport)#

视口(Viewport)是浏览器中用于显示网页内容的区域。 它决定了网页能够使用多大的空间进行布局。简单理解:

  • 屏幕(Screen):设备的整个物理显示区域。
  • 视口(Viewport):浏览器提供给网页显示内容的区域。
  • 网页(Document):网页的完整内容,可能超出视口,需要滚动才能查看。

视口不等于整个屏幕,网页内容也不一定局限于视口高度。

视口的分类#

在移动端开发中,主要涉及两种视口。

类型说明
布局视口(Layout Viewport)浏览器用于计算网页布局的区域
视觉视口(Visual Viewport)用户当前实际看到的网页区域

例如:在手机浏览器中放大网页时,布局视口的宽度通常不变,而视觉视口会变小,因为用户只能看到网页的一部分。

CSS中的视口单位#

CSS提供了基于视口大小计算的长度单位。

单位含义
vw视口宽度的1%
vh视口高度的1%
vmin视口宽高较小值的1%
vmax视口宽高较大值的1%
dvh动态视口高度的1%
svh小视口高度的1%
lvh大视口高度的1%

例如:

.box {
width: 50vw; /* 视口宽度的50% */
height: 30vh; /* 视口高度的30% */
}
.container {
min-height: 100dvh; /* 适应移动端动态视口 */
}

假设视口为 1200 × 800 CSS像素,那么 50vw = 600px,30vh = 240px。

注意:vw 和 vh 是相对于视口计算的,不是相对于父元素计算的。另外,移动端浏览器地址栏显示、隐藏时,dvh 比传统 vh 更适合需要跟随可见区域变化的全屏布局。

如何设置viewport#

使用meta标签设置#

在HTML文档的 <head> 中,通过 meta 标签配置移动端视口。

<meta
name="viewport"
content="width=device-width, initial-scale=1.0"
/>

这是现代响应式网页最常用的视口配置。

属性解释:

属性作用
width=device-width设置布局视口宽度为设备的CSS像素宽度
initial-scale=1.0设置页面初始缩放比例为1
minimum-scale设置允许的最小缩放比例
maximum-scale设置允许的最大缩放比例
user-scalable控制是否允许用户手动缩放

通常只需要前两个配置,不建议使用 user-scalable=no 限制缩放,因为这可能影响需要放大网页的用户。

为什么要设置viewport?#

早期移动端浏览器为了兼容PC网页,会使用一个较宽的默认布局视口(常见约980 CSS像素),然后把整张网页缩小显示。因此,如果没有正确配置Viewport,可能会导致:

  • 网页在手机上整体缩小。
  • 文字和按钮过小。
  • 响应式媒体查询无法按照预期工作。

设置之后,网页就能按照设备对应的CSS像素宽度正常布局。

完整HTML示例#

<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0"
/>
<title>Viewport示例</title>
<style>
.box {
width: 50vw;
height: 200px;
background-color: skyblue;
}
@media (max-width: 768px) {
.box {
width: 100%;
}
}
</style>
</head>
<body>
<div class="box"></div>
</body>
</html>

效果:

  • 视口宽度大于768px时,盒子宽度为视口的50%。
  • 视口宽度小于或等于768px时,盒子宽度为父元素内容区域的100%。

注意:meta viewport 属于HTML配置,不是CSS属性,但它会直接影响CSS响应式布局的表现。

通过JS获取视口#

JavaScript提供了多种获取视口尺寸的方法。

window.innerWidth / innerHeight#

获取浏览器布局视口的宽度和高度。

// 获取视口宽度
const width = window.innerWidth;
// 获取视口高度
const height = window.innerHeight;
console.log(width, height);

innerWidth 和 innerHeight 包含视口内可能存在的滚动条所占空间。

document.documentElement.clientWidth / clientHeight#

获取HTML根元素的可见内容区域尺寸。

const width = document.documentElement.clientWidth;
const height = document.documentElement.clientHeight;
console.log(width, height);

与 innerWidth 的主要区别是:clientWidth 通常不包括传统滚动条占用的宽度。

window.visualViewport#

获取当前视觉视口尺寸,在移动端缩放等场景下尤其有用。

const width = window.visualViewport.width;
const height = window.visualViewport.height;
console.log(width, height);

其中 visualViewport 的 width 和 height 可以随着页面缩放、可见区域变化而改变。

监听视口大小变化#

使用 resize 事件,在浏览器窗口大小发生变化时执行代码。

window.addEventListener("resize", () => {
console.log("视口宽度:", window.innerWidth);
console.log("视口高度:", window.innerHeight);
});

如果需要监听移动端视觉视口变化:

window.visualViewport?.addEventListener("resize", () => {
console.log(window.visualViewport.width);
console.log(window.visualViewport.height);
});

常见获取方式对比#

JS属性获取内容典型用途
window.innerWidth布局视口宽度获取页面可用宽度
window.innerHeight布局视口高度获取页面可用高度
document.documentElement.clientWidth排除传统滚动条的根元素可见宽度布局尺寸计算
document.documentElement.clientHeight根元素可见高度页面高度计算
window.visualViewport.width视觉视口宽度移动端缩放适配
window.visualViewport.height视觉视口高度软键盘、缩放适配
screen.width设备屏幕宽度获取屏幕信息,不等于视口

总结#

知识点核心内容
视口概念浏览器用于显示网页内容的区域
设置viewport<meta name="viewport" content="width=device-width, initial-scale=1.0">
CSS视口单位vw、vh、dvh 等
JS获取布局视口window.innerWidth、window.innerHeight
JS获取视觉视口window.visualViewport
监听视口变化resize 事件

实际开发中: 使用 meta viewport 配合 CSS 媒体查询、Flex、Grid 和视口单位就能完成绝大多数响应式布局。只有需要进行动态尺寸计算、Canvas绘制、特殊移动端适配时,才需要通过JavaScript获取视口尺寸。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

CSS3中的视口viewport
https://f.youzi177.cn/posts/2026100903css3-zhong-de-shi-kou-viewport/
作者
小封鸭
发布于
2026-10-09
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
小封鸭
小楼一夜听春雨,深巷明朝卖杏花
公告
欢迎来到我的博客。这里主要记录前端全栈和日常内容
分类
标签
最新动态
站点统计
文章
60
分类
3
标签
12
总字数
107,734
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
EdgeOne Pages
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录