SVG 使用详解

基本使用

SVG 元素的渲染顺序

在 SVG 中,元素的渲染顺序非常重要,因为 SVG 遵循"后来居上"(Later On Top,LOT)的原则。这意味着在代码中后出现的元素会覆盖先前出现的元素。如果你有多个重叠的元素,后面的元素会显示在前面元素的上层

坐标定位

SVG 中的坐标系统使用一个二维平面,其中每个元素的位置可以通过 x 和 y 属性来指定。这些属性定义了元素的左上角点在 SVG 画布上的起始位置。 例如,下面的 SVG 代码定义了一个起始位置为 0 0 的矩形:

HTML 复制代码
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
  <rect x="0" y="0" width="100" height="100" />
</svg>

SVG 样式

  • 在未给 SVG 设置宽高样式时,SVG 默认宽高为 300x150。
  • 样式优先级问题。 style 中样式 > css 样式 > 属性样式。
  • 在SVG中,许多属性不仅可以直接在SVG元素上设置,还可以通过CSS来控制。例如: fill、stroke、stroke-width、width、height等等,同样他们的优先级遵循第二条规则。

SVG 根标签

常见属性如下:

  • viewBox
  • xmlns 命名空间

viewBox

语法:viewBox="x y width height"

x, y:视口的左上角起点(通常为 0 0)。

width, height:视口的宽高(逻辑单位,非像素)。

设置 viewBox

iconFont 中使用 viewBox ,实际代码如下:

  • viewBox="0 0 1024 1024":定义了 SVG 的内部坐标系范围,表示 SVG 内容的逻辑尺寸是 1024x1024。这个坐标系是虚拟的,与实际的物理尺寸无关。
  • 可以通过修改 svg 宽高动态调节icon 大小。绘制的逻辑坐标会最终会按比例缩放到物理尺寸上。

上面的 SVG 中的 path 坐标是基于 viewBox 定义的逻辑坐标系(这里是 1024x1024),而最终的显示尺寸是通过 width 和 height 将逻辑坐标系的内容按比例缩放到物理尺寸上。

不设置 viewBox

如果没有设置 viewBox,SVG 的绘制区域(即用户坐标系)会直接映射到 svg 元素的 width 和 height,SVG 的坐标系是 1 单位 = 1 像素。 与设置 viewBox 的对比:如果设置了 viewBox,SVG 的绘制区域会根据 viewBox 的定义进行缩放和适配。

xmlns 命名空间

xmlns全称是"XML Namespaces",指"XML命名空间"。

不同元素的 XML 类型的渲染规则是不同的: 这些XML类型的渲染规则是有差异的,例如HTML中裸露的元素是不会表现为圆,而是一个普通的自定义元素。RSS中的XML浏览器会自动进行文章排版渲染等。

所以我们可以看到,指定命名空间可以让浏览器精准解析, 如果不指定 svg 的xmlns(命名空间),浏览器无法正确解析我们的元素。

容器标签

g 标签

标签将一个圆形和一个矩形组合在一起,并统一应用了填充颜色、边框颜色和边框宽度。

HTML 复制代码
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
    <g fill="red" stroke="black" stroke-width="2">
        <circle cx="50" cy="50" r="30" />
        <rect x="100" y="50" width="50" height="50" />
    </g>
</svg>

主要用途:

  • 分组管理:将多个图形元素组合在一起,方便代码分组。
  • 统一应用样式和变换:对组内的所有元素统一应用样式(如颜色、边框)或变换(如平移、旋转、缩放)。
  • 事件监听:为整个组添加事件监听器,而不是单独为每个元素添加。

defs 标签

是一个定义区域,用于定义可复用的图形元素,这些元素不会直接显示 ,但可以通过引用(如 、fill="url(#id)" 等)在 SVG 中使用。 主要用途:

  1. 复用图形元素 将重复使用的图形(如箭头、图标、路径等)定义在 <defs> 中,通过 <use> 标签在画布中多次引用。
  2. 定义资源 存放渐变(<linearGradient>、<radialGradient>)、重复(<pattern>)、滤镜(<filter>)、蒙版(<mask>)、标记(<marker>)等复杂资源,供其他元素使用。
  3. 代码组织 将复杂的图形逻辑集中管理,提高代码可读性和维护性。

path 路径

标签是SVG中非常强大且灵活的元素,用于定义任意形状的路径。

d 属性定义路径

  • M x y:绝对坐标移动到点 (x, y),不绘制任何内容。
  • L x y:从当前位置绘制一条直线到绝对坐标点 (x, y)。
  • H x:从当前位置绘制一条水平直线到绝对 x 坐标。
  • V y:从当前位置绘制一条垂直直线到绝对 y 坐标。
  • C x1 y1 x2 y2 x y:绘制一条三次贝塞尔曲线,控制点为 (x1, y1) 和 (x2, y2),终点为 (x, y)。
  • Q x1 y1 x y:绘制一条二次贝塞尔曲线,控制点为 (x1, y1),终点为 (x, y)。
  • Z:闭合路径,将当前点连接到路径的起始点。

下面示例是分别使用相对路径和绝对路径实现相同的效果。

其他图形属性

  • stroke="blue":边框颜色
  • stroke-width="3":边框宽度
  • stroke-dasharray="5, 5":虚线样式
  • stroke-dashoffset="2":虚线偏移量
  • fill="red":填充颜色
  • fill-opacity="0.5":填充透明度
  • stroke-opacity="0.8":边框透明度
  • opacity="0.7":整体透明度
  • transform="translate(10, 20)":图形变换(平移)
  • class="shape":CSS类名
  • id="uniqueId":元素唯一标识符
  • style="stroke: green; fill: yellow;":内联样式
  • pointer-events="none":鼠标事件响应
  • clip-path="url(#clipPathId)":裁剪路径
  • mask="url(#maskId)":遮罩效果

绘制曲线

绘制三次贝塞尔曲线,请移动 下方示例中红色控制点更改三次贝塞尔曲线的形状!

通过组合多个三次贝塞尔曲线来实现更复杂的曲线形状。

html 复制代码
<svg width="800" height="800" xmlns="http://www.w3.org/2000/svg">
    <!-- 复杂的贝塞尔曲线 -->
    <path d="
      M 50 400
      C 100 100, 200 100, 300 400
      C 400 700, 500 700, 600 400
      C 700 100, 800 100, 850 400
    " stroke="blue" stroke-width="3" fill="none"></path>
</svg>

图形复用

复用图形组

  • 通过 use 复用 defs 中定义 g 标签定义的图形组。
  • 在 use 标签上应用的样式会应用到 g 标签下的每一个图形上。如果不需要,可以在图形本身上设置样式。

symbol 模板元素

  • 是一个模板元素,可以像 元素那样将需要复用的元素包裹起来。
  • 具有自己的 viewBox 属性,可以定义独立的坐标系。支持通过 viewBox 自适应缩放。相比与直接复用 g 标签有更好的自适应效果。

碰到坑点,当我们使用 use 只设置了宽高中的一个,另外一边则会默认居中对齐,即使你设置了 x、y 也是无效的。如果你想要按照自己设置的坐标来,就需要将宽高都设置上。

渐变

SVG本身提供了两种渐变类型:线性渐变()和径向渐变()

href 属性和 url() 函数

  • href 用于复用内部定义的图形、<a>、<image> 引用外部链接。
  • url() 函数用于引用内部 css 样式。例如引用 linearGradient、filter、clipPath 等。

foreignObject

SVG 中的 元素允许在 SVG 文档中嵌入来自不同 XML 命名空间的元素,例如 HTML

常用的第三方库

1. 基础操作与渲染

  • Snap.svg

    • 专为现代浏览器设计的SVG操作库,API类似jQuery,支持动画、事件和变换。
    • 官网: snapsvg.io
  • SVG.js

    • 轻量级(核心仅30KB),提供链式API,支持元素创建、动画、渐变等。
    • 官网: svgjs.com

2. 动画库

  • anime.js

    • 轻量级动画引擎,支持SVG属性、路径描边动画(stroke-dashoffset)。
    • 官网: animejs.com

3. 数据可视化

  • D3.js

    • 强大的数据驱动文档库,通过SVG生成复杂图表(如力导向图、地图)。
    • 官网: d3js.org
相关推荐
GISer_Jing1 小时前
前端面试通关:Cesium+Three+React优化+TypeScript实战+ECharts性能方案
前端·react.js·面试
落霞的思绪2 小时前
CSS复习
前端·css
咖啡の猫4 小时前
Shell脚本-for循环应用案例
前端·chrome
百万蹄蹄向前冲7 小时前
Trae分析Phaser.js游戏《洋葱头捡星星》
前端·游戏开发·trae
朝阳5817 小时前
在浏览器端使用 xml2js 遇到的报错及解决方法
前端
GIS之路7 小时前
GeoTools 读取影像元数据
前端
ssshooter8 小时前
VSCode 自带的 TS 版本可能跟项目TS 版本不一样
前端·面试·typescript
Jerry8 小时前
Jetpack Compose 中的状态
前端
dae bal9 小时前
关于RSA和AES加密
前端·vue.js
柳杉9 小时前
使用three.js搭建3d隧道监测-2
前端·javascript·数据可视化