我正在寻找改进我用jQuery编写的脚本来做一些将多个动画链接在一起的动画(在某种时间轴序列中)。我不想手动链接每个动画,而是想编写一个函数来替换每个动画中标准的几个元素。
不可否认,我没有JavaScript知识来了解实现这一目标的最佳实践;话虽如此,一些指针/例子会很棒。
这就是我所拥有的:
function itemsFirstAnim() {
// Define each target div
var one = $(".one");
var two = $(".two");
var three = $(".three");
var four = $(".four");
var five = $(".five");
var six = $(".six");
var seven = $(".seven");
var eight = $(".eight");
var nine = $(".nine");
var ten = $(".ten");
var eleven = $(".eleven");
var twelve = $(".twelve");
// Show a block (opacity 1), give the overlay a position, show and animate it
twelve.css("opacity", 1).children(".overlay").show().animate({ right: "100%" }, 750, function() {
// cover the block with the overlay when the animation is done
twelve.children('.overlay').css({ right: 0 });
eleven.css("opacity", 1).children(".overlay").show().animate({ bottom: "100%" }, 750, function() {
eleven.children('.overlay').css({ bottom: 0 });
seven.css("opacity", 1).children(".overlay").show().animate({ right: "100%" }, 750, function() {
seven.children(".overlay").css({ right: 0 });
and so on....
});
});
});
}
理想情况下,我希望target
和direction
的参数替换初始选择器(即twelve
)及其动画方向(即right: "100%"
)。由于每个target
和direction
不同,我不能只编写一个函数并在其内部调用它,除非我将它嵌套12次,这似乎也是最基本的。
最后,我希望这个功能(或者插件?)在所有这12个应用完后停止执行。
不幸的是,动画的顺序不是顺序的(如示例中所示。但我确实知道要设置动画的数字的顺序)。
以下是我所得到的一个例子:http://codepen.io/anon/full/Dxzpj
如果有人有任何见解,我们将不胜感激。谢谢!
答案 0 :(得分:0)
这不是特别漂亮,但您可以使用自定义队列自定义动画的顺序;请参阅queue
和dequeue
函数。
一个简单的例子可能如下:
$(function () {
// Use the body to track the animation queue; you can use whatever
// element you want, though, since we're using a custom queue name
var $body = $(document.body);
// Helper functions to cut down on the noise
var continue_queue = function () {
$body.dequeue("my-fx");
};
var add_to_queue = function (cb) {
$body.queue("my-fx", cb);
};
// Define your queue. Be sure to use continue_queue as the callback
add_to_queue(function () {
$('#one').animate({ height: '8em' }, 750, continue_queue);
});
add_to_queue(function () {
$('#two').animate({ width: '8em' }, 750, continue_queue);
});
// Need to call this once to start the sequence
continue_queue();
});
这将使用附加到<body>
元素的单独队列跟踪整体动画的进度。当动画的每个部分结束时,它会调用continue_queue()
来指示下一部分应该运行。
你可以使用这种方法在单独的函数,循环等中逐个构建你的动画。直到你把它关闭它才会真正开始运行。
你可以在jsfiddle上看到这个并且弄乱它。
答案 1 :(得分:0)
如果您对所有元素应用相同的设置,那么简单的递归可能会有很大帮助。
var $els = $('#one, #two, #three'); // collect all your elements in an array
(function recursive(el) {
el.animate({height: '100px'}, 800, function() {
if (el.next()) recursive(el.next()); // if there are more, run the function again
});
})($els.eq(0)); //start with the first one