一句话回答

meta viewport 标签的作用是让布局视口(layout viewport)的宽度等于设备的宽度,页面不再被浏览器整体缩小,移动端可以直接按 CSS 像素 1:1 渲染。不写它,手机浏览器会把网页当作 980px 宽的"桌面页"渲染,再等比缩放到屏幕大小。

原理:三种视口

移动端浏览器通常在一个比物理屏幕更宽的虚拟窗口中渲染页面,这个虚拟窗口就是 viewport。它的存在是为了让没做移动端适配的网页也能完整展示。理解原理的关键是分清三种视口:

视口含义默认值(典型)
布局视口 layout viewport浏览器实际用来排版页面的窗口,CSS 以它为基准约 980px(各浏览器 800–1024px 不等)
视觉视口 visual viewport用户当前真实看到的那块区域,即屏幕大小设备物理宽度(如 320/375/414 CSS px)
理想视口 ideal viewport让布局视口等于设备宽度后页面"最合适"的尺寸由设备决定,device-width 即指它

举个例子:iPhone 4 屏幕宽 320px,浏览器却用 980px 宽的布局视口渲染页面,然后把 980px 的内容等比缩小塞进 320px 的视觉视口——这就是当年打开网页字特别小的原因。320px 是可见视口(视觉视口)宽度,980px 是视窗视口(布局视口)宽度。

<meta name="viewport" content="width=device-width, initial-scale=1.0"> 做的事:把布局视口的宽度设成理想视口(设备宽度),初始缩放为 1,于是 CSS 像素与设备独立像素一一对应,媒体查询 @media (max-width: 480px) 也能按真实屏幕宽度命中。

解析

Viewport 字面意思为视图窗口,在移动 web 开发中使用。表示将设备浏览器宽度虚拟成一个特定的值(或计算得出),这样利于移动 web 站点跨设备显示效果基本一致。

在移动端浏览器当中,存在着两种视口:一种是可见视口(设备大小),另一种是视窗视口(网页渲染宽度)。为了显示更多的内容,大多数浏览器会扩大自己的视窗视口——让 320px 的屏幕宽度容下 980px 甚至更宽的内容(将网页等比例缩小)。

一个标准 meta viewport

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

常用属性值

属性含义
width=device-width布局视口宽度等于设备宽度(最关键)
initial-scale=1.0初始缩放比例
maximum-scale / minimum-scale用户可缩放的最大 / 最小比例
user-scalable=no是否允许用户缩放(无障碍角度不建议禁用)
viewport-fit=coveriPhone 刘海屏需要,让 viewport 延伸到安全区外,配合 env(safe-area-inset-*) 使用

注意:user-scalable=no / maximum-scale=1.0 会禁用缩放,视力障碍用户无法放大页面,iOS Safari 早期还会因此忽略缩放设置;只为去掉 input 聚焦放大时不必禁用,改用 font-size >= 16px 即可。

进阶:viewport 单位与 DPR

CSS 里可以直接使用 viewport 单位做适配:

  • vw:视窗宽度的 1%
  • vh:视窗高度的 1%
  • vmin / vmax:取 vw / vh 中较小或较大的一个

与 DPR(devicePixelRatio)区分开:DPR 是物理像素 / CSS 像素的比值(Retina 屏为 2 或 3),影响的是图片清晰度与 1px 边框问题;viewport 宽度影响的是页面布局基准,两者是不同维度的事。

面试要点小结

  1. 不写 meta viewport:手机浏览器按约 980px 布局视口渲染再整体缩小,页面字小、布局是"桌面版"。
  2. 写了 width=device-width, initial-scale=1:布局视口 = 设备宽度,CSS 按真实屏幕宽排版,响应式布局的前提。
  3. 三种视口概念:布局视口(渲染基准)、视觉视口(用户所见)、理想视口(设备宽度)。
  4. 它是移动端 H5 适配的入口开关,不写它几乎所有移动端样式都会出问题。

来源整理自:我的有道云笔记