我注意到(在Chrome 43中使用jQuery)当元素具有display: none
时,转换将被禁用。在所有浏览器上,这种标准化的行为是jQuery的一个特性,还是在生产中不能依赖它?
当在延迟函数中更改要设置动画的CSS语句时,将启用转换。看看这个JSFiddle。取消注释第3行或6行,以便自己查看。
解决方案:
在生产中不能依赖这种行为,因为它似乎是优化/设计选择的产物,而不是规范(根据@Andriy Horens的回答)。相反,您应该使用类打开和关闭动画(transition-property: none
)。在Chrome 43中,由于没有使用类,它变得不可靠。Chrome还需要单独的框架(将代码延迟到0超时)来更新一些CSS语句。如果你想节省开发时间,只需推迟任何与动画相关的事情。
根据MDN:
显示器
除了许多不同的显示框类型外,值none还可以关闭元素的显示;当您使用none时,所有子代元素的显示也将关闭。文档将被呈现为该元素不存在于文档树中。
因此,我认为display设置为none的元素不会在所有浏览器中呈现,因此不会应用过渡或任何其他视觉效果。
您也可以通过订阅transitionend
事件来测试自己:
$(element).on("transitionend", function () {
console.log("transition ended");
});
更新:
它也符合w3c规范:
某些值(如display:none、display:contents和box suppress:discard)会导致元素和/或其子体根本不生成任何框。
其中,框是元素的视觉表示。过渡肯定是视觉表示的一部分,因为它也会影响布局,例如,当您在应用过渡的情况下更改元素的相对位置时。
这里是具有display : none
和visibility : hidden
的元素的动画(换句话说,渲染的元素和未渲染的元素)如何不同的又一个示例。
JSFiddle演示