SVG 过滤器不适用于 Firefox 中的 canvas,无论是通过上下文还是通过样式
SVG filter does not work with canvas in Firefox, neither via context nor via style
我想使用 canvas' 上下文 https://wiki.mozilla.org/CanvasFilters#Using_a_SVG_reference 或将过滤器放入 CSS 样式来过滤 <canvas>
的内容:
<!DOCTYPE html>
<html>
<body>
<svg style="display:none;">
<filter id="color-filter">
<feColorMatrix type="matrix" values="0.5 0.5 0.5 0 0 0.3 0.3 0.3 0 0 0.3 0.3 0.3 0 0 0 0 0 1 0"/>
</filter>
</svg>
<canvas id="myCanvas" width="200" height="100" style="border:1px solid #d3d3d3; filter: url(#color-filter)">
Your browser does not support the HTML canvas tag.</canvas>
<script>
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
// Create gradient
ctx.filter = "url(#color-filter)";
var grd = ctx.createLinearGradient(0,0,200,0);
grd.addColorStop(0,"yellow");
grd.addColorStop(1,"cyan");
// Fill with gradient
ctx.fillStyle = grd;
ctx.fillRect(10,10,150,80);
</script>
</body>
</html>
Fiddle: https://jsfiddle.net/s1dw74u3/
在 Chrome 中,两种解决方案都有效,因此上面的代码应用了两次过滤器。在 Firefox 中,none:上下文过滤器被忽略,样式过滤器使 canvas 完全消失。
如何以便携的方式应用这样的过滤器?
据我所知,您的过滤器在 Chrome 中不起作用。不同之处在于,当过滤器不起作用时,Firefox 不显示任何内容,而 Chrome 显示未过滤的图像。
如果您想同时修复 Firefox 和 Chrome,请停止使用显示:none 和 SVG。如果您需要隐藏某些内容,请使用 width="0" 和 height="0"
<!DOCTYPE html>
<html>
<body>
<svg width="0" height="0">
<filter id="color-filter">
<feColorMatrix type="matrix" values="0.5 0.5 0.5 0 0 0.3 0.3 0.3 0 0 0.3 0.3 0.3 0 0 0 0 0 1 0"/>
</filter>
</svg>
<canvas id="myCanvas" width="200" height="100" style="border:1px solid #d3d3d3; filter: url(#color-filter)">
Your browser does not support the HTML canvas tag.</canvas>
<script>
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
// Create gradient
ctx.filter = "url(#color-filter)";
var grd = ctx.createLinearGradient(0,0,200,0);
grd.addColorStop(0,"yellow");
grd.addColorStop(1,"cyan");
// Fill with gradient
ctx.fillStyle = grd;
ctx.fillRect(10,10,150,80);
</script>
</body>
</html>
我想使用 canvas' 上下文 https://wiki.mozilla.org/CanvasFilters#Using_a_SVG_reference 或将过滤器放入 CSS 样式来过滤 <canvas>
的内容:
<!DOCTYPE html>
<html>
<body>
<svg style="display:none;">
<filter id="color-filter">
<feColorMatrix type="matrix" values="0.5 0.5 0.5 0 0 0.3 0.3 0.3 0 0 0.3 0.3 0.3 0 0 0 0 0 1 0"/>
</filter>
</svg>
<canvas id="myCanvas" width="200" height="100" style="border:1px solid #d3d3d3; filter: url(#color-filter)">
Your browser does not support the HTML canvas tag.</canvas>
<script>
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
// Create gradient
ctx.filter = "url(#color-filter)";
var grd = ctx.createLinearGradient(0,0,200,0);
grd.addColorStop(0,"yellow");
grd.addColorStop(1,"cyan");
// Fill with gradient
ctx.fillStyle = grd;
ctx.fillRect(10,10,150,80);
</script>
</body>
</html>
Fiddle: https://jsfiddle.net/s1dw74u3/
在 Chrome 中,两种解决方案都有效,因此上面的代码应用了两次过滤器。在 Firefox 中,none:上下文过滤器被忽略,样式过滤器使 canvas 完全消失。
如何以便携的方式应用这样的过滤器?
据我所知,您的过滤器在 Chrome 中不起作用。不同之处在于,当过滤器不起作用时,Firefox 不显示任何内容,而 Chrome 显示未过滤的图像。
如果您想同时修复 Firefox 和 Chrome,请停止使用显示:none 和 SVG。如果您需要隐藏某些内容,请使用 width="0" 和 height="0"
<!DOCTYPE html>
<html>
<body>
<svg width="0" height="0">
<filter id="color-filter">
<feColorMatrix type="matrix" values="0.5 0.5 0.5 0 0 0.3 0.3 0.3 0 0 0.3 0.3 0.3 0 0 0 0 0 1 0"/>
</filter>
</svg>
<canvas id="myCanvas" width="200" height="100" style="border:1px solid #d3d3d3; filter: url(#color-filter)">
Your browser does not support the HTML canvas tag.</canvas>
<script>
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
// Create gradient
ctx.filter = "url(#color-filter)";
var grd = ctx.createLinearGradient(0,0,200,0);
grd.addColorStop(0,"yellow");
grd.addColorStop(1,"cyan");
// Fill with gradient
ctx.fillStyle = grd;
ctx.fillRect(10,10,150,80);
</script>
</body>
</html>