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获取视口尺寸。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!














