SVG 编辑器与解读
SVG Editor and Explainer
一边在实时渲染旁边改 SVG,一边解释这个文件:viewBox 与缩放、变换、每一条路径命令、继承来的填色、白白占地方的字节,以及它在 <img>、data URI 和内联三种用法下各会坏在哪里。
在渲染结果旁边编辑 SVG,并读一个面板,它说的是这个文件实际是什么:它会不会缩放,每个 transform 在向下传到形状的路上做了什么,d 属性逐条命令拼出了什么,一个 fill 如何经由继承解析出来,编辑器残留占了多少字节,以及同一个文件被用作 <img>、CSS 背景或内联粘贴时各会坏在哪里。每条发现都指向它所针对的那个属性。它是一组作用于解析后文件的规则,不是一个模型,所以它报告那里有什么,从不猜这个文件是干什么用的。
SVG 源码
放一个 .svg 文件进来
在这个标签页里读。什么都不上传。
在这里打字,预览会跟着走。在预览里点一个图形,源码就跳到它那个元素。
预览
能点的虚线框只盖住那些光看文件就能算出盒子的图形。<text>、<use> 和没有尺寸的 <image> 得有渲染器才知道,所以它们要从源码里选。
预览画的是从解析出来的树重新拼出来的标记,放在沙箱框里——从来不是你的原始字节。这个框是固定大小的盒子,整块都交给这个文件,所以一个没法缩放的文档,填不满这个盒子是看得见的。
字节
395
元素
5
图形
3
路径命令
10
最深嵌套
1
这个文件是什么
- 说明画框
有尺寸,也能缩放
width="24" 和 height="24" 给了它固有尺寸,而 viewBox="0 0 24 24" 让这个尺寸成为起点而不是上限。在 CSS 里给它换个宽度,里面的一切都会按比例重新缩放。图标要的就是这种。
- 说明坐标
一个用户单位值多少
里面的坐标横向从 0 到 24,纵向从 0 到 24。按声明的宽度 24,一个用户单位画出来是 1个 CSS 像素——而这个数会随文件实际拿到的尺寸变化。
- 说明路径
绝对命令和相对命令混在一起
同一条路径里有 3条绝对命令和 6条相对命令。两种都合法,画出来的形状也一样;实际的区别在于,全用相对命令写的路径只改第一个 M 就能整体挪动,而这一条不行。
- 说明上色
currentColor:颜色由页面决定
有 1个属性用 currentColor 上色。currentColor 会解析成 SVG 所在位置继承到的 CSS `color` 属性。内联在页面里时,这正是图标想要的:跟着周围文字的颜色走,切换主题也自动跟上。但当作 <img> 或 CSS background-image 使用时,它没有可以继承的元素,什么也解析不到,结果就是黑色。
- 说明无障碍
名称:「보관함에 저장」
<title> 是图形的无障碍名称,大多数查看器在鼠标悬停时还会把它当提示显示出来——所以把文件名写进 <title> 还不如不写。这里写的是「보관함에 저장」。
- 说明无障碍
没有 <desc>
<title> 是简短的名字;<desc> 是给内容本身很重要的图形——图表、示意图、地图——写的较长说明。图标用不着,加一个空的 <desc> 比不加还糟。
选中的元素
在预览里点一个图形,或者把光标放进源码里的某个元素。
怎么用
粘贴 SVG,或拖入文件
源码框接受粘贴,拖放区接受 .svg。一切都在这个标签页里读取。两个窗格上方的四个示例值得先点一下:每个都是一种不同形态的真实文件,报告对每一个说的都不一样。
先读“画框”一节
它说明这个文档是四种形态中的哪一种,这决定了后面的大部分内容。有 viewBox 又有 width 和 height 的会缩放,并且有自己的尺寸;只有 viewBox 的会填满给它的任何盒子;有 width 和 height 却没有 viewBox 的根本不缩放,这就是从设计工具里复制出来的图标常常拒绝改变大小的原因。预览给文件一个固定的盒子,所以你能看出它是哪一种。
点一个形状让两个窗格对齐
在预览里点一个轮廓,光标会落到源码里那个元素上,元素面板随之填满:从最外层元素向下的 transform 链、累积矩阵做了什么、经由继承解析出来的绘制属性,以及对于路径,每条命令的白话解释。在源码里移动光标,则反向选中。
用“显示给我看”按钮,不要搜索
每条发现都带着它所针对的源码范围,所以上面的按钮会精确选中那些字符——是带重复 id 的第二个渐变而不是第一个,是那一个属性而不是包着它的标签。
把大小方面的发现带去优化器
大小一节数字节并点名它们是什么——编辑器元数据、一个没用到的渐变、没人选过的七位小数——但这个工具不改写你的文件。SVG 优化器对整个文档一次做完那一遍,并显示前后差异,你能确认没有东西移位。
常见问题
为什么我在 CSS 里设了宽度,图标却不变大?
几乎总是因为文件有 width 和 height 却没有 viewBox。没有它,用户单位就是 CSS 像素,浏览器没有任何映射可以用来重新缩放——盒子变大了,画的东西留在原地。“画框”一节会说明这一点,并给出要加的那个 viewBox,通常是“0 0 <width> <height>”,数字就用文件里已有的。
我内联了两个图标,第二个丢了渐变。为什么?
它们的 id 撞了。设计工具生成 a、Layer_1 和 SVGID_1_ 这样的名字,两个文件一进同一个页面,每个 url(#a) 都解析到文档里先出现的那个——所以第二个图标悄悄借用了第一个的渐变或裁剪路径。可移植性一节标出导出器生成的 id,正是为了这个。内联之前给每个 id 加上这个文件独有的前缀。
文件在我的页面上正常,作为 CSS 背景却渲染成空白。变了什么?
有三处不同,报告会点出适用的那一处。缺 xmlns 在 HTML 解析器里被宽恕,在其他任何地方都是致命的。currentColor 在页面之外没有东西可以继承,所以变成黑色。在 <img> 或 background-image 里外部引用根本不会被抓取,所以需要它们的元素什么都画不出来。另外,十六进制颜色里的 # 会截断 data URI,除非写成 %23。
我路径里的一个洞被填成了实心。要把它移开吗?
不要——把它反向。在默认的 fill-rule="nonzero" 下,内圈只有在绕行方向和包着它的圈相反时才是洞,所以一个被填实的洞是方向问题,不是位置问题。路径一节会说明有多少个子路径以及哪条规则在起作用。反转一个子路径是 SVG 路径工具做的事。
它在别人发给我的文件里发现了 <script>。危险吗?
这完全取决于文件去哪里,报告会说明是哪种情况。内联粘进页面时,SVG 的脚本以那个页面的源运行——它的 cookie、它的存储、它的 DOM。作为 <img> 或 CSS 背景加载时,它根本不运行。这里的预览在渲染之前已经把它移除,渲染所在的框架无论如何都不能运行脚本,所以不管怎样,在这个工具里查看这个文件是安全的。
为什么绘制面板和我看到的不一致?
因为文件里有 <style> 块,而这份报告不应用它。解析 CSS 选择器需要一个 CSS 引擎;这里引用的每个值都只来自表现属性和内联样式。凡是存在 <style> 块的地方,报告都会说明,而不是悄悄显示一个已被样式表覆盖的值。
可以从这些接进来
颜色拾取器
Colour Picker
在 OKLCH 色板上选色,也可以用屏幕吸管或从上传的图片里取色,并按任意表示法复制出来。
颜色格式转换
Colour Format Converter
在 HEX、RGB、HSL、HWB、LAB、LCH 和 OKLCH 之间换算同一个颜色,并给出最接近的已知色名。
CSS 渐变生成
CSS Gradient Builder
拖动色标做出线性、径向和锥形渐变,并按 sRGB 或 OKLCH 输出 CSS。
CSS 阴影生成
Box Shadow Generator
一边预览一边叠多层盒阴影和文字阴影,并导出对应的 CSS。
接下来
这些工具吃得下当前工具的产出,结果可以直接送过去。
SVG 转 CSS 数据 URI
SVG to CSS Data URI
把 SVG 编码成可用作 CSS 背景的 data URI,只转义非转义不可的字符,把体积压到最小。
SVG 优化压缩
SVG Optimiser
清掉编辑器留下的冗余、合并变换、缩减路径精度,并把渲染结果并排对比。
SVG 路径编辑器
SVG Path Editor
在绝对和相对命令之间转换路径数据,做平移、缩放、旋转和方向反转,并显示包围盒和实时预览。
SVG 转 PNG
SVG to PNG
按任意倍率把 SVG 渲染成 PNG、JPEG 或 WebP,背景可透明也可填色。
颜色格式转换
Colour Format Converter
在 HEX、RGB、HSL、HWB、LAB、LCH 和 OKLCH 之间换算同一个颜色,并给出最接近的已知色名。
颜色拾取器
Colour Picker
在 OKLCH 色板上选色,也可以用屏幕吸管或从上传的图片里取色,并按任意表示法复制出来。