javascript - 如果不查询宽度属性,过渡就不起作用

标签 javascript css css-transitions css-transforms

我想通过向 js 中的 div 添加一个类来为点击事件上的 translateX 设置动画。 transform 和 transition 属性添加到 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';

只有当我在添加类之前查询 dom 中任何 元素的宽度属性时,它才有效。

这是一个 jsfiddle: https://jsfiddle.net/5z9fLsr5/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);
});
#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
}
<a href="#" id="showWidget">show</a>
<div id="widget"></div>
<div id="widget2">xxx</div>

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

关于javascript - 如果不查询宽度属性,过渡就不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30184479/

相关文章:

javascript - 出现错误无法读取未定义的属性 'getTime'

javascript - 读取 firestore 中的子集合

javascript - 使用javascript更改聚合物1.0中纸张图标按钮的CSS样式

html - css .class 不适用于 anchor 标记,除非我添加 a.class。为什么?

css - 在 Firefox 上使用不透明度和 z-index 进行意外(不工作?)css3 转换

css-transitions - CSS 高度转换与 ul 不工作

javascript - 通过鼠标移动实现页面倾斜和缩放

javascript - 如何引导 Javascript 使用非唯一 ID 访问第二个元素

css - 像 *+* 这样的选择器可以安全使用吗?

css - 使用媒体查询时在 CSS linter 中出现错误