Javascript jQuery动画循环回调
我已经编写了一个名为.Ani()的特殊函数,其工作原理类似于jquery.animate(相同的语法等只是先通过CSS运行它,然后再运行它。如果不支持转换,则使用animate) 我试图做的是允许用户传入一系列坐标,以便沿路径设置动画:Javascript jQuery动画循环回调,javascript,jquery,css,loops,Javascript,Jquery,Css,Loops,我已经编写了一个名为.Ani()的特殊函数,其工作原理类似于jquery.animate(相同的语法等只是先通过CSS运行它,然后再运行它。如果不支持转换,则使用animate) 我试图做的是允许用户传入一系列坐标,以便沿路径设置动画: "0,0||5,5||10,10" $(this).Ani({'top': 0, 'left': 0}, duration, easing, function() { // callback function }); 上面的动画只显示坐标的1,我需要
"0,0||5,5||10,10"
$(this).Ani({'top': 0, 'left': 0}, duration, easing, function() {
// callback function
});
上面的动画只显示坐标的1,我需要通过运行相同的代码(它本身也有一个回调)来显示回调中的下一组坐标(5,5)
我已经通过不分割值等简化了上面的内容,因为我现在要完成的就是如何循环X次(坐标集的数量)并为每组坐标生成动画线。类似于:
var path="0,0||5,5||10,10",
COORDS=path.split('||');
for(var i=0, l=COORDS.length; i<l; i++) {
$(this).Ani({ 'top' : COORDS[i].split(',')[1], 'left' : COORDS[i].split(',')[0] }, 500, ease, function() {
// WHEN DONE ANIMATING TO THIS LOCATION
// RUN THE NEXT ANIMATION FOR THE NEXT SET OF COORDINATES (5,5)
});
};
var path=“0,0 | | 5,5 | | 10,10”,
COORDS=path.split(“| |”);
对于(var i=0,l=COORDS.length;i您可以使Ani
将一个函数作为参数发送到回调,该回调在调用时为下一对COORDS运行Ani
函数,并完整地发送其余参数
$(this).Ani({'top': 0, 'left': 0}, duration, easing, function(continueFunction) {
continueFunction();
});
另外,为什么不把Ani
作为一个封装逻辑的对象呢?它可以简化代码并提高性能,但可以提高LOC。我想是这样的
$.fn.Ani = function(vals, dur, ease, callback) {
var coords = vals.split('||'),
self = this,
i = 0;
(function fn(cooo) {
var arr = cooo.split(',');
self.animate({top: arr[0], left: arr[1]}, dur, ease, function() {
if (coords[++i]) {
fn(coords[i]);
} else {
callback();
}
});
})(coords[i]);
}
var path = "0,0||5,5||10,10";
$(element).Ani(path, 1200, 'swing', function() {
// complete
});
以下是我的建议:
function Animate(path, callback) {
var animatedObject = $(this)
var onCompleteCallback = callback || function() { };
var COORDS=path.split('||');
var size = COORDS.length;
if (size === 0) {
// maybe call onCompleteCallback(); ?
return;
}
var step = COORDS[0].split(',');
var currentStep = 0;
function doAnimation() {
animatedObject.Ani({ 'top' : step[1], 'left' : step[0] }, 500, ease, function() {
++currentStep;
if (currentStep === size) {
onCompleteCallback();
return;
}
step = COORDS[currentStep].split(',');
doAnimation();
});
}
doAnimation();
};
只需使用以下命令调用它:Animate(“0,0 | | | | 5,5 | | | 10,10”,在需要时调用backfunction);