我目前正在整理一个css动画,实现这一目标的一部分涉及以特定的时间间隔更改正文的类名。
对于mootools(以及一般的js)来说,我认为实现这一目标的最好方法是简单地以延迟的间隔向身体添加/删除类,如下所示:
(function() {$(document.body).addClass('load');}).delay(20);
(function() {$(document.body).addClass('load-two');}).delay(2000);
(function() {$(document.body).addClass('load-three');}).delay(2700);
(function() {$(document.body).addClass('load-four');}).delay(4500);
然而,我对这个主题的阅读越多,我就越相信这是实现我想要的低效方式。
上面的代码适用于我测试过的所有浏览器,但是我会更好地使用链类来实现我想要的吗?我已经查看了关于建立链条的Mootools文档,但无论出于何种原因,我都在努力让演示工作。
所以我要问的关键是,如果有更好的方法来编写上面发布的代码,使用不同的方法有什么好处?
感谢。
答案 0 :(得分:2)
在mootools中建立一个链很简单。但是,使用Chain类作为mixin可能会更多一些。
通常,它正朝着基于Fx的类和方法的链接而不是同步的链接。假设您有一个有link: chain
的补间效果,您可以.chain(function() {})
该实例在之后执行其他操作。
the callChain example作为一个独立版本很简单,但它在时序控制方面提供的很少。
然后是线性时间线方法。在你的情况下,你的第一个回调运行在20毫秒后,1980毫秒后,第二个,第三个在第二个之后运行1680毫秒,依此类推。如果你将事物链接起来以便每个连续步骤调用下一个步骤,你需要考虑到这一点并实际传递时间在两个动作之间等待。
另一种方法是按照你从一开始就做的那样推迟它们。
我在这里稍微简化了前者:http://jsfiddle.net/dimitar/mpzzq/
(function(){
Chain.implement({
slowChain: function(duration){
// console.log(duration);
this.callChain.delay(duration === null ? 500 : duration, this);
}
});
var db = $(document.body);
var fixBody = function(cn, delay) {
console.log(arguments);
db.addClass(cn);
console.log(cn, delay);
if (this.$chain.length) {
this.slowChain(delay || 0);
}
};
var myChain = new Chain(),
funcs = [{
fn: fixBody,
args: ["load"],
delay: 1980
}, {
fn: fixBody,
args: ["load-two"],
delay: 700
}, {
fn: fixBody,
args: ["load-three"],
delay: 2000
}, {
fn: fixBody,
args: ["load-four"],
delay: 0
}];
myChain.chain(
funcs.map(function(el) {
el.args.push(el.delay);
return el.fn.bind.apply(el.fn, [myChain].concat(el.args));
})
);
document.getElement("button").addEvents({
click: function() {
myChain.slowChain(20);
}
});
})();
所以在我的funcs对象数组中,我定义了func回调,传递的参数和延迟。请记住,func本身已将this
范围设置为链实例,并自动调用链上的下一个范围,但您可以轻松地对其进行修改并使用它。
希望它能给你一些想法。
这里是带有装饰器函数的2,它在延迟时调用链:
// function decorator.
Function.implement({
chainDelay: function(delay, bind) {
// allows you to set a delay for chained funcs and auto call stack (if bind is a chain instance)
var self = this,
args = (arguments.length > 2) ? Array.slice(arguments, 2) : null;
return function() {
setTimeout(function() {
self.apply(bind, args.concat(Array.from(arguments)));
if (bind && bind.$chain && bind.$chain.length)
bind.callChain.call(bind);
}, delay);
}
},
justChain: function(bind) {
// runs a chained func when due and auto calls stack for next (if bind is a chain instance and avail)
var self = this, args = (arguments.length > 1) ? Array.slice(arguments, 1) : null;
return function() {
self.call(bind, args);
if (bind && bind.$chain && bind.$chain.length)
bind.callChain.call(bind);
}
}
});
var moo = new Chain();
moo.chain(
// some delayed ones.
(function(what) {
console.log(what);
}).chainDelay(3000, moo, "hi"),
(function(what, ever) {
console.log(what, ever);
}).chainDelay(3000, moo, "there", "coda"),
(function(what) {
new Element("div[id=foo][html=" + what +"]").inject(document.body);
}).chainDelay(1000, moo, "mootools FTW!"),
// regular ones here for good measure!
(function() {
document.id("foo").setStyle("color", "red")
}).justChain(moo),
(function() {
document.id("foo").setStyle("background-color", "blue")
})
);
moo.callChain();