javascript在下一个动画之前等待动画完成

标签 javascript animation

我正在制作一个powerpoint类型的网页,其中幻灯片以各种动画滑入和查看。动画序列保存在一个数组中(最终从数据库加载),并使用 eval() 进行调用

单击幻灯片时,将执行下一组动画,但我需要每个动画都等到前一组动画完成。因此,对于下面的代码,当 SeqNo 为 1 时,我希望 ShowSlideLeft 等待,直到 HideSlideRight 完成。

我已经查看了回调和 promise ,但我无法让它们工作,因为我无法对链接事件进行硬编码。

var SeqNo;

$(document).ready(function () {
    $('.slide').click(function (e) {
        ActivateSequence(++SeqNo);
    });

    SeqNo = 0;

    SetupSequence();

    ActivateSequence(SeqNo);
});

function SetupSequence() {
    Sequence = [];

    Sequence[0] = [];
    Sequence[0][0] = "ShowSlideLeft('S1');";

    Sequence[1] = [];
    Sequence[1][0] = "HideSlideRight('S1');";
    Sequence[1][1] = "ShowSlideLeft('S2');";
}  

function ActivateSequence(Seq) {
    var action;
    var element;

    if (Seq < Sequence.length) {
        for (var i = 0; i < Sequence[Seq].length; i++) {
            eval(Sequence[Seq][i]);
        }
    }
}

function ShowSlideLeft(div) {
    var showoptions = { "direction": "left", "mode": "show" };
    $('#' + div).effect("slide", showoptions, 1000);
}

function ShowSlideRight(div) {
    var showoptions = { "direction": "right", "mode": "show" };
    $('#' + div).effect("slide", showoptions, 1000);
}

function HideSlideLeft(div) {
    var showoptions = { "direction": "left", "mode": "hide" };
    $('#' + div).effect("slide", showoptions, 1000);
}

function HideSlideRight(div) {
    var showoptions = { "direction": "right", "mode": "hide" };
    $('#' + div).effect("slide", showoptions, 1000);
}

非常感谢您提供的任何帮助。

最佳答案

您可以向 .effect() 传递第四个参数回调,该回调是动画完成后要调用的函数。 因此,您可以通过添加回调参数并将其传递给 .effect 调用来更改自定义函数,如下所示:

function ShowSlideLeft(div, callback) {
    var showoptions = { "direction": "left", "mode": "show" };
    $('#' + div).effect("slide", showoptions, 1000, callback);
}

您还需要更改 SetupSequenceActivateSequence,我建议您:

  • eval 替换为 window[function_name] 以实现实际的函数调用
  • 使用对象而不是字符串初始化 Sequence 数组(它们可以作为 JSON 字符串存储在数据库中,因此此更改不应影响数据库设计)

结果会是这样的:

function SetupSequence() {
    Sequence = [];

    Sequence[0] = [];
    Sequence[0][0] = { action: 'ShowSlideLeft', target: 'S1' };

    Sequence[1] = [];
    Sequence[1][0] = { action: 'HideSlideRight', target: 'S1' };
    Sequence[1][1] = { action: 'ShowSlideLeft', target: 'S2' };
}  

function ActivateSequence(Seq, Step) {
    if (Seq < Sequence.length) {
        (window[Sequence[Seq][Step].action])(Sequence[Seq][Step].target, function() {
            // when the first effect is complete, execute the next one
            ActivateSequence(Seq, Step + 1);
        });
    }
}

请注意,通过稍加修改,您还可以将参数数组传递给自定义效果函数,而不是像现在这样的单个参数target

当然,您需要在 click 处理程序中使用 ActivateSequence(SeqNo, 0) 调用 ActivateSequence。

关于javascript在下一个动画之前等待动画完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37440033/

相关文章:

javascript - 如何使用 javascript 作为事件文本显示 <img> 标签

javascript - particles.js 未正确加载到页面上

javascript - 每个元素的 jQuery 动画

java - 如何在屏幕上移动/动画单个子类对象而不移动其他子类?

具有多个 "chart areas"的 Javascript 图表

javascript - 使用 Ajax 调用的结果更新 div

javascript - ajax中js封装函数的返回值

iOS mapView animatesDrop

javascript - 如何在滚动事件上设置背景颜色不透明度的动画?

javascript - Glitchy-Freezing - 滚动动画不流畅 - 使用 requestAnimationFrame