使用数据编码的SVG作为CSS滤镜

11

也许有人能指出我的测试中的错误,但是看起来如果我想在CSS中使用SVG滤镜并将其编码为data: uri以避免使用其他文件,那么如果数据没有被编码为base64,则会失败。

我已经在Firefox Aurora上进行了测试,其他浏览器似乎都无法识别这个滤镜。

测试文件:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style type="text/css">

#filter1 {
filter:url(data:image/svg+xml,<svg xmlns%3D"http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg"><filter id%3D"desaturate"><feColorMatrix type%3D"saturate" values%3D"0"%2F><%2Ffilter><%2Fsvg>#desaturate);
}

#filter2 {
filter:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxmaWx0ZXIgaWQ9ImRlc2F0dXJhdGUiPjxmZUNvbG9yTWF0cml4IHR5cGU9InNhdHVyYXRlIiB2YWx1ZXM9IjAiLz48L2ZpbHRlcj48L3N2Zz4%3D#desaturate);
}

</style>
</head>
<body>
<p style="color:red" id=filter1>Filter applied "as is"</p>
<p style="color:red" id=filter2>This one is encoded as base64</p>
</body>
</html>

http://martinezdelizarrondo.com/bugs/svgfilter.html上有实时演示。

无论是哪种情况,url()的内容都是相同的:

<svg xmlns="http://www.w3.org/2000/svg"><filter id="desaturate"><feColorMatrix type="saturate" values="0"/></filter></svg>

使用http://software.hixie.ch/utilities/cgi/data/data编码。

正如您所看到的,第一个保持为红色,但在第二种情况下应用了SVG滤镜并且文本变成了灰色。

我在第一种情况下忘记了什么吗?

此错误中,我没有找到有关编码的任何信息,因此我认为这应该是可能的(而且明显使用更简单的文本编码比使用base64“加密”更好)。

谢谢

1个回答

12

经过多次尝试和错误,我发现对数据使用转义是有效的,现在我们只需要等待其他浏览器实现对其的支持。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style type="text/css">

#filterBase64 {
    filter:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxmaWx0ZXIgaWQ9ImRlc2F0dXJhdGUiPjxmZUNvbG9yTWF0cml4IHR5cGU9InNhdHVyYXRlIiB2YWx1ZXM9IjAiLz48L2ZpbHRlcj48L3N2Zz4%3D#desaturate);
}

#filterEscape {
    filter:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Cfilter%20id%3D%22desaturate%22%3E%3CfeColorMatrix%20type%3D%22saturate%22%20values%3D%220%22/%3E%3C/filter%3E%3C/svg%3E#desaturate);
}

</style>
</head>
<body>
<p style="color:red" id=filterBase64>This one is encoded as base64</p>
<p style="color:red" id=filterEscape>Filter encoded with "escape()"</p>
<p style="color:red" id=filterScript>This one is applied with javascript</p>
<script>
document.getElementById("filterScript").style.filter="url(data:image/svg+xml," + escape('<svg xmlns="http://www.w3.org/2000/svg"><filter id="desaturate"><feColorMatrix type="saturate" values="0"/></filter></svg>') + "#desaturate)";
</script>
</body>
</html>

我知道这是老东西了,但Chrome确实支持类似的东西,IE也使用各种过滤器语法:http://www.html5rocks.com/en/tutorials/filters/understanding-css/. FF需要文件路径,Chrome可以支持新的filter属性,而IE则使用旧的属性 :) 更多好的信息在这里:http://stackoverflow.com/questions/13695176/referencing-in-page-svg-in-chrome - Jamund Ferguson
还有其他人注意到这个不再起作用了吗?background-image: url(data...)可以正常工作,但是将相同的data...放入filter: url(data...)中,就会出现Unsafe attempt to load URL...错误。 - rojobuffalo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接