Javascript 类在样式之前更改
请参见以下代码段:Javascript 类在样式之前更改,javascript,jquery,css,Javascript,Jquery,Css,请参见以下代码段: $('div')。单击(函数(){ $(this.css('width','10px').addClass('width'); }); div{宽度:100px;高度:100px;背景色:绿色;} div.wide{width:200px!重要;转换:width 2s;} 尝试在添加类之前等待一段时间,您将永远看不到两者之间的时间差—您的计算机太快了 最后,这是一个关于javascript是异步的并且不在每个命令之间呈现DOM的方式的问题。将超时放在那里告诉javascri
$('div')。单击(函数(){
$(this.css('width','10px').addClass('width');
});代码>
div{宽度:100px;高度:100px;背景色:绿色;}
div.wide{width:200px!重要;转换:width 2s;}
尝试在添加类之前等待一段时间,您将永远看不到两者之间的时间差—您的计算机太快了
最后,这是一个关于javascript是异步的并且不在每个命令之间呈现DOM的方式的问题。将超时放在那里告诉javascript它现在可以做其他事情,并将上下文切换到渲染
$('div')。单击(函数(){
$(this.css('width','10px');
var smallBox=this;
setTimeout(函数(){
$(smallBox).addClass('wide');
}, 0);
});代码>
div{宽度:100px;高度:100px;背景色:绿色;}
div.wide{width:200px!重要;转换:width 2s;}
方法不起作用的原因是jQuery.css()
方法不允许回调函数,这意味着.css()
和.addClass()
将同时启动。您可以尝试改用.animate()
方法
示例
$(“div”)。单击(函数(){
$(此)。设置动画({
宽度:10
},函数(){
$(this.addClass('wide');
});
});代码>
div{宽度:100px;高度:100px;背景色:绿色;}
div.wide{width:200px!重要;转换:width 2s;}
JavaScript是异步的,它可以同时执行两个任务。您可以使用来解决此问题:
$('div').click(function(){
$(this).css('width', '10px');
setTimeout(function(){
$(this).addClass('wide');
}, 3000);});
如果您查看检查器,您可以看到在样式属性之前更改class属性
我看不到那么快,它们同时更改$(this).css('width','10px').promise()。然后(()=>$(this).addClass('wide')也许你的电脑比我的快。我可以肯定地看到一个不同。你的目标是什么,我可以理解所有你有动画,这是把这个div宽度200px。另外,你的div开始100px宽度,为什么当你用动画点击它时,你想要10px,而这个动画与你的div的宽度是200?我的目标是理解为什么在样式之后应该更改时,类会首先更改。即使它不使用回调,它仍然应该按顺序执行,对吗,执行顺序始终是从上到下、从左到右开始,因为代码执行的速度非常快,0.05秒甚至更短,您在屏幕上单击它的那一刻就看不到任何差异。浏览器需要一个理由将上下文切换回呈现UI,因此您输入超时的时间无关紧要。这是因为js是异步的,不能同时做两件事,即渲染和更改变量。超时0是一个很好的主意。我知道它是异步的,但它总是先更改类,这不是很奇怪吗?我不会说类更改是先发生的,可能是在更改DOM元素的同时,它们在渲染时一起应用。这可能是一个更好的解释,对于不理解回调的人来说,超时是一个肮脏的解决方法。