← 🔷 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 · 文本排版:<text> 不会自动换行

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

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

2 · stroke 对齐:只有「居中」,没有 inside / outside

SVG 的描边永远骑在路径中线上——一半在形状内、一半在形状外。设计工具 (Figma / Illustrator) 和 CSS border 都能选 inside / center / outside,SVG 却只给 center 一种,且没有多重描边。想要内描边 / 外描边,只能靠 clipPath / mask 把多出来的一半切掉。切三种对齐看差别(橙色细线 = 路径的真实几何边界):

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

3 · 其余缺口:偏机制层面,暂只能罗列

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

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

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