【发布时间】:2016-05-30 01:02:36
【问题描述】:
我知道关闭,IIFE。
我已经阅读了其他答案(他们都指向使用 IIFE)。
那么为什么这不起作用呢?
- 我的图像应该逐渐淡入(在 2 秒内)
- 好像只渲染一次(带有最终值)
var imgFade = document.getElementById('img-fade');
for(i = 0; i < 100; i++){
(function(step) {
setTimeout(function() {
imgFade.style.opacity = (step/100);
}, 20);
})(i);
}
这里是代码:https://jsfiddle.net/warkentien2/Lh10phuv/1/
编辑:供未来读者使用
考虑从 i = 1; to 1 <= 100, i++ 转换的所有答案
所以它不会在 99% 时停止渲染
【问题讨论】:
-
嗯,您实际上是在一次设置一大堆超时,以便在 20 毫秒后执行;它们都会一个接一个地以极快的速度开火。您必须稍微分散时间才能使其渐进。
-
@deceze 这不是问题,或者 setTimeout 上的一个简单的额外 0 就可以解决它。
-
@warkentien2 我认为这是问题所在,因为在制作第一个
setTimeout和最后一个之间确实存在纳秒。因此,您将看到的只是最后一个。setInterval可能是你需要的。 -
@deceze 似乎是对的。 settimeout 调用不会相隔 20 毫秒被调用,它们都会在 ~20 毫秒内被同时调用
-
想一想:这个循环将在几分之一秒内运行,设置 100 个回调以在大约 20 毫秒后执行。每个回调也只需要几分之一秒,然后下一个回调运行。所以你的执行是 0% 的不透明度,循环,... 20ms 什么都没有... 1,2,3,4...100% 的不透明度在几分之一秒内。从视觉上看,这种变化似乎是瞬间的。你要么想将超时时间设置为
20 * i,让每个回调越来越延迟,要么你需要在上一个回调完成20ms后触发下一个回调。
标签: javascript css closures settimeout iife