【发布时间】:2016-12-15 21:39:24
【问题描述】:
我有时会遇到一些情况,我想立即对 CSS 应用多项更改,确保每一项都由渲染器注册。
元素的高度是自动的,所以它不能被转换。所以我想将元素高度设置为当前计算的高度,然后立即更改类以开始转换。如果这种情况发生在下一行代码中,css-renderer 就没有时间对第一次更改做出反应,就好像只有类被更改了 -> 没有过渡。
var foo = $(".foo");
foo[0].addEventListener("click", function(ev){
foo.css({"height":foo.height()+"px"});
foo.addClass("active");
}); //this doesn't work, foo.css…' is ignored.
我们可以使用window.requestAnimationFrame() 延迟到最小的动画时间步长,但是,由于浏览器的差异,这些已经需要两个嵌套调用来支持 Firefox。
var dan = $(".dan");
dan[0].addEventListener("click", function(ev){
window.requestAnimationFrame(function(){
dan.css({"height":dan.height()+"px"});
window.requestAnimationFrame(function(){
dan.addClass("active");
});
});
}); //this does work (afai can tell), but feels overdone with all that nesting.
从技术上讲,此代码有效。我只是想知道这是否真的是像这样链接 css 更改的最佳方法,或者是否还有其他方法。
【问题讨论】:
-
这是一个很好的问题。查看给出的示例,代码中不存在 webkit 转换。虽然我认为这不能解决你的问题,但值得把它们放进去看看它的反应。
-
过渡在所有当前浏览器上都是无前缀的,所以虽然它们在生产中仍然是必需的,但它不会影响这个问题。无论如何更新了代码,并没有表现出任何行为差异。
-
我认为应该有一个简单的答案,但我想不是。我认为可能有一种方法可以使用 jQuery
.queue来做到这一点,但我无法在几分钟的摆弄中让它工作,所以我会把它扔在这里以便其他人可能能够弄清楚出去。我相信旧方法是使用 setInterval 或 setTimeout,但这会使您的转换在执行之前可能会暂停,并且在代码中不会更漂亮。 -
您需要时,
Application.DoEvents()在哪里? -
请考虑更新此问题以删除“最佳”指示,或指明“最佳”和“更好”的确切含义。例如,您的意思可能是“更少的代码行”或“更快的性能”,但我们不知道。
标签: javascript css css-transitions