我想编写自己的jquery插件来将效果应用于元素。 效果是崩溃一个html元素(我确定这些元素已经存在,但我想学会自己编写)。
该函数获取所选元素的宽度并减小其宽度;例如
var width = $(this).width(); // get width
while(width > 0){
width -= 1;
$(this).width(width); // set new width .... but element it not redrawn
我遇到的问题是我没有看到宽度逐渐减小但是一旦宽度为0就重新绘制元素,即一旦循环执行,可能是函数返回时。
如何重新绘制元素以便我可以看到宽度缩小?
答案 0 :(得分:0)
你的问题是你的循环没有延迟。
循环在几微秒内执行,这就是为什么你看不到重新绘制元素的原因。
您可以使用setTimeout
来延迟循环的执行,并在每次迭代时调用它,直到元素宽度为0:
function reduceWidth(item) {
item.width(item.width() - 1);
if (item.width() > 0) {
setTimeout(function() {
reduceWidth(item);
}, 1);
}
}
reduceWidth($('#your_element'));
答案 1 :(得分:0)
以下是您的代码示例,浏览器将在每个循环之间重新呈现:
TIMEOUT_MS = 10;
var $element = $(this);
var width = $element.width();
function resize() {
$element.width(--width);
if(!width) return;
setTimeout(resize, TIMEOUT_MS);
}
resize();
正如您所看到的,我已经用while
的递归调用替换了resize()
循环。
以下是解释:
浏览器只在所谓的"运行循环之间重绘屏幕。" A"运行循环"是一个同步代码块 - 意思是"没有中断"。您发布的while
循环是一段同步(读取"阻止")代码。换句话说,它没有任何"休息"本身允许浏览器重绘。
如果您希望浏览器绘制中间步骤,则必须将执行推迟到下一个"运行循环"。 (你必须暂停执行)
有两种相关方法可以执行此操作:setInterval
和setTimeout
。 setTimeout
会将方法的执行推迟到将来的运行循环中,而setInterval
会重复这样做。