视口与画布

详细讲解SVG视口与画布的概念和关系。理解这两个概念是掌握SVG坐标系统的基础。 视口和画布是 SVG 坐标系统的两个基础概念。搞清楚它们,后面的学习会顺畅很多。

什么是视口

视口(Viewport)是 SVG 在网页上占据的区域。简单说,就是 SVG 的"外框"。

widthheight 属性定义:

视口: 300×150 像素
<svg width="300" height="150">
  <!-- 视口大小 300×150 -->
</svg>

视口可以用不同单位:

<svg width="100%" height="200">      <!-- 百分比 + 像素 -->
<svg width="50vw" height="30vh">     <!-- 视口单位 -->
<svg width="20em" height="10em">     <!-- 相对单位 -->

什么是画布

画布(Canvas)是 SVG 内部的坐标空间。你在里面画图形时用的坐标,就是相对于画布的。

默认情况下,画布大小等于视口大小。

画布坐标 (150, 75)
<svg width="300" height="150">
  <line x1="0" y1="0" x2="300" y2="150" stroke="#e74c3c"/>
  <circle cx="150" cy="75" r="50" fill="#3498db"/>
</svg>

坐标原点

SVG 的坐标原点在左上角:

  • x 轴向右为正
  • y 轴向下为正
x y 原点 (0,0) 点 (100,60)

这和 Canvas、CSS 的坐标系统一致。

视口与画布的关系

默认情况下,视口和画布是一一对应的:

  • 视口 200×100 → 画布也是 200×100
  • 画布上的 (100, 50) 正好在视口中心

但 viewBox 可以改变这种关系。viewBox 让画布和视口"解绑"。

无 viewBox

50×50 的矩形

viewBox="0 0 50 50"

同样的代码,放大了

<svg width="100" height="100">
  <rect x="0" y="0" width="50" height="50" fill="#3498db"/>
</svg>

<svg width="100" height="100" viewBox="0 0 50 50">
  <rect x="0" y="0" width="50" height="50" fill="#e74c3c"/>
</svg>

第二个例子中:

  • 视口是 100×100
  • viewBox 定义画布为 50×50
  • 50×50 的画布要填满 100×100 的视口,所以放大了 2 倍

实际应用场景

场景一:固定尺寸图标

图标通常有固定的设计尺寸,比如 24×24。用 viewBox 可以保持设计坐标不变。

同一个 viewBox,不同视口尺寸

<svg viewBox="0 0 24 24" width="24">
  <path d="M12 2C6.48 2 2 6.48 2 12..."/>
</svg>

场景二:响应式图表

图表需要适应不同屏幕宽度,用 width: 100% + viewBox 实现。

<svg viewBox="0 0 400 200" style="width: 100%; height: auto;">
  <!-- 图表内容 -->
</svg>

场景三:局部放大

通过调整 viewBox 的偏移,可以实现局部放大效果。

完整视图

左上角放大

小结

概念定义方式说明
视口width/heightSVG 在页面上的大小
画布默认等于视口内部坐标空间
viewBoxviewBox 属性改变画布与视口的映射关系