为什么style属性内的内联SVG滤镜无法生效且Safari不兼容?
Safari不兼容内联data URI SVG滤镜的原因
- Safari对data URI的语法校验比Chrome、Firefox严格很多,CSS中用来折行的反斜杠
\会被Safari识别为URI内容的一部分,直接破坏SVG的结构解析 - 未做百分号编码的特殊字符(比如
<、>、双引号、空格)在Safari的data URI中不会被自动容错解析,会导致SVG解析失败 - Safari要求作为滤镜使用的SVG必须显式声明
width和height属性,哪怕是不需要显示的隐藏SVG,缺失这两个属性会直接判定资源无效 - 部分版本的Safari存在引号嵌套解析bug,data URI外层用单引号包裹时,内部SVG的双引号会被误判为URI的结束标记
修复方案
方案1:修正data URI写法(兼容Safari)
按以下规则调整你的CSS代码:
- 移除所有折行用的反斜杠,把整个data URI内容整合成一行
- 对SVG内所有特殊字符做百分号编码:
<转%3C、>转%3E、双引号转%22、空格转%20 - 给SVG根标签添加
width="0" height="0"属性
修正后的代码示例:
div.wp-grid-builder.wpgb-grid-1.wpgb-enabled div.wpgb-card-media-thumbnail { filter: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%220%22%20height%3D%220%22%3E%3Cfilter%20id%3D%22multitone_filter_1%22%3E%3CfeColorMatrix%20type%3D%22matrix%22%20color-interpolation-filters%3D%22sRGB%22%20values%3D%220.3333%200.3333%200.3333%200%200%200.3333%200.3333%200.3333%200%200%200.3333%200.3333%200.3333%200%200%200%200%200%201%200%22%3E%3C%2FfeColorMatrix%3E%3CfeComponentTransfer%20color-interpolation-filters%3D%22sRGB%22%3E%3CfeFuncR%20type%3D%22table%22%20tableValues%3D%220.4117647058823529%200.0392156862745098%200.9647058823529412%22%3E%3C%2FfeFuncR%3E%3CfeFuncG%20type%3D%22table%22%20tableValues%3D%220.7490196078431373%200.054901960784313725%200.8901960784313725%22%3E%3C%2FfeFuncG%3E%3CfeFuncB%20type%3D%22table%22%20tableValues%3D%220.6039215686274509%200.058823529411764705%200.5803921568627451%22%3E%3C%2FfeFuncB%3E%3C%2FfeComponentTransfer%3E%3C%2Ffilter%3E%3C%2Fsvg%3E%23multitone_filter_1'); }
方案2:全局内联SVG滤镜(更推荐,解决动态刷新失效问题)
针对你遇到的facet激活后滤镜失效、无缓存的问题,直接把滤镜代码作为全局隐藏元素插入页面即可,兼容性更好,也不需要处理复杂的编码:
- 在服务端生成页面时,把SVG滤镜代码插入到
<body>标签的最开头,设置为隐藏:
<svg xmlns="http://www.w3.org/2000/svg" width="0" height="0" aria-hidden="true" style="position: absolute; left: -9999px; top: -9999px;"> <filter id="multitone_filter_1" color-interpolation-filters="sRGB"> <feColorMatrix type="matrix" values="0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"/> <feComponentTransfer> <feFuncR type="table" tableValues="0.4117647058823529 0.0392156862745098 0.9647058823529412"/> <feFuncG type="table" tableValues="0.7490196078431373 0.054901960784313725 0.8901960784313725"/> <feFuncB type="table" tableValues="0.6039215686274509 0.058823529411764705 0.5803921568627451"/> </feComponentTransfer> </filter> </svg>
- CSS直接引用滤镜ID即可,不需要data URI:
div.wp-grid-builder.wpgb-grid-1.wpgb-enabled div.wpgb-card-media-thumbnail { filter: url(#multitone_filter_1); }
这个方案不存在缓存问题,动态加载的网格元素也能正常识别全局滤镜ID,所有主流浏览器都兼容。
内容的提问来源于stack exchange,提问作者Adam Alleman
相关产品推荐
相关产品推荐

