正如这个问题所观察到的,新附加元素上的即时 CSS 转换以某种方式被忽略 - 转换的结束状态立即呈现。
例如,给定这个 CSS(这里省略了前缀):
.box {
opacity: 0;
transition: all 2s;
background-color: red;
height: 100px;
width: 100px;
}
.box.in { opacity: 1; }
此元素的不透明度将立即设置为 1:
// Does not animate
var $a = $('<div>')
.addClass('box a')
.appendTo('#wrapper');
$a.addClass('in');
我已经看到了几种触发转换以获得预期行为的方法:
// Does animate
var $b = $('<div>')
.addClass('box b')
.appendTo('#wrapper');
setTimeout(function() {
$('.b').addClass('in');
},0);
// Does animate
var $c = $('<div>')
.addClass('box c')
.appendTo('#wrapper');
$c[0]. offsetWidth = $c[0].offsetWidth
$c.addClass('in');
// Does animate
var $d = $('<div>')
.addClass('box d')
.appendTo('#wrapper');
$d.focus().addClass('in');
相同的方法适用于 vanilla JS DOM 操作 - 这不是特定于 jQuery 的行为。
编辑 - 我使用的是 Chrome 35。
JSFiddle(包括香草 JS 示例)。
- 为什么附加元素上的直接 CSS 动画会被忽略?
- 这些方法如何以及为什么起作用?
- 有没有其他方法可以做到
- 哪个(如果有)是首选解决方案?