如果不查询宽度属性,则转换不起作用

yac*_*con 6 javascript css3 css-transitions css-transforms

我想通过在js中为div添加一个类来为clickX设置转换动画.转换和转换属性将添加到css文件中.

var widget = document.getElementById('widget');    
widget.style.display = 'block';
document.getElementById('widget2').clientWidth; //comment this line out and it wont work
widget.className = 'visible';
Run Code Online (Sandbox Code Playgroud)

它只有在我添加类之前查询dom 中任何元素的width属性时才有效.

这是一个jsfiddle:https://jsfiddle.net/5z9fLsr5/2/

任何人都可以解释为什么这不起作用?

Pas*_*rby 2

这是因为您开始转换并display“同时”修改了属性。改变display会破坏任何转换(诚然,需要引用),因此最好将更改display和实际转换分开:

https://jsfiddle.net/5z9fLsr5/3/

document.getElementById('showWidget').addEventListener('click', function(e) {
    e.preventDefault();
    var widget = document.getElementById('widget');    
    widget.style.display = 'block';
    //document.getElementById('widget2').clientWidth;
    window.setTimeout(function(){
        widget.className = 'visible';
    },0);
});
Run Code Online (Sandbox Code Playgroud)
#widget {
    width: 200px;
    height: 80px;
    background: black;
    position: absolute;
    transition: transform 500ms;
    transform: translateX(-200px);
    display: none;
}
#widget.visible {
    transform: translateX(200px);
}



#widget2 {
    position: absolute;
    right: 0
}
Run Code Online (Sandbox Code Playgroud)
<a href="#" id="showWidget">show</a>
<div id="widget"></div>
<div id="widget2">xxx</div>
Run Code Online (Sandbox Code Playgroud)

查询clientWidth似乎会“暂停”执行一段时间,因此它也有效。