淡入淡出/ css 类过渡发生乱序

Posted

技术标签:

【中文标题】淡入淡出/ css 类过渡发生乱序【英文标题】:fade / css class transition happening out of order 【发布时间】:2013-12-18 20:50:31 【问题描述】:

我有几个想要淡出的页面元素。然后我更改它们的 css 类(虽然它们不可见),然后将它们淡入。

我以为我已经正确地订购了执行流程,但确实在 fadeOut 完成之前发生了 css 类转换。视觉上发生的事情是一个人看到 css 发生变化,然后发生淡出。

您可以在下面的链接中看到它。在幻灯片 1 和 2 之间发生了这种情况,但并不像从 a 类到 a 类的 css 变化那样明显。在幻灯片 2 和 3 之间,您可以看到它是从 a 类到 b 类。

http://staging.alexandredairy.com

jquery 转换代码 onReady 启动它:

var txtread = 

    onReady: function(_imgname)
    
        txtread.fadeoutText(_imgname);

        txtread.fadeinText();
    ,

    fadeoutText: function(_imgname)
    
        $("#pagetitle").fadeOut(1250);
        $("#pagemenu").fadeOut(1250);
        $("#pageslogan").fadeOut(1250);
        $("#sitecopy").fadeOut(1550, txtread.TextReadabilityHandler(_imgname));
    ,

    fadeinText: function()
    
        $("#pagetitle").fadeIn(1250);
        $("#pagemenu").fadeIn(1250);
        $("#pageslogan").fadeIn(1250);
        $("#sitecopy").fadeIn(1250);
    ,

    TextReadabilityHandler: function(_imgNameSwitch)
    
        if(_imgNameSwitch == 'Light')
        
            $("#pagetitle").attr('class', 'sitetitle lighttextbackground');
            $("#pagemenu").attr('class', 'sf-menu lighttextbackground');
            $("#pageslogan").attr('class', 'slogan lighttextbackground');
        
        else if (_imgNameSwitch == 'Dark_')
        
            $("#pagetitle").attr('class', 'sitetitle darktextbackground');
            $("#pagemenu").attr('class', 'sf-menu darktextbackground');
            $("#pageslogan").attr('class', 'slogan darktextbackground');
        
        else
         alert(_imgNameSwitch); 
    

所以我认为执行顺序、更长的fadeOut 以及最后设置fadeOut 完成功能可以使事情保持井然有序,但唉。我错了。

谢谢


编辑

所以现在我尝试了 window.setTimeout,它的行为与超时甚至没有运行时完全相同???

好吧,我的错。我最初尝试过:

window.setTimeout(txtread.TextReadabilityHandler(_imgname), 3000);

这没有错误或工作。然后我回去重读了一点,看到使用回调,所以我这样重写:

window.setTimeout(function() txtread.TextReadabilityHandler(_imgname); , 3000);

现在它正在工作。

我原来的问题仍然适用。我知道 javascript 是一种异步编程语言,但它是必要的,不是吗?可能我脑子里的术语都乱七八糟了。

以下是否一个接一个地执行:

alert('1');
alert('2');
alert('3');

还是它们都同时执行?

【问题讨论】:

【参考方案1】:

您的代码包括以下内容。

onReady: function(_imgname)

    txtread.fadeoutText(_imgname);
    txtread.fadeinText();

您认为txtread.fadeinText()txtread.fadeoutText(_imgname) 完成之前不会运行是正确的。但是,fadetextOut 比您预期的要完成。

fadeoutText: function(_imgname)

    $("#pagetitle").fadeOut(1250);
    $("#pagemenu").fadeOut(1250);
    $("#pageslogan").fadeOut(1250);
    $("#sitecopy").fadeOut(1550, txtread.TextReadabilityHandler(_imgname));

将几乎立即返回,并告知各种元素在一段时间内淡出。所以调用txtread.fadeinText() 不会等待这些元素淡出。

您需要向fadeinTextfadeoutText 添加某种形式的回调,您可以使用它来让其他代码知道它们已经完成,就像这样。

onReady: function(_imgname)

    txtread.fadeoutText(_imgname, function () 
        txtread.fadeinText();
    );


fadeoutText: function(_imgname, cb)

    $("#pagetitle").fadeOut(1250);
    $("#pagemenu").fadeOut(1250);
    $("#pageslogan").fadeOut(1250);
    $("#sitecopy").fadeOut(1550, function() 
        txtread.TextReadabilityHandler(_imgname);
        cb();
    );


fadeinText: function(cb)

    $("#pagetitle").fadeIn(1250);
    $("#pagemenu").fadeIn(1250);
    $("#pageslogan").fadeIn(1250);
    $("#sitecopy").fadeIn(1250, cb);

【讨论】:

这就是为什么在我的编辑中 setTimeout 回调起作用的原因。非常感谢您的解释!【参考方案2】:

在javascript中的命令是按顺序执行的,问题是如果你在一个命令中出错,它可能会阻止整个脚本的执行。

http://www.w3schools.com/js/js_statements.asp

每条语句由浏览器按照它们的顺序执行 写的。

【讨论】:

【参考方案3】:

正如迈克尔所说,javascript 将同时运行。所以,运行你的淡出函数,然后,一旦它们完成,调用 csschange 函数,一旦完成,运行淡入函数。

我可以用 jQuery 编写这个(因为添加一个函数在另一个函数完成后运行很容易)。它应该在纯 js 中直截了当,我只是不太了解语法。 . .

【讨论】:

【参考方案4】:

警报将按顺序执行。 Javascript 是单线程的。

编辑:呃,我猜这是真的大部分情况

查看此链接以获得良好的解释,特别是关于淡入淡出等。 Is JavaScript guaranteed to be single-threaded?

【讨论】:

以上是关于淡入淡出/ css 类过渡发生乱序的主要内容,如果未能解决你的问题,请参考以下文章

使用 CSS 过渡的滑动 + 淡入淡出效果

在 css jQuery 中应用淡入淡出到粘性导航的过渡淡入淡出

CSS 过渡 - 仅在悬停时淡入淡出元素

在 jQuery 中与 CSS 中的过渡同时使用淡入淡出和淡出

Vue CSS淡入/淡出视频过渡

CSS过渡在悬停时淡入淡出