【问题标题】:How to fade between two HTML fragments in jQuery如何在jQuery中的两个HTML片段之间淡入淡出
【发布时间】:2013-02-26 17:06:13
【问题描述】:

http://jsfiddle.net/SVtJV/16/

$( document ).ready(function() {
    for (var i=0; i<3; i++) {
        setTimeout(function() {
            $("#footer-address").fadeOut(400);
        }, 2000);
        setTimeout(function() {
            $("#footer-address").fadeIn(400).html("<strong>Our Place</strong>  New Address Location");
        }, 2400);
        i++;
    }
});

我正在尝试使用 setTimeout 函数获取一段代码,以便使用 for 循环运行 3 或 4 次。从逻辑上讲,我可以看到我在 for 循环中的代码不想重复自己,可能是因为 setTimeout 时间值已经过去了。

有没有办法在循环之前重置时间值?还是有更好的方法来执行最终目标?

【问题讨论】:

  • 我看到了 2 件事...您将 i 增加了两次,并且您在任何时候都不会将 $('#footer-address').html() 恢复到其原始状态。

标签: javascript jquery for-loop settimeout


【解决方案1】:

每个 for 循环不等待超时完成,整个 for 循环可能在 20 毫秒内完成:D 如果你想重复淡入淡出,你必须做一个带有回调的小函数。

    $( document ).ready(function() {
    var repeats = 4,
        times = 0,
        fade = function() {
            if (times >= repeats) return false;
            times++;
            $('#footer-address').fadeTo(400, 0, function() {
                $('#footer-address').html('text 1');
                $('#footer-address').fadeTo(400, 1, function() {
                    setTimeout(fade, 1000);
                });
            }); 
        };

    setTimeout(fade, 1000);
});

我不太明白你想用那里的 .html() 做什么。会反复改变吗?

已编辑。

【讨论】:

  • 谢谢,我只是想让“我们已经搬家...”与“新地址”交替出现。 .html() 旨在将新文本插入#footer-address id。
【解决方案2】:

我认为这是最干净的解决方案

See it here on jsfiddle

$(function() {
    var times = 3,
        elem = $('#footer-address')
        fader = setInterval(function() {
            elem.fadeOut(400, function() {
                elem.fadeIn(400);
            });
            if (--times === 0) {
                clearInterval(fader);
            }
        }, 1200);
});

调整计时数字,直到您对结果满意为止。

【讨论】:

  • 但是如何让元素在“我们已经搬家...”和“新地址”之间交替?
【解决方案3】:

正如其他人所提到的,您在两个地方增加了i(在for 事后思考和循环体中),因此删除主体分配是要修复的第一部分。此外,原始 HTML 不会被“放回”。

但是,这不是主要问题。 JavaScript 立即执行循环(两次),因此所有淡出/淡入函数分别在 2000/2400 毫秒后执行,而不是按预期在超时后执行。您可以通过在演示中使用 console.log(i);alert(i); 代替 i++ 来检查这一点,并在页面加载后立即看到 3 条日志行/警报。

我会将标记放置为 HTML,而不是在 JavaScript 中创建它,然后在 2 个 HTML 片段之间淡入淡出,例如参见 demo 或以下示例代码。

HTML

<div id="footer-address">
    <span><strong>We have moved!</strong> Our new address is:</span>
    <span><strong>Our Place</strong>  New Address Location</span>
</div>

CSS

#footer-address {
    margin-bottom: 2px;
    text-transform: uppercase;
    margin: 0;
    padding: 0;
    font-family: Arial,Helvetica,sans-serif;
    font-size: 10px;
}

#footer-address span:last-child {
    display:none;
}

JavaScript(需要 jQuery)

var $footer = $('#footer-address');
var i = 0;

(function swap(){
    var $hiddenSpan = $footer.find('span:hidden')

    $footer.find('span:visible').fadeOut(400, function() {
        $hiddenSpan.fadeIn(400)
    })

    if (i++ < 3) setTimeout(swap, 2000)
})();

JavaScript 使用以 2 秒为间隔运行 3 次的自执行函数(请参阅 http://sarfraznawaz.wordpress.com/2012/01/26/javascript-self-invoking-functions/)。我还利用了 jQuery .fadeOut() 函数的 callback(第二个)参数,以便 .fadeIn() 在fadeOut 完成后启动。

我确信这里还有改进的余地,但希望它仍然有用。

【讨论】:

  • 太棒了!谢谢你的课。
  • 嗯,实现在小提琴演示中看起来不错,但在我的网站上不太好。这是我的网站代码:
  • 'code' '代码'
  • 基本上 是隐藏的,但不会发生交换。
  • 我认为这是因为在小提琴中,我使用了“onDomReady”选择(参见左上角的下拉菜单),它将所有 jQuery 包装在 document ready 函数中$(function(){ });。如果您查看源代码 演示 iFrame,您将看到它。我认为您的网站无法正常运行,因为浏览器的 JavaScript 引擎正在尝试在未加载 jQuery 的情况下使用 jQuery 函数。 文档就绪将延迟执行,直到页面和所有资源(包括脚本)都已完全加载。
猜你喜欢
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
相关资源
最近更新 更多