【问题标题】:Fading banner like text with jQuery使用 jQuery 淡化像文本一样的横幅
【发布时间】:2011-07-11 09:14:14
【问题描述】:

我有一个标题文本,我想将其淡入一个框中。 之后,字幕应在其下方淡入。 一旦两者都可见,它们应该淡出,下一组应该淡入,以相同的方式。

这是我创建的,但是,我怀疑它的运行情况,即浏览器是否占用大量 CPU。我关心的一个问题也是 Javascript 的递归深度。

我有以下代码(我也包含在 jsfiddle 中,以及 CSS 和 HTML http://jsfiddle.net/ukewY/1/

var no = 3;

function fadeText(id) {
  // Fade in the text
  $("#text" + id).animate({
    opacity: 1,
    left: '+=50'
  }, 5000, function() {
    // Upion completion, fade in subtext
    $("#subtext" + id).animate({
      opacity: 1,
    }, 5000, function() {
      // Upon completion, fade the text out and move it back
      $("#subtext" + id).animate({
        opacity: 0, 
      }, 1000, function() {
        $("#text" + id).animate({
          opacity: 0,
          left: '+=200'
        }, 3000, function() {
          // Yet again upon completion, move the text back 
          $("#text" + id).css("left", "19%");
          $("#subtext" + id).css("left", "10%")
          fadeText((id % no) + 1);
        });
      });
    });
  });
}

$(document).ready(function() {
  fadeText(1);
});

我的问题是这是否是正确的做法;或者如果有更好的,也许是非递归的方式来做到这一点?

附言。因为这是一个网站的横幅,我不担心id 太大,因为人们可能从那以后继续前进。

【问题讨论】:

    标签: jquery recursion correctness fading


    【解决方案1】:

    递归对我来说似乎很好,但我发现了其他一些东西:

    • 您可能希望动态读取标题的数量,而不是在脚本顶部指定它们。
    • 您在每个标题中使用了相同的选择器 $("#text" + id) 和 $("#subtext" + id) 两次。您应该只执行一次,并将其分配给一个变量。这意味着您只有一个函数调用,而不是两个。
    • 您可能希望使用 eq() 选择器来消除对 $("text" + id) 的需求并使其更整洁
    • 即使只有 1 个值(特别是“{opacity: 0,}”),您传递给 animate() 的数据映射也以逗号结尾。这会导致某些浏览器出现问题。
    • 我不是 100% 确定,但我认为从内部调用一个函数是不好的,你应该使用 setTimeout(如果你需要使用 eval() 向函数传递一些参数来避免它,请使用匿名函数)
    • 我知道你说没关系,但是如果用户只是让你的页面保持打开状态(例如接听电话然后必须冲出去),就会发生 id 太大的情况。他们不应该重蹈覆辙。
    • 您可以使用 $(DO STUFF) 而不是 $(document).ready(DO STUFF)

    我拿走了这些,并随意将您的代码调整为以下内容:

    function fadeText() {
        thistext = $text.eq(titleid);
        thissubtext = $subtext.eq(titleid);
        thistext.animate({
            opacity: 1,
            left: '+=50'
        }, 5000, function () {
            thissubtext.animate({
                opacity: 1
            }, 5000, function () {
                thissubtext.animate({
                    opacity: 0
                }, 1000, function () {
                    thistext.animate({
                        opacity: 0,
                        left: '+=200'
                    }, 3000, function () {
                        thistext.css("left", "19%");
                        thissubtext.css("left", "20%");
                        if (titleid != $text.length - 1) {
                            titleid++;
                        } else {
                            titleid = 0;
                        }
                        setTimeout(fadeText, 0);
                    });
                });
            });
        });
    }
    
    var titleid=0;
    
    $(function () {
      $text = $("span.floating-text");
      $subtext = $("span.floating-subtext");
      fadeText();
    });
    

    【讨论】:

    • 太棒了!非常感谢。但是,我讨厌 if-clauses,所以我将其替换为:titleid = (titleid + 1) % $text.length;
    • 我不明白你在用那个百分比/模运算符做什么。它实际上工作得很好。它比 if 语句更有效吗?这就是你不喜欢 if 语句的原因还是还有其他原因?也可以在一行上用 titleid=(titleid==2)?0:titleid+1;但我想这只是一个伪装的 if 语句
    • 是的,这几乎是主要原因。如果不使用if-clause,就无法编码,但是如果我能阻止它,我会以不同的方式进行。它通常也更快:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 2014-01-28
    • 2014-06-04
    • 1970-01-01
    相关资源
    最近更新 更多