更新通知不幸的是,在本文发布时,Safari 并未遵循以下 W3 规范中概述的标准,并且在转换后包括 webkit 前缀属性和无前缀属性将导致它破裂并且根本没有动画。我仍在探索这个问题以获得一个好的通用解决方案,但看起来在 Safari 修复此问题之前,可能不会有一个适用于任何地方以及所有未来属性的解决方案,而无需使用 JavaScript 动态调整每个浏览器的 CSS 规则。
如果您将无法识别或无效的属性添加到转换属性列表中,列表中的有效属性仍会添加(Safari 除外,请参阅上面的通知)。
根据 w3 Specification for CSS Transitions 的第 2.1 节:
如果列出的标识符之一不是可识别的属性名称或不是动画属性,则实现仍必须在列表中的动画属性上使用持续时间、延迟和计时函数在它们各自的索引处开始转换“transition-duration”、“transition-delay”和“transition-timing-function”的列表。
W3 Specification for CSS Transitions
如果你采用下面的样式,尽管前面有一个无效且无法识别的属性,但 width 属性仍然会被动画化。
transition: unrecognizedProperty 2s, width 2s;
如果您使用另一个转换规则(具有相同的前缀或缺少前缀)遵循一个转换规则,则即使第二个规则仅列出了无效属性,第一个规则将被覆盖并且不再应用在右手边。
如果您尝试以下样式,宽度将不会被动画化,因为第一条规则将被第二条规则覆盖,这实际上没有任何作用,因为无法识别“unrecognizedProperty”。
transition: width 2s;
transition: unrecognizedProperty 2s;
基于此,我相信您的第一种方法是正确的。
-webkit-transition: -webkit-transform 300ms;
transition: -webkit-transform 300ms, transform 300ms;
第一条规则只有在 -webkit-transition 被识别的情况下才会被应用,在这种情况下,由于 transform 是在转换之后出现的,所以它肯定必须加上前缀,我们可以省略不带前缀的 transform 属性(虽然我不认为它离开它会很痛)。只有在识别出无前缀转换时才会应用第二条规则,在这种情况下,将应用浏览器识别的右侧属性,即使列表中的其他属性未被识别。
您的第二种方法存在缺陷,因为无论右侧的任何属性是否被识别,第二条规则都会被第三条规则覆盖。
我相信浏览器前缀属性的完整列表可以保证您在所有有能力的浏览器上应用 2s 的转换来转换,但请阅读下面的原因,因为它恰好是这个属性对的整洁偶然:
-webkit-transition: -webkit-transform 2s;
-moz-transition: -moz-transform 2s;
-o-transition: -o-transform 2s;
transition: transform 2s;
-
注意没有-ms-transition这样的东西,但是有-ms-transform。话虽这么说,直到 10 年才将转换添加到 IE,其中 -ms-transform 也因无前缀转换而过时。因此对于 IE,我们唯一需要的规则是“transition: transform”。
-
我还要注意,任何时候我们有一个用于转换的浏览器前缀(
-
由于 Firefox 在发布无前缀转换的同时发布了无前缀转换,因此我们不需要在无前缀“转换”右侧添加前缀“-moz-transform”。
-
Opera 在某些时候除了 -o- 之外还使用 -webkit- 前缀进行转换,但是他们在版本 15 中开始使用 -webkit-transform,在版本 12.1 中开始使用无前缀转换之后,因此我们不需要包含-o-transition 之后的 -webkit-transform。另外,由于 Opera 在 12.1 版本之后只使用了无前缀或 -webkit-transform,所以我们不需要在无前缀转换之后包含 -o-transform。
-
在这种情况下,我们不必在无前缀转换的右侧包含 -webkit-transform,因为仅识别 -webkit-transform 的浏览器将回退到 -webkit-transition 并仍然应用此属性。
如果您不介意 CSS 的长度,以下应该是一个安全的通用解决方案,用于确保正确的浏览器过渡前缀和右侧前缀属性。 更新通知 事实证明,这种方法在 Safari 上可能不安全,因为它们不遵循 W3 标准,即忽略转换右侧无法识别的属性(如果有一个前缀和一个不带前缀) .
-webkit-transition: -webkit-property,
property;
-moz-transition: -moz-property,
property;
-ms-transition: -ms-property,
property;
-o-transition: -o-property,
-webkit-property,
property;
transition: -webkit-property,
-moz-property,
-ms-property,
-o-property,
property;