2

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

这是我创建的,但是,我怀疑它的运行情况,即浏览器是否需要大量 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);
});

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

PS。因为这是一个网站的横幅,我不担心会变id大,因为人们可能已经继续前进了。

4

1 回答 1

2

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

  • 您可能希望动态读取标题的数量,而不必在脚本顶部指定它们。
  • 您在每个标题中使用了相同的选择器 $("#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();
});
于 2011-07-11T12:50:10.103 回答