【问题标题】:jQuery fadeIn and fadeOut - swapping divsjQuery fadeIn 和 fadeOut - 交换 div
【发布时间】:2011-04-06 18:19:00
【问题描述】:

总的来说,我是 jQuery 和 javascript 的新手,但多亏了这些网站。

我有一个包含六个隐藏 div 的页面,这些 div 使用具有单独 ID 的相应链接调用。当每个 div 变为可见 (.fadeIn) 时,当前显示的 div 将被隐藏 (.fadeOut)。

一切正常,但我的代码似乎真的很长而且很笨拙。 请问有没有更简单、更短、代码量更少的方法来执行相同的任务?

这是我的 js:

提前非常感谢。 迈克

$(document).ready(function(){

$("#link1").click(function() {
$("#panel2").fadeOut("slow", function() {                       
$("#panel3").fadeOut("slow", function() {
$("#panel4").fadeOut("slow", function() {                       
$("#panel5").fadeOut("slow", function() {
$("#panel6").fadeOut("slow", function() {
$("#panel1").fadeIn("slow")});
});
});
});
});
});

$("#link2").click(function() {
    $("#panel1").fadeOut("slow", function() {
$("#panel3").fadeOut("slow", function() {
$("#panel4").fadeOut("slow", function() {                       
$("#panel5").fadeOut("slow", function() {
$("#panel6").fadeOut("slow", function() {
$("#panel2").fadeIn("slow")});
});
});
});
});
});

$("#link3").click(function() {
    $("#panel1").fadeOut("slow", function() {
$("#panel2").fadeOut("slow", function() {
$("#panel4").fadeOut("slow", function() {                       
$("#panel5").fadeOut("slow", function() {
$("#panel6").fadeOut("slow", function() {
$("#panel3").fadeIn("slow")});
});
});
});
});
});

$("#link4").click(function() {
    $("#panel1").fadeOut("slow", function() {
$("#panel2").fadeOut("slow", function() {
$("#panel3").fadeOut("slow", function() {                       
$("#panel5").fadeOut("slow", function() {
$("#panel6").fadeOut("slow", function() {
$("#panel4").fadeIn("slow")});
});
});
});
});
});

$("#link5").click(function() {
    $("#panel1").fadeOut("slow", function() {
$("#panel2").fadeOut("slow", function() {
$("#panel3").fadeOut("slow", function() {                       
$("#panel4").fadeOut("slow", function() {
$("#panel6").fadeOut("slow", function() {
$("#panel5").fadeIn("slow")});
});
});
});
});
});

$("#link6").click(function() {
    $("#panel1").fadeOut("slow", function() {
$("#panel2").fadeOut("slow", function() {
$("#panel3").fadeOut("slow", function() {                       
$("#panel4").fadeOut("slow", function() {
$("#panel5").fadeOut("slow", function() {
$("#panel6").fadeIn("slow")});
});
});
});
});
});

});

【问题讨论】:

    标签: jquery html fadein fadeout


    【解决方案1】:

    有你的 id 可能是这样的:

    $.each([1,2,3,4,5,6], function(_, index) {
        $('#link' + index).click(function() {
            $('[id^=panel]').fadeOut('slow', function() {
                $('#panel' + index).fadeIn('slow');
            });
        })
    })
    

    【讨论】:

      【解决方案2】:
      $(document).ready(function(){
      
         $("a[id^='link']").click(function() {
            $("div[id^='panel']").fadeOut("slow");
            $("div#"+this.id.replace('link', 'panel')).fadeIn("slow");
         });
      });
      

      【讨论】:

      • 这将同时淡出所有面板,而不是像原始代码那样按顺序淡出。您可以使用递归函数或 fxQueues 插件:plugins.jquery.com/project/fxqueues
      • @user120242 : 如果我使用 each(),那么。
      • 还是不行。队列由 div 附加。此外,这会引发错误。
      • 在重新阅读 OP 之后,我意识到 OP 实际上可能并不打算让它们依次淡出。看来他可能是无意的。
      • 已排序!只是想非常感谢所有评论并试图帮助我的人。你们所做的事情和做事的方式令人惊叹且鼓舞人心。希望我将来可以对某人有用。迈克
      【解决方案3】:

      这段代码当然可以变得更加高效和灵活,但对于上面的一个简单的 6 元素示例,它应该就足够了。这主要是为了证明概念。

      我选择以编程方式添加类,但理想情况下,您应该在 HTML 中添加类。如果是我,我可能也会使用 expandos 而不是 id 字符串替换。

      编辑,已添加修复:
      顺序动画的递归函数确保在正确的时间处理淡入淡出。对此可能有更有效的方法,例如使用计数器,但对于 6 个元素应该没问题,这更忠实地匹配您的原始代码。
      修复了在不正确的时间处理动画,例如当您同时单击多个链接时,通过停止和结束动画导致多个面板尝试淡入。

      jQuery(function($){
          //add links/panels class to all elements whose id begins with link/panel
          $("[id^=link]").addClass("links");
          $("[id^=panel]").addClass("panels");
      
          $(".links").click(function(e){
              //find all panels, make a normal array, and stop/finish all animations
              var panels=$.makeArray($(".panels").stop(true, true));
      
              //find panel to show
              var panelShow=$("#"+this.id.replace("link","panel"));
      
              //recursive function to execute fades in sequence
              function queueFX(queue){
                  if(queue.length==0){
                      panelShow.fadeIn("slow");
                      return;
                  }
                  $(queue.shift()).fadeOut("slow", function(){
                      queueFX(queue);
                  });
              }
              queueFX(panels);
      
              //stop event propogation and default behavior, commented out because you don't seem to want this behavior
              e.preventDefault();
              //e.stopPropagation();
              //return false;
          });
      });
      

      【讨论】:

      • 为此感谢一百万。但是,我的链接停止使用此功能。我有六个带有 href="#" 标签的唯一 ID 链接。我应该使用不同的东西吗?
      • 这很奇怪。我在您提供的页面上自己测试了它,它似乎对我来说没问题。如果需要,您可以修改“return false”。我添加了它,以便它不会尝试浏览链接。可能不是你想要的
      • 注释掉了 return false 并对其进行了解释,并添加了一些修复程序,使动画的行为符合您的预期。
      • 真的希望我能理解这一点,因为你们都很乐于助人。我的链接仍然无法使用此代码。认为我将不得不参加“不要成为背后的痛苦”的课程。 :o)
      • 我真的不应该被允许自己出去!对我的无知感到非常尴尬,非常感谢您的坚持和解释。我总是对像这样的网站如何运作以及人们多么乐意帮助完全陌生的人解决他们的问题感到惊讶。如果世界只由极客而不是政客来管理,那将是一个地狱般的居住地!非常感谢。迈克
      【解决方案4】:

      最好的方法是使用http://api.jquery.com/toggle/

      Toggle 可让您为一个人制作动画

      $('#clickme').click(function() {
        $('#book').toggle('slow', function() {
          // Animation complete.
        });
      });
      

      至于真正缩短代码,我会为您的面板使用类标识符。

      识别面板组,如

      $("#panel3").fadeOut("slow", function() {
      $("#panel4").fadeOut("slow", function() {                       
      $("#panel5").fadeOut("slow", function() {
      $("#panel6").fadeOut("slow", function() {
      

      然后为相关的 HTML 元素分配一个类

      您的 jQuery 现在可以是 $(".panelGroup1").fadeOut...

      . jQuery 的类选择器,# 是 id 选择器。

      查看选择器,您可以做很多其他疯狂的事情

      http://api.jquery.com/?ns0=1&s=Selector&go=

      【讨论】:

      • 谢谢保罗。我会检查一下。就 js 而言,我真的是一个菜鸟,还有很多东西要学。因此上面的巨大代码。 :o)
      • 我去年刚刚经历了这一切。正是堆栈溢出之类的地方让我免于浏览 jquery api 网站数小时。
      • 我仍然发现像你们这样的人的慷慨,以及你们的时间和知识,令人惊叹。感谢一百万提供您的帮助。我正在学习负荷。干杯,
      【解决方案5】:

      很多好的解决方案,我有一个一般性的评论:

      每个面板都有一个唯一的 id 似乎有点不必要。您可能有充分的理由这样做,但是将面板与类选择器分组还不够吗?这将使您的整体代码以及您的 jquery 更加简单和易于维护。

      【讨论】:

      • 每个面板都有一个在 CSS 中调用的独特背景,以适应该面板上的内容。这是唯一的原因。
      【解决方案6】:

      你可以这样做

      function fadeElementIn(fadedElement) {
          $("[id^=panel]").fadeOut("slow");
          $(fadedElement).fadeIn("slow");
      }
      

      然后:

      $(document).ready(function(){
      
          $("#link1").click(fadeElementIn($("#panel1")));
          $("#link2").click(fadeElementIn($("#panel2")));
          $("#link3").click(fadeElementIn($("#panel3")));
          $("#link4").click(fadeElementIn($("#panel4")));
      }
      

      如果您希望淡出的元素和淡入的元素占据相同的空间,请记住调整元素的位置

      干杯

      【讨论】:

      • 谢谢,我试试这个。为什么需要调整定位?我可以将函数的第二部分添加为回调吗?这样,fadedOut 元素将在 fadeIn 元素出现之前在 CSS 中为 display:none。还是我错过了什么?
      • 哦,是的,你当然可以这样做,我只是想象它从一个到另一个“变形”(即旧的淡出,而新的淡入淡出) .但是,是的,你完全可以做到这一点。
      • 我终于搞定了。感谢一百万您的时间和专业知识。这个网站(和你们)很棒。我希望修理我车的人也一样慷慨。 :o) 干杯
      猜你喜欢
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 2013-11-28
      • 1970-01-01
      • 2011-10-01
      • 2013-03-03
      • 1970-01-01
      相关资源
      最近更新 更多