检测浏览器对 CSS 动画 SVG 的支持

Detect browser support for CSS-animated SVG

我正在玩弄 CSS-动画 SVG 元素并遇到了一个问题,即即使使用的所有技术都被某些浏览器支持,但组合并不支持,即 CSS-动画 DIV 有效,但 SVG 元素无效。我想知道是否有一种方法可以检测浏览器是否能够使用 CSS.

SVG 元素进行动画处理

Here is a jsFiddle 举个例子。它适用于最新版本的 Chrome、Firefox 和 Safari。但是当用例如打开它时Firefox 5 只有 div 旋转而 rect 不旋转。

我没有完全按照您的要求进行操作,但做了类似的操作(在浏览器支持时提供由 SVG 定义的动画剪辑路径,在浏览器不支持时回退)。您可以使用媒体查询寻找像素比率来确定浏览器是 moz 还是 webkit,并在媒体查询之外提供回退动画,并在媒体查询中提供首选动画,以指示将支持它的浏览器。

//fallback animation here

@media (-webkit-min-device-pixel-ratio: 0) {
  // webkit animation here 
}

至于旧版本的 Firefox?我不知道如何在 CSS 中执行此操作,但我不确定返回多个版本的 Firefox 或 Chrome 是一个常见的用例。

我相信 modernizr 中的 SMIL 动画检测应该可以做到。 https://modernizr.com/download?smil-setclasses

我在一组非常复杂的 css/SVG 图表动画中使用它。只需在以下标记中包装回退:

.no-smil{    }

http://codepen.io/msbtterswrth/pen/greWzy

I am wondering if there is a way to detect if a browser is capable of animating SVG elements using CSS

简单回答:是的,你可以如@jhpratt 所述。

您可以检测浏览器是否支持 CSS- 仅 CSS 的功能。 @supports CSS at 规则允许您指定依赖于浏览器对一个或多个特定 CSS 功能的支持的声明。这称为特征查询。

示例:

@supports (display: flex) {
  div {
    display: flex;
  }
}
@supports not (display: flex) {
  div {
    float: right;
  }
}

MDN Link:https://developer.mozilla.org/de/docs/Web/CSS/@supports

长答案:

您总会遇到一些 cross-browser 问题。 您遇到的问题困扰着每一个Web开发者。仍然有办法解决这个浏览器支持问题:

1.您可以检查 "can I use" 的兼容性:

Link: http://caniuse.com/ 建议查找任何有问题的功能,例如动画。

2。在您的工作流程中使用自动前缀:

在自动前缀器的帮助下,您在大多数情况下不必担心使用带有 -moz-、-webkit- 等前缀的 CSS。这个小帮手可以解决问题对你来说,你甚至可以告诉一些自动前缀你想要支持哪些浏览器。

3。用户第 3 方图书馆:

您可以使用许多库来检测浏览器和版本。如果你想确保你的动画可以安全使用,你可以简单地使用库中提供的动画,当然之前在他们各自的网站上查看兼容性。

一些大牌:

还有很多,随便搜一下万维网吧

4.使用 CSS 黑客检测特定浏览器:

可以使用所谓的 CSS-Hacks。它们是特定的 CSS 调用,仅适用于某些浏览器。

一些例子:

Internet Explorer/Edge 8 only: @media [=11=]screen {}

firefox ≥ 3.6 only: @media screen and (-moz-images-in-menus:0) {}

Opera ≤ 9.27 AND Safari 2: html:first-child .selector {}

您可以在此处查找更多 Browserhacks:http://browserhacks.com/

结论:

可以检测特定的浏览器,但仅 CSS 无法检测浏览器是否支持给定的功能。这就是为什么您在浏览器支持方面总是遇到一些困难。

希望这对您有所帮助。 此致

您可以添加一个事件侦听器来检查动画迭代是否完成,并在相应的事件处理程序中设置一个标志,如 supportsSVGKeyFramedAnimatedProps = true(如果迭代从未完成,则它不是动画)。

elem.addEventListener('animationiteration', eventHandler, false)

这将允许您 'fall forward' 到您的 SVG 动画,而不是提供后备。