javascript - 如何按顺序应用 CSS 更改?

标签 javascript css css-transitions

有时我会遇到这样的情况,我想立即对 CSS 应用多个更改,确保每个更改都由渲染器注册。

Here's a simplified example

元素的高度是自动的,所以它不能被转换。所以我想将元素高度设置为当前计算的高度,然后立即更改类以开始过渡。如果这种情况发生在下一行代码中,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 来确保类更改始终发生在divheight 计算之后。

示例:

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/

相关文章:

javascript - 是否可以使用 Angular HTML 文档进行 $compile

html - IE11 上的溢出滚动问题

html - 我怎样才能使这个链接覆盖更大的区域而不显示下面的文字?

css - 使用 CSS Padding Hover Transition 的闪烁文本问题

javascript - 如何限制用盒子提交的图像的大小

javascript - Angular Webpack 设置 : Migrate from css to sass using webpack

javascript - 如何在 ReactJS 中处理多个选择表单

javascript - window.print() 在 IE7 和 IE8 中卡住

css - 使用 html_nodes 未检测到 Rvest 节点

jquery - 滚动页面时平滑更改粘性标题和页面内容的填充/边距