viewBox 属性

深入讲解SVG viewBox属性的用法,包括缩放、偏移、响应式设计等核心技巧。掌握viewBox是精通SVG的关键。 viewBox 是 SVG 最核心的属性,没有之一。理解了它,你才能真正掌握 SVG。

viewBox 的格式

viewBox="min-x min-y width height"

四个参数的含义:

参数说明
min-x视口左上角在画布上的 x 坐标
min-y视口左上角在画布上的 y 坐标
width视口显示的画布宽度
height视口显示的画布高度

缩放效果

viewBox 的宽高决定了缩放比例。

viewBox="0 0 80 80"

1:1 原始大小

viewBox="0 0 40 40"

放大 2 倍

viewBox="0 0 160 160"

缩小 0.5 倍

计算公式

缩放比例 = 视口尺寸 / viewBox 尺寸
  • viewBox="0 0 40 40",视口 80×80 → 放大 2 倍
  • viewBox="0 0 160 160",视口 80×80 → 缩小 0.5 倍

偏移效果

min-x 和 min-y 决定了从画布的哪个位置开始显示。

区域1 区域2 区域3

假设这是完整的画布

viewBox="50 20 80 80"

viewBox="110 20 80 80"

viewBox="170 20 80 80"

<svg width="80" height="80" viewBox="50 20 80 80">
  <!-- 显示画布上 (50,20) 到 (130,100) 的区域 -->
</svg>

实用技巧

技巧一:图标系统

图标通常设计在 24×24 或 32×32 的画布上。用 viewBox 固定设计尺寸,只改变视口大小。

同一个 viewBox,不同尺寸

<svg viewBox="0 0 24 24" width="16">
  <path d="M12 17.27L18.18 21..."/>
</svg>

技巧二:响应式图形

设置 width: 100%,让 SVG 跟随容器宽度。

拖拽调整宽度
svg {
  width: 100%;
  height: auto;
}

技巧三:动态缩放

用 JavaScript 动态修改 viewBox,实现缩放效果。

const svg = document.querySelector('svg');
let scale = 100;

function zoomIn() {
  scale = Math.max(20, scale - 20);
  svg.setAttribute('viewBox', `0 0 ${scale} ${scale}`);
}

技巧四:平移效果

修改 viewBox 的偏移值,实现平移。

function pan(dx, dy) {
  const viewBox = svg.viewBox.baseVal;
  viewBox.x += dx;
  viewBox.y += dy;
}

常见问题

问题一:viewBox 和视口比例不一致

当 viewBox 宽高比和视口不一致时,SVG 会按默认方式处理(居中,保持比例)。

viewBox 正方形,视口长方形,自动居中

要改变这个行为,需要用 preserveAspectRatio 属性。

问题二:负坐标

viewBox 的 min-x 和 min-y 可以是负数。

viewBox="-20 -20 80 80"

viewBox="0 0 80 80"

小结

  • viewBox 定义了画布上哪部分区域显示在视口里
  • viewBox 小于视口 → 放大
  • viewBox 大于视口 → 缩小
  • viewBox 偏移 → 显示不同区域
  • 响应式 SVG 必须用 viewBox