我有几个课程:hide
是display: none
,transparent
是opacity: 0
。元素pr_container
具有-webkit-transition: opacity 1s
。以下基于JQuery的代码使元素出现在动画中:
pr_container.removeClass("hide");
setTimeout(function() { pr_container.removeClass("transparent"); }, 0);
但是,当我删除setTimeout
而只删除第二个类时,没有动画。为什么呢?
编辑:我正在使用最新的Chrome,我还没有检查过其他浏览器。
编辑:我尝试将两个调用放在同一个setTimeout
回调中 - 没有动画。所以这显然是关于分离。
编辑:这是jsFiddle:http://jsfiddle.net/WfAVj/
答案 0 :(得分:3)
如果您要同时更改display
属性,则无法进行转换。因此,为了使其工作,您必须以其他方式隐藏您的元素。例如:
.hide {
height: 0;
width: 0;
/* overflow: hidden; padding: 0; border: none; */
}
答案 1 :(得分:3)
没有合理的“curve”从一个display
状态转换到另一个display
状态,因此在当前的浏览器实现中,任何涉及pr_container.removeClass("hide");
pr_container.removeClass("transparent");
的转换最终都不会转换为所有
使用此代码:
class="hide transparent"
你可以想象这两个语句在一个“阻塞”队列中执行,因此浏览器实际上将元素从class=""
呈现为hide
,并且如上所述,实际上pr_container.removeClass("hide");
setTimeout(function() { pr_container.removeClass("transparent"); }, 0);
类使任何现有转换无效。
使用
{{1}}
您告诉浏览器“尽快删除”透明“类,但不在同一队列中”,因此浏览器首先删除“隐藏”,然后继续。当浏览器认为它有备用资源时,会发生“透明”的删除,因此转换不会失效。
答案 2 :(得分:0)
只有“transperent”类产生动画。“隐藏”是即时的。所以开始动画,如果需要,请在1秒后“隐藏”:
test.addClass("transparent");
//hide after 1 sec, when the animation is done
setTimeout(function() {test.addClass("hide"); }, 1000); //1000ms = 1sec
答案 3 :(得分:0)
通过使用链接问题中的建议,我制作了一个我满意的版本:
.test {
-webkit-transition: visibility 1s, opacity 1s;
}
.hide {
visibility: hidden;
}
.transparent {
opacity: 0;
}
编辑:现在这两个类甚至可以组合成一个!
感谢大家!