我试图让一些过渡干净利落,但由于浏览器对各种JS和显示渲染线程进行排队的方式,这变得越来越困难。
我有1428832800979
扩展了点击事件(在其他地方)。随着溢出控制,其内容逐渐出现。一旦完全展开,就需要移除溢出控制,因为内容可能高于扩展到高度,并且有一些内部元素需要在区域外戳。
我有三个CSS:
<div class="expandable">
点击触发器元素,我们将.expandable {
max-height: 0;
overflow: hidden;
transition: all 2s;
}
.expandable.activating {
max-height: 1000px !important;
overflow: hidden;
transition: all 2s;
}
.expandable.active {
max-height: none;
overflow: visible;
transition: none;
}
添加到.activating
。转换完成后,我们会移除div
并添加.activating
。到目前为止,非常好。
但是,在元素展开时单击触发器事件时,我遇到了问题。
.active
是我们n
...
div
实际代码略有不同,因为我有实用函数来设置条件类对,但这实际上是正在发生的事情。
问题是,在if (n.classList.contains("active")) {
n.classList.add("activating");
n.classList.remove("active");
window.setTimeout(function () {
n.classList.remove("activating");
}, 0);
}
超时延迟时,0
类会在主动呈现到显示中之前被删除。如果我延迟到.activating
,它会在大约一半的时间内呈现。即有时候,小组会优雅地收缩,有时它会立即从10
转换到默认状态。
如何将.active
正确渲染到显示中之前延迟调用最后一次类更改,以便转换实际按预期工作?
(这在Firefox中发生,完全相同的代码似乎以前工作得很好。)
答案 0 :(得分:0)
如果您将高度设置得太大(例如max-height:1000px),则会导致延迟,尤其是在您获得宽范围的盒子高度的情况下。 所以你可以试试这个:
.expandable {
max-height: 0;
overflow: hidden;
transition: all 2s;
}
.expandable.activating {
max-height: 1000px ;
overflow: hidden;
transition: max-height 0.5s cubic-bezier(0, 1.05, 0, 1);
}
.expandable.active {
max-height: none;
overflow: visible;
transition: none;
}
if (n.classList.contains("active")) {
n.classList.add("activating");
n.classList.remove("active");
window.setTimeout(function () {
n.classList.remove("activating");
}, 0.5s);
}