详细介绍SVG在各浏览器中的兼容性情况,以及如何处理旧浏览器兼容问题。提供实用的SVG兼容性解决方案和fallback策略。 好消息是:现代浏览器对 SVG 的支持已经非常好了。坏消息是:你可能还要处理一些边缘情况。
| 浏览器 | 支持版本 | 备注 |
|---|---|---|
| Chrome | 4+ | 完全支持 |
| Firefox | 3+ | 完全支持 |
| Safari | 3.2+ | 完全支持 |
| Edge | 12+ | 完全支持 |
| IE 9-11 | 部分支持 | 基本功能OK,滤镜有问题 |
| IE 8 及以下 | 不支持 | 需要 polyfill |
| 浏览器 | 支持版本 |
|---|---|
| iOS Safari | 3.2+ |
| Android Browser | 3+ |
| Chrome for Android | 完全支持 |
| UC Browser | 基本支持 |
结论:如果不需要支持 IE8,可以放心使用 SVG。IE9-11 支持大部分功能,只有高级特性(如某些滤镜)有问题。
矩形、圆形、椭圆、线条、多边形、路径——这些核心功能在所有支持的浏览器中都没问题。
线性渐变和径向渐变支持良好,但 IE9-10 不支持渐变动画。
滤镜是兼容性问题的重灾区。IE 完全不支持 SVG 滤镜。
| 滤镜 | Chrome | Firefox | Safari | IE |
|---|---|---|---|---|
| feGaussianBlur | ✓ | ✓ | ✓ | ✗ |
| feDropShadow | ✓ | ✓ | ✓ | ✗ |
| feColorMatrix | ✓ | ✓ | ✓ | ✗ |
SMIL 动画
Chrome 曾经要移除 SMIL 支持,后来又保留了。目前主流浏览器都支持,但 IE 不支持。
SMIL 动画(IE 不支持)
CSS 动画
用 CSS 动画操作 SVG 属性是更稳妥的选择,兼容性更好。
@keyframes pulse {
0%, 100% { r: 20; }
50% { r: 40; }
}
circle {
animation: pulse 1s infinite;
}
裁剪路径支持良好,但 mask 在 IE 中不支持。
用 JavaScript 检测浏览器是否支持某个功能:
function supportsSVG() {
return !!document.createElementNS
&& !!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect;
}
if (!supportsSVG()) {
// 降级处理
}
为不支持 SVG 的浏览器提供 PNG 备用图:
<picture>
<source type="image/svg+xml" srcset="logo.svg">
<img src="logo.png" alt="Logo">
</picture>
或者用 object 标签:
<object type="image/svg+xml" data="logo.svg">
<img src="logo.png" alt="Logo">
</object>
Modernizr 库提供了完善的特性检测:
if (Modernizr.svg) {
// 支持 SVG
} else {
// 不支持,加载 PNG
}
对于必须支持 IE6-8 的项目,可以用 svgweb:
<script src="svg.js"></script>
它会用 Flash 或 VML 来模拟 SVG。
IE 不支持 <use xlink:href="external.svg#icon"> 这种方式。
解决方案:把 SVG 内联到 HTML 中,或者用 JS 加载后插入。
IE 的 getBBox() 方法有问题。
解决方案:用 getBoundingClientRect() 代替。
Safari 对颜色格式要求严格,#rgb 可能不认。
解决方案:统一用 #rrggbb 或 rgb() 格式。
Firefox 对跨域 SVG 资源有限制。
解决方案:确保资源同源,或配置 CORS。