通俗理解SVG中的ViewBox

在SVG元素中,width height属性以及**viewBox**属性中的宽度(width)和高度(height)都可以影响SVG的布局,前者宽高和普通元素的宽高类似,比较好理解,但是viewBox中的宽高不好理解,本文会将viewBox属性讲清楚。

widthheight 属性

我们先来理解简单的widthheight属性,用法如下:

html 复制代码
 <svg width="100" height="100">
  <rect width="100" height="100" fill="red" />
</svg>

<svg width="100" height="100">
  <rect width="50" height="50" fill="red" />
</svg>

<svg width="200" height="200" style="border: 1px solid black">
  <rect width="100" height="100" fill="red" />
</svg>

在这段代码中,我们通过css的background属性建立了一个间距为10px的网格坐标系统,左上角起始点为原点(0,0),向右和向下分别为横向和纵向的正方向。

所以svg元素的widthheight属性很好理解,这两个属性确定了元素相对于整个画布的绝对大小 ,里面的元素肯定局限在这两个属性限定的范围内

在这个限定范围内,我们要对svg内的元素进行缩放,或者移动内部元素怎么办?这个时候就要用到viewBox属性。

viewBox属性

viewBox也是一个容器,有位置和大小。viewBox属性的用法如下:

html 复制代码
viewBox="x y width height"

or

viewBox="x,y,width,height"

该属性内部有4个属性,可以用空格或者逗号进行分割。

  • x, y 表示viewBox这个容器的左上角位置坐标(相对于svg元素的绝对位置)
  • width, height表示viewBox这个容器的宽高

请看下面这里例子:

html 复制代码
 <svg width="200" height="200">
  <rect width="100" height="100" fill="blue" />
</svg>

<svg width="200" height="200" viewBox="0 0 300 300">
  <rect width="100" height="100" fill="blue" />
</svg>

在这里例子中,我们限定了一个200 * 200 的区域,整个svg元素在这块区域内显示。svg内部的元素rect的宽高为100 * 100。

可以看到左右两个设置了viewBox和没有设置的差异。

在这个图的下面,我们又以viewBox的视角,画出了viewBox这个容器中元素的展示

可以发现,在viewBox视角下,元素的展示和限定在widthheight内的展示一模一样,唯一的差别是前者进行另一个缩放,需要完全限制在widthheight内部。

这就是viewBox的作用。

理解viewBox的SOP

所以我们可以这样理解svg的viewBox属性:

  1. 根据viewBox的四个值确定viewBox的大小
  2. 根据svg内部元素的宽高确定其在viewBox中的位置
  3. 最后把上面二者结合的图像缩放到svg元素的宽高内

举一反三

我们在举一些例子来继续理解viewBox。

1. 案例1

html 复制代码
<svg 
  width="100" 
  height="100" 
  viewBox="0 0 200 200"
>
  <circle cx="100" cy="100" r="50" />
</svg>

2. 案例2

html 复制代码
<svg 
  width="200" 
  height="200" 
  viewBox="0 0 200 200"
>
  <circle cx="100" cy="100" r="50" />
</svg>

3. 案例3

html 复制代码
<svg 
  width="200" 
  height="200" 
  viewBox="0 0 100 100"
>
  <circle cx="100" cy="100" r="50" />
</svg>

4. 案例4

html 复制代码
<svg 
  width="200"
  height="200"
  viewBox="-100 -100 200 200"
>
  <circle cx="0" cy="0" r="50" />
</svg>

上面四个案例中,我们使用**蓝绿色底+紫色元素**画出了viewBox容器中的元素呈现,可以看到这个相对元素展示就是元素在绝对位置上的展示。

按照上述给出的理解步骤,我们很容易还原svg的图像展示。

总结

本文通过一些案例说明了svg元素中width、height 和viewBox属性的理解,其中,widthheight属性控制SVG的物理尺寸,而viewBox属性则定义了一个内部的视图框架,允许内容在保持比例的前提下缩放以适应不同的物理尺寸。

  • viewBox :SVG的显示大小严格遵循widthheight属性。图形的大小不会自动适应容器的大小变化。
  • viewBox :SVG内部的图形(在这个例子中是蓝色的正方形)会被缩放以适应指定的物理尺寸(200x200像素),而不失去比例或变形。这是因为viewBox提供了一种机制,允许SVG内容在不同尺寸的容器中灵活显示,同时保持其内部图形的正确比例和定位。

demo源代码

👇👇👇

codepen.io/janice143/p...

相关推荐
憧憬成为web高手5 小时前
ACTF 12307复现
前端·bootstrap·html
wordbaby5 小时前
Axios 上传大文件崩溃:鸿蒙 RNOH 下 XHR 返回空响应头引发的"假失败"
前端·react native
wordbaby5 小时前
React Native 列表分页实战:下拉刷新与上拉加载的工程化方案
前端·react native
wordbaby6 小时前
脱离 Tab 栏的艺术:React Native 全屏子页面的导航架构实践
前端·react native·harmonyos
陈随易6 小时前
Redis 8.8发布,一定要更新
前端·后端·程序员
wordbaby7 小时前
React Native 新架构落地鸿蒙:跨三端政务级应用的工程实践与深度复盘
前端·react native·harmonyos
excel8 小时前
为什么我推荐使用 Termius:现代 SSH 工具的完整体验
前端·后端
ZC跨境爬虫8 小时前
模块化烹饪小程序开发日记 Day7:(菜谱详情接口开发与JSON数据读取全流程)
前端·javascript·css·ui·微信小程序·json
এ慕ོ冬℘゜8 小时前
JS 前端基础面试题
开发语言·前端·javascript
LaughingZhu8 小时前
Product Hunt 每日热榜 | 2026-05-25
前端·人工智能·经验分享·chatgpt·html