Skip to content

参考:SVG 元素 / 属性 / d 命令速查

基于 SVG 1.1 / SVG 2 CR(2026 浏览器现状)· 核于 2026-07

速查

  • 坐标:viewBox="min-x min-y w h" 定义用户坐标系;缩放比 = viewport/viewBox;preserveAspectRatio 默认 xMidYMid meet(meet≈contain、slice≈cover、none=拉伸;无 viewBox 时被忽略)。
  • 形状rect/circle/ellipse/line/polyline/polygon;polygon 自动闭合;全部可用 path 表达。
  • d 命令:M 移动、L/H/V 直线、C/S 三次贝塞尔、Q/T 二次贝塞尔、A 椭圆弧(7 参数)、Z 闭合;大写绝对、小写相对
  • paint:fill/stroke = 颜色 | none | currentColor | url(#id);fill-rule:nonzero(默认)/evenodd;dasharray 奇数值整组复制。
  • 描边动画:dasharray = dashoffset = 路径长(getTotalLength()pathLength 归一化)→ 动画 offset 归零。
  • 复用defs 只定义不渲染;symbol 自带 viewBox;use 深克隆进影子树(JS 不可及、CSS 继承/变量可穿透、显式属性不可覆盖、外部 sprite 严格同源)。
  • 裁剪遮罩:clipPath 几何二值(无软边、便宜)vs mask 亮度×alpha(可渐变羽化、贵)。
  • 滤镜:fe 原语管道(in/result 串接);输入 SourceGraphic/SourceAlpha;默认 region 只扩 10%,大阴影记得扩;feDropShadow 一条顶三条。
  • 变换:rotate 默认绕 (0,0);从左到右应用、每步新坐标系;CSS 侧要 deg + transform-box: fill-box 才绕自身中心。
  • 动画三路:CSS(UI 微动效)/ SMIL(路径 morph、animateMotion、img 内自动播;未废弃)/ JS(GSAP/WAAPI 复杂时间线)。
  • 脚本:createElementNS 必须;href 取代 xlink:href;getBBox/getScreenCTM 做几何与坐标换算。
  • 优化:3k~5k 节点阈值换 Canvas;SVGO v4 才默认保 viewBox/title,v3 前手动关 removeViewBox。
  • 无障碍:role="img" + title 首子元素 + aria-labelledby;装饰图 aria-hidden + focusable="false"。

一、常用元素速查

元素作用关键属性
<svg>根元素/嵌套视口width/height/viewBox/preserveAspectRatio/xmlns
<rect>矩形x/y/width/height/rx/ry(圆角)
<circle>cx/cy/r
<ellipse>椭圆cx/cy/rx/ry
<line>线段(须 stroke 才可见)x1/y1/x2/y2
<polyline>折线(不闭合)points
<polygon>多边形(自动闭合)points
<path>任意路径d/pathLength/fill-rule
<text>文本(x/y 是基线起点,不自动换行)x/y/dx/dy/rotate/text-anchor/dominant-baseline/textLength
<tspan>文本内局部换样式/重定位(手动换行)x/y/dx/dy
<textPath>文字沿路径排布href/startOffset
<g>分组 + 属性继承transform 及所有 presentation 属性
<defs>只定义不渲染的资源库
<symbol>复用模板(自带视口、不直接渲染)viewBox/preserveAspectRatio
<use>引用克隆(影子树)href/x/y/width/height(后两者仅对 svg/symbol 生效)
<marker>顶点标记(箭头等)markerWidth/markerHeight/markerUnits/refX/refY/orient
<linearGradient>线性渐变x1/y1/x2/y2/gradientUnits/spreadMethod/href
<radialGradient>径向渐变cx/cy/r/fx/fy(焦点)
<stop>渐变色标offset/stop-color/stop-opacity
<pattern>平铺图案patternUnits/patternContentUnits/width/height
<clipPath>几何裁剪clipPathUnits(默认 userSpaceOnUse)
<mask>亮度×alpha 遮罩maskUnits(默认 objectBoundingBox)/maskContentUnits
<filter>滤镜管道容器x/y/width/height(默认 -10%~120%)
<image>嵌入位图/SVGhref/x/y/width/height/preserveAspectRatio
<foreignObject>内嵌 HTML(自动换行文本/表单)x/y/width/height
<a>超链接包裹图形href/target
<title>/<desc>无障碍名称/描述(title 须为首子元素)id(供 aria-labelledby)
<animate>SMIL 动画四件套attributeName/from/to/dur/begin/repeatCount/fill

二、d 命令速查

命令参数语义
M/mx y移动画笔(不画线);后续坐标对按 L/l 处理
L/lx y画直线
H/hx水平线
V/vy垂直线
C/cx1 y1 x2 y2 x y三次贝塞尔:两控制点 + 终点
S/sx2 y2 x y平滑三次:第一控制点 = 反射前一条 C/S 的第二控制点
Q/qx1 y1 x y二次贝塞尔:单控制点 + 终点
T/tx y平滑二次:控制点反射推断;单独用退化为直线
A/arx ry rot laf sf x y椭圆弧:两半径、x 轴旋转角、large-arc-flag、sweep-flag、终点
Z/z直线连回本子路径起点闭合

A 命令帮记:两点 + 两半径给出 4 条候选弧,large-arc-flag(1 大弧)与 sweep-flag(1 正角度方向/屏幕顺时针)四选一;半径不足会被自动放大。

三、关键属性与默认值速查

属性取值(默认加粗)备注
preserveAspectRatioxMidYMid meet | align + meet/slice | none无 viewBox 时被忽略
fill-rulenonzero | evenoddclipPath 内对应 clip-rule
stroke-linecapbutt | square | round端点样式
stroke-linejoinmiter | round | bevelmiter 受 stroke-miterlimit 限制
stroke-dasharray长度序列奇数个值整组复制补偶
text-anchorstart | middle | end相对 x 的锚定;垂直用 dominant-baseline
gradientUnitsobjectBoundingBox | userSpaceOnUse后者用于跨图形共享渐变
patternUnitsobjectBoundingBoxtile 占位参照系
patternContentUnitsuserSpaceOnUsetile 内容参照系——与上行默认不一致,招牌坑
clipPathUnitsuserSpaceOnUse | objectBoundingBox注意与 mask 默认相反
maskUnits / maskContentUnitsobjectBoundingBox / userSpaceOnUsemask 区域 / mask 内容
markerUnitsstrokeWidth | userSpaceOnUse默认随线宽缩放
spreadMethodpad | reflect | repeat渐变范围外的铺法
pointer-eventsvisiblePainted | all | none | bounding-box 等默认下 fill="none" 区域不可点
vector-effectnon-scaling-stroke缩放时保持线宽
transform-box(CSS)view-box | fill-box | stroke-box绕自身中心转的钥匙
xmlnshttp://www.w3.org/2000/svg独立 .svg 必须;HTML 内联可省

四、引入方式速查

方式JS 控内部CSS 控内部内部脚本缓存
inline <svg>完全完全执行随 HTML
<img> / CSS 背景禁用独立缓存
<object>同源 contentDocument不级联执行独立缓存
<use> sprite克隆树不可继承/CSS 变量穿透禁用sprite 可缓存(严格同源)

五、易错点清单

  • viewBox 只当「裁剪框」理解——它是坐标系映射;min-x 增大内容左移(新手常猜反)。
  • 无 viewBox 时 preserveAspectRatio 失效;无固有尺寸的 SVG 被 img/object 回退成 300×150
  • A 命令 flag 与坐标连写(0 0140 20)人读错;半径太小被自动放大不报错。
  • scale() 连描边一起放大 → vector-effect="non-scaling-stroke"
  • 旋转乱飞:属性 rotate 默认绕 (0,0);CSS 侧默认参考框不是自身 → transform-box: fill-box; transform-origin: center
  • use 覆盖失效:被引元素写死 fill/stroke 外部改不动——图标源文件用 currentColor/CSS 变量。
  • use 外部 sprite 跨域(CDN)直接不显示——严格同源、无 CORS 开关。
  • 「SMIL 已弃用」是误传:Chrome 弃用令已撤回,别说死。
  • createElement 造的 SVG 元素不渲染——必须 createElementNS
  • SVGO v3 及以前默认删 viewBox/title——手动禁用 removeViewBox。
  • <img> 引用的 SVG:脚本不执行、外部资源不加载——「本地正常、引用就坏」主因。
  • pattern 双 units 默认值不一致,tile 与内容坐标脱节。
  • clipPath 做不出半透明/羽化——要软边只能 mask。
  • 滤镜默认 region 只扩 10%,大模糊/长阴影被切边。
  • fill="none" 区域点击无效(visiblePainted)——热区用 pointer-events="all"。
  • presentation attribute 优先级最低,任何 CSS 都能覆盖 fill="red"
  • SVG 文本不自动换行——tspan 手动分行或 foreignObject 嵌 HTML。
  • 1px 描边骑在像素边界发虚;贴边图形描边被裁一半。
  • 多个 inline SVG 的 id 全局冲突(渐变互相串)——组件化加前缀/hash。
  • 服务器 MIME 不是 image/svg+xml → 加载失败。

六、权威链接