CSS 与布局 / 🔷 SVG × CSS:一块能被 CSS 管的画布 / SVG 还缺什么 待审核 9 / 9
gaps · SVG 还缺什么

SVG 还缺什么

前面各页讲的都是浏览器里已经跑得通的机制,也就是 SVG 在「能被 CSS 驱动」这件事上做得到的部分。本页换个视角:Patrick Brosset 综合 Chromium bug tracker 高票 issue、Interop 提案、State of CSS 2025 调查与社媒反馈,整理出开发者眼中 SVG 仍然缺失的若干能力(见 What's missing from SVG)。其中能在浏览器里当场实测的两项(文本换行、stroke 对齐)做成了下面的 demo,其余偏机制层面的缺口随后罗列。

建议 · 读这份清单前先分清哪些是本系列已经解释过的。文章列出的若干诉求,本系列其他页已正面讲过——外部 SVG 资源主题化见 param() 提案,响应式尺寸与 viewBox 见 viewBox 相机<use> 复用与 shadow 边界见嵌入矩阵z-index 缺失见嵌入矩阵的反直觉特性。本页只补上那些现有机制无法解释、确实还缺的部分。

1 · 文本排版不会自动换行

SVG 的 <text> 把整段文字画成一条不折行的线:超出边界既不换行也不省略,要分行只能手动拆成多个 <tspan> 并逐行算 y。这让本地化(不同语言长度不一)与无障碍都相当困难。目前唯一可靠的「框内可换行文本」办法,是把一段 HTML 塞进 <foreignObject> 借用 CSS 的换行能力。

图 1-1 · 可拖框宽,对照 text 与 foreignObject 两者的换行表现。

警示 · <foreignObject> 自身也在缺口清单上。它能把可换行的 HTML 嵌进 SVG,却长期被 interop 问题困扰:transform 下的定位、裁剪、在不同引擎里的渲染差异都不一致,因此很多人不敢在生产里依赖它。图 1-1 右侧的渲染结果由当前浏览器实测得出(探针见 verdict),换个引擎未必一致。

2 · stroke 只有居中对齐

SVG 的描边永远骑在路径中线上——一半在形状内、一半在形状外。设计工具(Figma、Illustrator)和 CSS border 都能选 inside、center、outside,SVG 却只给 center 一种,且没有多重描边。想要内描边或外描边,只能靠 clipPathmask 把多出来的一半切掉。

图 2-1 · 可切三种对齐看差别,橙色细线是路径的真实几何边界。

注 · 这两种模拟都是 hack:inside 把描边宽度翻倍、再用形状自身作 clip-path 裁掉外半;outsidemask 挖掉内部区域只留外半。两者都得多写一个 <clipPath><mask>,且圆角、自交、虚线等情形容易出错。曾有 stroke-alignment 的提案,在 SVG2 草案阶段引入又移除,至今没有原生属性(核对于 2026-08)。

3 · 其余机制层面的缺口

下面几项更深、难用一个小 demo 说清,文章把它们列为 SVG 当前主要的演进方向。

表 3-1 · 六项机制层面的缺口与现状。
缺口 开发者痛点 现状 / 方向
性能可预期性 filter、大量节点、动画的渲染开销不透明,担心耗电而主动回避 SVG 特性。 缺保证
动画与 morphing 路径与形状插值难写;SMIL 半废弃、CSS 能力有限,实务多依赖 JS 库。 演进中
geometry 与可编程性 path 数据的解析与操作缺现代 API;多重描边、stroke 对齐同属此类。 部分提案
复杂图形无障碍 ARIA graphics roles 支持不一致,图表与信息图的语义关系难表达,常靠 workaround。 支持不一
一致的 CSS 集成 期望 z-indexcalc()、filter、blend mode 等在 SVG 内与普通 CSS 行为一致。 逐步对齐
interop 与演进 长期 spec 缺口与实现差异侵蚀开发者对平台的信任,需要可见的进展。 Interop 项目

数据来源:Chromium bug tracker 高票 issue、Interop 提案、State of CSS 2025、社媒反馈,由 Patrick Brosset 综合整理。