NEW 184601
CSS filter property with feColorMatrix on moving elements does not work
https://bugs.webkit.org/show_bug.cgi?id=184601
Summary CSS filter property with feColorMatrix on moving elements does not work
Alex Fallenstedt
Reported 2018-04-13 11:51:19 PDT
Created attachment 337912 [details] Safari - Video on top and image on bottom both using filter(#blue-tint) Hello, I am attempting to apply a filter color using an svg. I have discovered that this technique works well in Firefox, Chrome, but not Safari. You can see the example here: https://codepen.io/Fallenstedt/pen/OvYGjV I created an svg with an 'feColorMatrix' property to create a transparent blue overlay that I can use in the filter property of the video element. I have noticed that this technique works well if it's applied on a still image, like an <img> or a <video> placeholder, but does not get applied to the video.
Attachments
Safari - Video on top and image on bottom both using filter(#blue-tint) (305.50 KB, image/png)
2018-04-13 11:51 PDT, Alex Fallenstedt
no flags
Expected behavior - Video element and img both apply filter with svg (2.19 MB, image/gif)
2018-04-13 11:52 PDT, Alex Fallenstedt
no flags
Actual behavior - In Safari, video element ignores filter(#blue-tint) (2.33 MB, image/gif)
2018-04-13 11:54 PDT, Alex Fallenstedt
no flags
example comparing blue-wash SVG filter over video (398.64 KB, image/jpeg)
2022-02-15 10:46 PST, Stephen Bannasch
no flags
Alex Fallenstedt
Comment 1 2018-04-13 11:52:43 PDT
Created attachment 337913 [details] Expected behavior - Video element and img both apply filter with svg
Alex Fallenstedt
Comment 2 2018-04-13 11:54:22 PDT
Created attachment 337914 [details] Actual behavior - In Safari, video element ignores filter(#blue-tint) Video element on top, image element on bottom
Radar WebKit Bug Importer
Comment 3 2018-04-16 09:24:11 PDT
Alex Fallenstedt
Comment 4 2018-04-16 09:57:32 PDT
Further investigation proves that you can apply filters properly to still images. But if you attempt to apply a filter to a moving image, it breaks only in Safari.
Simon Fraser (smfr)
Comment 5 2018-04-16 10:00:32 PDT
The issue here is that WebKit doesn't support references to SVG filters when doing "accelerated" filters. This is a shame, since there's no way to do a color matrix via a CSS filter.
Alex Fallenstedt
Comment 6 2018-04-16 10:16:01 PDT
@smfr Am I not using a color matrix with an accelerated filter here? This example uses a still image that is turning blue and works perfectly on Safari. https://codepen.io/Fallenstedt/pen/pLMZwG A video does not produce a similar behavior on safari https://codepen.io/Fallenstedt/pen/OvYGjV
Simon Fraser (smfr)
Comment 7 2018-04-16 10:18:25 PDT
There are two filter codepaths; one for static content, and another if we call into the compositing ("accelerated") code path. The url(#foobar) stuff doesn't work in the second case.
Alex Fallenstedt
Comment 8 2018-04-16 10:22:11 PDT
@smfr Ah, that makes sense. Thank you for the clarification.
Alec Larson
Comment 9 2020-07-24 10:35:08 PDT
Here's another reproduction: https://codesandbox.io/embed/8zx4ppk01l
Stephen Bannasch
Comment 10 2022-02-15 10:20:27 PST
Also came across this bug trying to apply and svg feColorMatrix filter to an element containing a video. Works everywhere else.
Stephen Bannasch
Comment 11 2022-02-15 10:28:31 PST
Here's the very ugly hack I'm using to make something work on Safari: .fixed-video-container { visibility: visible; opacity: 1; filter: url(#blue-wash); @media not all and (min-resolution: 0.001dpcm) { @supports (-webkit-appearance: none) { filter: sepia(100%) hue-rotate(145deg) saturate(400%) brightness(100%) contrast(25%); } } }
Stephen Bannasch
Comment 12 2022-02-15 10:46:02 PST
Created attachment 452051 [details] example comparing blue-wash SVG filter over video To get some equivalent on Safari. html: <svg> <filter id="blue-wash"> <feColorMatrix type="matrix" values="0.36 0 0 0 0 0 0.75 0 0 0 0 0 0.82 0 0 0 0 0 0.2 0" /> </filter> </svg> css: .fixed-video-container { visibility: visible; opacity: 1; filter: url(#blue-wash); @media not all and (min-resolution: 0.001dpcm) { @supports (-webkit-appearance: none) { filter: sepia(100%) hue-rotate(145deg) saturate(400%) brightness(100%) contrast(25%); } } }
Simon Fraser (smfr)
Comment 13 2022-02-15 10:47:52 PST
You'll generally get better performance when animating the CSS filter properties, so it's better to use those than referencing SVG filters.
Stephen Bannasch
Comment 14 2022-02-15 10:51:16 PST
(In reply to Simon Fraser (smfr) from comment #13) > You'll generally get better performance when animating the CSS filter > properties, so it's better to use those than referencing SVG filters. It's hard to get the color of the blue-washed filtering my client wants for the video using just the CSS properties. I can get close but the SVG filter can easily get to the look they want. The image attachment shows the difference.
Yehonatan Daniv
Comment 15 2022-05-01 05:06:00 PDT
@smfr it seems that Webkit is unable to render *any* <*-source> effect on Video, be it mask, clip-path, filter, etc. This has been broken for a long time now, and some already work in other browsers, i.e: filter and clip-path work in Gecko and Blink. Gecko also renders mask. Is there a chance we can get this path fixed?
Felix Niklas
Comment 17 2025-08-25 03:19:10 PDT
I ran into this bug when finishing a website with duotone effect for images and videos. The videos are short animations that I wanted to include as videos to optimize loading time. I found out that the SVG filter works on gifs in Safari so I'll convert the animations to gifs.
Note You need to log in before you can comment on or make changes to this bug.