循环css样式与setTimeout: "在眨眼之间"
Looping css style with setTimeout: "in the blink of an eye"
我想让一个条(#innerBar)的宽度每秒减小1%。
循环似乎不起作用。我的条在眨眼间从100%下降到0%。
function timer(){
var timer;
for(i=100;i>=0;i--){
timer = i.toString() + "%";
setTimeout(function({$('#innerBar').css("width", timer)}, ((100-i)*1000));
}
}
注意:#innerBar是一个DIV的css属性(height:10px)。** +从定时器()的宽度;* *
正如在评论中已经说过的,您需要将它放在闭包中。下面是一个例子:
function timer() {
for (i = 100; i >= 0; i--) {
setTimeout(function(t) {
return function() {
var timer = t.toString() + "%";
$('#innerBar').css("width", timer);
};
}(i), ((100 - i) * 1000));
}
}
timer();
#innerBar {height: 50px; background: green; transition: width 0.2s linear}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="innerBar"></div>
解释
所以我的问题是:函数(t)发生了什么?}(i)为什么起作用?如何起作用?它是fu的乘法吗?
让我们取传递给setTimeout的函数体:
function(t) {
return function() {
var timer = t.toString() + "%";
$('#innerBar').css("width", timer);
};
}(i)
让我们省略里面的部分:
function(t) {
// do some stuff with t
}(i)
看起来熟悉吗?就像函数体被立即调用一样,它被称为IIFE,就像:
(function(a, b) {
return a + b;
})(2, 3) // returns 5
那么回到原来的函数,它接受一个参数t
,当我们调用函数时,我们将迭代器i
作为参数传递给它(所以i
的值在函数中变成了t
)。正如我在评论中所说,为了"获取"i
的当前值而不是获取循环后的值,这是必要的。
@Shomz已经发过了。这是个很好的解决方案。我只是想添加我的解决方案,因为它没有创建100个函数。所以它在内存上稍微轻一些。此外,您不必一遍又一遍地查看DOM中的#innerBar
。我删除了jQuery作为依赖项。
var size = 100;
var bar = document.getElementById( "innerBar" );
function setSize() {
bar.style.width = size-- + "%";
if ( size > 0 ) setTimeout( setSize, 1000 );
}
setSize();
#innerBar {
width: 100%;
height: 50px;
background: green;
transition: width 0.2s linear;
}
<div id="innerBar"></div>
我认为下面的代码可以满足您的要求。输入时间应为1000,这将使宽度每秒减少1%
var width = $('#innerBar').width();
function timeLoop(time){
width = width*0.99;
$('#innerBar').css("width", width);
if (width <= 0.01){
return;
}
else {
setTimeout(function() {
timeLoop(time);
}, time);
}
}
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- 全局变量和全局对象的属性之间有什么区别吗
- java.net和javascript之间正则表达式的差异
- JavaScript中的函数和对象之间没有区别吗?
- 获取@ResponseBody的一部分作为主干和Spring MVC控制器之间的参数
- Jquery在函数之间传递表行
- 根据某些条件在视图之间切换
- 在控制器和数据对象之间同步数据
- 铬:“;未捕获的语法错误:意外的标记:"
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- d3中堆栈函数和嵌套函数之间的差异
- 检测电话窃听,即:<a href="电话:xxx">在UIWebview上
- JQuery:在页面之间滑动
- 如何使用JavaScript查找1和N之间的所有数字的总和
- 操作放置在画布上的元素之间的连接
- 在下划线中使用_(obj).map(callback)和_.map(obj,callback)之间的区别
- 按“|”拆分"而不是方括号之间
- 用于删除两个“”之间的字符的正则表达式是什么/"在javascript中
- 得到"未捕获错误:断言失败:Ember视图需要1.7和2.1之间的jQuery“;通过ember-cli创建的