有时我会遇到这样的情况,我想立即对 CSS 应用多个更改,确保每个更改都由渲染器注册。
元素的高度是自动的,所以它不能被转换。所以我想将元素高度设置为当前计算的高度,然后立即更改类以开始过渡。如果这种情况发生在下一行代码中,css-renderer 就没有时间对第一个更改使用react,就好像只有类发生了变化 -> 没有转换。
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 更改的最佳方式,或者是否还有其他方法。
最佳答案
您可以在此处使用setTimeout
来确保类更改始终发生在div
的height
计算之后。
示例:
var foo = document.getElementsByClassName('foo')[0];
var bar = document.getElementsByClassName('bar')[0];
var dan = document.getElementsByClassName('dan')[0];
function fooFunction(element) {
element.style.height = element.clientHeight + 'px';
setTimeout(function(){
element.classList.add('active');
element.removeAttribute('style');
},10);
}
foo.addEventListener('click',function(){fooFunction(foo);},false);
bar.addEventListener('click',function(){fooFunction(bar);},false);
dan.addEventListener('click',function(){fooFunction(dan);},false);
.foo, .bar, .dan{
width:20%;
display: inline-block;
overflow: hidden;
vertical-align:top;
transition: height 1s ease-out;
}
.active {
height:50px;
}
.foo {
background:rgb(150, 100, 100);
}
.bar {
background:rgb(150, 150, 100);
}
.dan {
background:rgb(100, 150, 100);
}
<div class="foo">
<p>Works.</p>
<p>Another paragraph.</p>
<p>Third paragraph. This one is even longer. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quibusdam, fugiat facere? Animi, odit et tempore debitis modi quae eaque, libero, dolores magni, voluptas tenetur tempora quidem alias ut praesentium sed.</p>
</div>
<div class="bar">
<p>Works.</p>
<p>Another paragraph.</p>
<p>Third paragraph. This one is even longer. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quibusdam, fugiat facere? Animi, odit et tempore debitis modi quae eaque, libero, dolores magni, voluptas tenetur tempora quidem alias ut praesentium sed.</p>
<p>Fourth paragraph. This one is even longer. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quibusdam, fugiat facere? Animi, odit et tempore debitis modi quae eaque, libero, dolores magni, voluptas tenetur tempora quidem alias ut praesentium sed.</p>
</div>
<div class="dan">
<p>Works.</p>
<p>Another paragraph.</p>
<p>Third paragraph. This one is even longer. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quibusdam, fugiat facere? Animi, odit et tempore debitis modi quae eaque, libero, dolores magni, voluptas tenetur tempora quidem alias ut praesentium sed.</p>
<p>Fourth paragraph. This one is even longer. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quibusdam, fugiat facere? Animi, odit et tempore debitis modi quae eaque, libero, dolores magni, voluptas tenetur tempora quidem alias ut praesentium sed.</p>
<p>Fifth paragraph. This one is even longer. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quibusdam, fugiat facere? Animi, odit et tempore debitis modi quae eaque, libero, dolores magni, voluptas tenetur tempora quidem alias ut praesentium sed.</p>
</div>
关于javascript - 如何按顺序应用 CSS 更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38857560/