这确实是一个奇怪的问题。我不认为你在代码中做错了什么——当前的浏览器实现只是有缺陷。
在使用 CSS 转换之前,我遇到过这些看似显而易见的错误,如果不诉诸拜占庭式的黑客攻击,一旦他们正在解决的错误被修复,它们肯定会被破坏(在这个情况下,我的 WebKit 修复)。
我确实对此进行了深入研究,但无法提出一个干净的解决方案,该解决方案适用于三个主要的过渡支持布局引擎(WebKit、Gecko 和 Presto)。也就是说,这就是我所发现的——希望比我更聪明的人(或者只是以新的眼光来看待这个问题)可以接受这个答案并将其转化为真正的解决方案。
Gecko 和 Presto(但不是 WebKit!)
看起来(我不是浏览器工程师或熟悉规范)任何当前或以前的 a 值都transition-property
将继续呈现,无论它是否需要。因此,即使您更改了 的值transition-property
,浏览器仍会在后台渲染高度过渡,并且当您将高度更改回来时,您会得到它的尾端。
但是有一个解决方案:transition
在 JavaScript 中创建(不要将其放在样式表中的任何位置),将其删除(之后不会对 DOM 中的任何位置transition
应用任何规则#upper
),更改高度,然后重新添加它. 不完美,但也不是依赖于错误的黑客。
http://jsfiddle.net/grantheaslip/e3quW/
JavaScript
upper.style.removeProperty('transition');
upper.style.removeProperty('-o-transition');
upper.style.removeProperty('-moz-transition');
upper.style.removeProperty('-webkit-transition');
upper.style.removeProperty('height');
// force a reflow
// if (upper.offsetParent) { /* empty */ }
upper.style['transition'] = 'height 1000ms';
upper.style['-o-transition'] = 'height 1000ms';
upper.style['-moz-transition'] = 'height 1000ms';
upper.style['-webkit-transition'] = 'height 1000ms';
样式表
#upper {
background-color: red;
}
WebKit(但不是 Gecko 或 Presto!)
任何仅因 1ms 超时而起作用的东西可能永远都不应该接近生产,但我认为这是值得指出的,以防它帮助某人解决这个问题。
我的猜测是 WebKit 与 Presto 或 Gecko 没有相同的问题,而是包含一个优化,它收集应用在同一函数中的样式更改并一次应用它们。同样,来自从未接近 WebKit 源代码或 CSS3 规范的人的纯粹猜测。
http://jsfiddle.net/grantheaslip/DFcg9/
JavaScript
window.setTimeout(function() {
upper.style.removeProperty('transition-property');
upper.style.removeProperty('-o-transition-property');
upper.style.removeProperty('-moz-transition-property');
upper.style.removeProperty('-webkit-transition-property');
upper.style.removeProperty('opacity');
lower.style.removeProperty('opacity');
}, 1);
Gecko、Presto 和 WebKit
这是两种解决方案的结合。同样,由于超时黑客,这真的不应该被使用。
http://jsfiddle.net/grantheaslip/N3NrB/