跳到主要内容

Chromium-Gecko-WebKit差异清单

版本数字会过期。下表记 机制差异,以你构建当天的 Chrome / Firefox / Safari / iOS Safari 实测为准。三项深挖见 SMIL、foreignObject 与文本

探测写 detectSvgCaps(),不要 if (safari && version < 17)

1. foreignObject

能力ChromiumGeckoWebKit
inline SVG 里嵌 HTML可用可用可用,尺寸/overflow 边角多
独立 .svg 里的 HTML要 XHTML 命名空间同;缺 xmlns 常空白
出现在 <use> 影子树剥掉,不渲染常能克隆剥掉
宽高只写 CSS、不写属性有时能排更依赖属性 width/height属性缺失易塌

共同:<img> / CSS background 里的 foreignObject 不当可交互 HTML 用。用户上传必须剥 FO,见 08

2. text 折行

项目差异
SVG 2 inline-size三引擎 都未 当浏览器折行实现。设计工具能写,浏览器当没看见
&lt;text> + white-space: pre + 源码换行Gecko 会折;Chromium / WebKit 通常仍一行
可移植折行自己用 tspan + dy,或 inline 里 foreignObject + HTML(接受 FO 差异)
getComputedTextLength / 中英混排字体 fallback 宽度不能当快照金标,同 Canvas 文字

3. 外部 use

项目ChromiumGeckoWebKit
同文档 href="#id"
外部 href="sprite.svg#icon"同源或 CORS 常可用可用,CORS 严经常失败;iOS 更差
&lt;use> 内再 FO / SMILFO 被剥;不要依赖不要当可移植FO 被剥

生产图标:sprite inline 进文档use,或直接 inline path。不要把跨文件 use 当唯一加载器。xlink:href 仅给旧文件;新代码 href

4. getBBox 与描边

默认 getBBox()填充几何,不含 stroke / markers(SVG 2 选项默认 stroke: false)。

引擎{ stroke: true }
Chromium长期忽略或不全,当 fill 盒
Gecko近年开始认 SVGBoundingBoxOptions
WebKit当 fill 盒

手柄、框选、虚拟化 AABB:自己用几何盒膨胀 stroke-width/2(再加 miter)。不要跨引擎对拍 ink 像素。clipped / markers 同样不能当可移植。元素 display: none 或不在树上时行为不稳定,见 绘制顺序

5. CSS 几何属性

SVG 2 把 cx / cy / r / x / y / width / height / d 等做成几何属性,CSS 可覆盖 attribute。

项目ChromiumGeckoWebKit
cx / r 当 CSS 并动画常见可用常见可用有,单位/动画边角
d 当 CSS较早到得晚不要默认能 morph
无单位数字属性 OK;CSS 有的引擎要单位CSS 常要单位

应用 UI 可移植通道仍是 transform 的 CSS / WAAPI。几何 CSS 当增强,写探测,失败则写 attribute。

6. SMIL 细节

三引擎 2026 都能跑 animate / animateTransform / animateMotion。Chromium 2015 弃用意向已于 2016 暂停。不要写「已死」。

项目差异
自包含 + <img>三引擎都能跑文件内 SMIL;这是它的岗位
syncbase(begin="a.end"Gecko 最完整;Chromium 有历史边角
animateTransform vs CSS transform双通道会抢;生产只留一条
rotate="auto" motion大体可用;复杂 path / 反向要实测

应用 UI 仍优先 CSS / WAAPI。用户上传剥 SMIL,见 SMIL 与属性动画

7. 其它会踩的

项目差异
transform-box / origin必须显式写;默认从 0 0 向 HTML 中心靠,历史包袱还在
vector-effect生产只用 non-scaling-stroke;其余 SVG 2 at-risk
Android WebView随厂商内核,不能用 Chrome 版本号推断

失败形态

症状原因
精灵图只在 Safari 空白外部 &lt;use href="file.svg#id">;应改同文档 sprite
只有 Firefox 多行文字把 Gecko white-space: pre 当成了 SVG 2 折行
手柄/框选比墨迹小一圈getBBox({ stroke: true }) 被忽略,当 fill 盒
Chrome 圆会呼吸,Safari 不会r 当 CSS 动画,未探测、未降级写 attribute
卡片 HTML 在 Chrome 消失、Firefox 还在foreignObject 进了 &lt;use> 影子树

权威资料

核对日期:2026-08-26