2011-08-16 38 views
1

私はタイマーの画像スライダーとしてリスト項目をループするのに同じコードを使用しました。今度は、「次へ」と「前へ」ボタンを追加してユーザーエクスペリエンスを向上させたいと思います。私はスタックの周りを見て、いくつかのことを試して、これに対する解決策を考え出すことができません。jQueryスライダー - 次と前のボタンを追加

<div class="container"> 
    <div class="tabs"> 
    <nav> 
     <ul id="tabs"> 
     <li><a href="javascript:;" class='current'>Tab1</a></li> 
     <li><a href="javascript:;">Tab1</a></li> 
     <li><a href="javascript:;">Tab2</a></li> 
     <li><a href="javascript:;">Tab3</a></li> 
     <li><a href="javascript:;">Tab4</a></li> 
     <li><a href="javascript:;">Tab5</a></li> 
     <li><a href="javascript:;">Tab6</a></li> 

     </ul> 
    </nav> 
    <!-- end .tabs --> 
    </div> 
    <div class="content"> 
    <div id="feature_list"> 
    <div id="prev" class="arrows prev"><a href="#">PREV</a></div> 
     <ul id="output"> 
      <li><a href="#" target="_parent" class="corresp">Output1</a></li> 
      <li><a href="#" target="_parent">Output2</a></li> 
      <li><a href="#" target="_parent">Output3</a></li> 
      <li><a href="#" target="_parent">Output4</a></li> 
      <li><a href="#" target="_parent">Output5</a></li> 
      <li><a href="#" target="_parent">Output6</a></li> 
      <li><a href="#" target="_parent">Output7</a></li> 
     </ul> 
     <div id="next" class="arrows next"><a href="#">NEXT</a></div> 
    </div> 
    <!-- end .content --> 
    </div> 

今すぐOK jQueryの隣にあります。ここではまず

はHTMLコードです。しかし、最初に私は説明する必要があります、コードは、各アンカータグで 'current'クラスを追加して削除する最初のものから、id "tabs"でリストをループします。その後、 '出力'リスト内の対応する項目が検索され、その出力が表示されます。ここにコードがあります:

<script src="http://code.jquery.com/jquery-1.6.2.min.js"></script> 

<script type="text/javascript"> 
     (function($) { 
      $.fn.featureList = function(options) { 
       var tabs = $(this); 
       var output = $(options.output); 
       new jQuery.featureList(tabs, output, options); 
       return this;  
      }; 
      //Loops through tab to next and displays cooresponding output 
      $.featureList = function(tabs, output, options) { 
       function slide(nextli) { 
        if (typeof nextli == "undefined") { 
         nextli = visible_item + 1; 
         nextli = nextli >= total_items ? 0 : nextli; 
         prevli = visible_item - 1; 
         prevli = prevli >= total_items ? 0 : prevli; 
        } 

        tabs.removeClass('current').filter(":eq(" + nextli + ")").addClass('current'); 

        output.stop(true, true).filter(":visible").removeClass('cooresp').css({zIndex:10}).fadeOut(); 
        output.filter(":eq(" + nextli + ")").addClass('cooresp').css({zIndex:15}).fadeIn(function() { 
         visible_item = nextli;  
        }); 
       } 

       var options   = options || {}; 
       var total_items  = tabs.length; 
       var visible_item = options.start_item || 0; 

       options.pause_on_hover  = options.pause_on_hover  || true; 
       options.transition_interval = options.transition_interval || 4000; 

       output.hide().eq(visible_item).show(); 
       tabs.eq(visible_item).addClass('current'); 

       tabs.click(function() { 
        if ($(this).hasClass('current')) { 
         return false;  
        } 

        slide(tabs.index(this)); 
       }); 

       if (options.transition_interval > 0) { 
        var timer = setInterval(function() { 
         slide(); 
        }, options.transition_interval); 

        if (options.pause_on_hover) { 
         tabs.mouseenter(function() { 
          clearInterval(timer); 

         }).mouseleave(function() { 
          clearInterval(timer); 
          timer = setInterval(function() { 
           slide(); 
          }, options.transition_interval); 
         }); 
        } 
       } 
      }; 
     })(jQuery); 
    </script> 
    <script language="javascript"> 
     $(document).ready(function() { 
      $.featureList(
       $("#tabs li a"), 
       $("#output li"), { 
        start_item : 0 
       } 
      ); 
      var next = $("#feature_list #next a"); 
      var prev = $("#feature_list #prev a"); 
      var tabs = $('#tabs li a'); 
      next.click(function(){ 
       var tabli = $('#tabs li a.current'); 
       //var current = $('.selectoption li:visible'); 
       var output = $("#output li.cooresp"); 

       var currentli = $('#tabs li a.current'); 
       output.stop(true, true).css({zIndex:10}).fadeOut(); 
       output.prev().css({zIndex:15}).fadeIn(function() { 
         tabsli.prev('a').addClass('current'); 
       }); 
      }); 

      prev.click(function(){ 
       var tabli = $('#tabs li a.current'); 
       //var current = $('.selectoption li:visible'); 
       var output = $("#output li.cooresp"); 

       var currentli = $('#tabs li a.current'); 
       output.stop(true, true).css({zIndex:10}).fadeOut(); 
       output.prev().css({zIndex:15}).fadeIn(function() { 
         tabli.stop(true, true).removeClass('current'); 
         $('#tabs li a').prev().addClass('current'); 
       }); 
      });  
     }); 
    </script> 

誰かが「次へ」ボタンをクリックすると、前の画像が表示されるようにしました。これは機能します(しかし、それはラウンドアラウンドの方法かもしれません)。 .prev関数と.next()関数を使用しようとするときの主な問題は、現在のクラスが前後に移動するのに失敗しました。私は両方のリストが常にそれぞれのリストの同じ番号になるようにしたい。 'current'クラスがfirst:またはlast:のいずれかにある場合は、タイマーのようにループします。

誰でも助けていただければ幸いです。さらに詳しい情報が必要な場合は、すぐに尋ねてください。前もって感謝します! [OK]を

EDIT

ので、私はnext.clickを取り出してちょうどtabs.clickの下で、メインコードエリアに戻ってそれを入れてみました:

   next.click(function() { 
        currentli = $('a.current'); 
        nextli = currentli.parent().siblings().next('li').find('a'); 
        console.log(currentli.parent().siblings().next('li').find('a')); 
        slide(tabs.index(nextli)); 
       }); 

このALMOST作品!唯一の問題は、変数 'nextli'が静的であり、その値がDOMロード時に決定されることです。次のボタンがクリックされるたびにではありません。クリックごとに「nextli」を評価するにはどうすればよいですか?

答えて

0

これは私の答えです。 JSLintによると完璧ではありませんが、私がしたいことをほぼ正確に行います。

(function($) { 
    $.fn.featureList = function(options) { 
     var tabs = $(this); 
     var output = $(options.output); 

     new jQuery.featureList(tabs, output, options); 
     return this; 
    }; 
    //Loops through tab to next and displays cooresponding output 
    $.featureList = function(tabs, output, options) { 
     function slide(nextli) { 
      if (typeof nextli == "undefined") { 
       nextli = visible_item + 1; 
       nextli = nextli >= total_items ? 0 : nextli; 
      } 
      var futureli = nextli + 1; 
      futureli = futureli >= total_items ? 0 : futureli; 
      var pastli = nextli - 1; 
      pastli = pastli >= total_items ? 0 : pastli; 

      tabs.removeClass('current').filter(":eq(" + nextli + ")").addClass('current'); 
      tabs.removeClass('previous').filter(":eq(" + pastli + ")").addClass('previous'); 
      tabs.removeClass('nextup').filter(":eq(" + futureli + ")").addClass('nextup'); 

      output.stop(true, true).filter(":visible").removeClass('cooresp').css({ 
       zIndex: 10 
      }).fadeOut(); 
      output.filter(":eq(" + nextli + ")").addClass('cooresp').css({ 
       zIndex: 15 
      }).fadeIn(function() { 
       visible_item = nextli; 
       next_item = futureli; 
       prev_item = pastli; 
      }); 
     } 

     function prevslide(nextli) { 
      if (typeof nextli == "undefined") { 
       nextli = visible_item - 1; 
       nextli = nextli >= total_items ? (tabs.length -1) : nextli; 
      } 
      if ((nextli < 0)) { 
       nextli = (tabs.length -1); 
      } 
      var futureli = nextli + 1; 
      futureli = futureli >= total_items ? (tabs.length -1) : futureli; 
      var pastli = nextli - 1; 
      pastli = pastli >= total_items ? (tabs.length -1) : pastli; 


      tabs.removeClass('current').filter(":eq(" + nextli + ")").addClass('current'); 
      tabs.removeClass('previous').filter(":eq(" + pastli + ")").addClass('previous'); 
      tabs.removeClass('nextup').filter(":eq(" + futureli + ")").addClass('nextup'); 

      output.stop(true, true).filter(":visible").removeClass('cooresp').css({ 
       zIndex: 10 
      }).fadeOut(); 
      output.filter(":eq(" + nextli + ")").addClass('cooresp').css({ 
       zIndex: 15 
      }).fadeIn(function() { 
       visible_item = nextli; 
       next_item = futureli; 
       prev_item = pastli; 
      }); 
     } 

     var options = options || {}; 
     var total_items = tabs.length; 
     var visible_item = options.start_item || 0; 
     var next_item = (visible_item + 1) || 1; 
     var prev_item = (visible_item - 1) || (tabs.length -1); 
     var next = $('#feature_list #next a'); 
     var prev = $('#feature_list #prev a'); 
     var mainIMG = $("#output li"); 

     options.pause_on_hover = options.pause_on_hover || true; 
     options.transition_interval = options.transition_interval || 6000; 
     prev.pause_on_hover = prev.pause_on_hover || true; 
     next.pause_on_hover = next.pause_on_hover || true; 
     mainIMG.pause_on_hover = mainIMG.pause_on_hover || true; 

     output.hide().eq(visible_item).show(); 
     tabs.eq(visible_item).addClass('current'); 

     tabs.click(function() { 
      if ($(this).hasClass('current')) { 
       return false; 
      } 
      slide(tabs.index(this)); 
     }); 
     findCurrentli = function(currentTag) { 
      var currentli = currentTag; 
      var nextli = currentli.parent().siblings().next('li').find('a'); 
      console.log(currentli.parent().siblings().next('li').find('a')); 
      slide(tabs.index(nextli)); 
     }; 
     prev.click(function(e) { 
      e.preventDefault(); 
      var prevli = $('#tabs li a.previous'); 
      var currentli = $('#tabs li a.current'); 
      var nextli = $('#tabs li a.nextup'); 
      console.log(prevli); 
      currentli.addClass('nextup'); 
      currentli.parent().siblings().prev('li a').addClass('previous'); 
      prevslide(tabs.index(prevli)); 
     }); 
     next.click(function(e) { 
      e.preventDefault(); 
      var prevli = $('#tabs li a.previous'); 
      var currentli = $('#tabs li a.current'); 
      var nextli = $('#tabs li a.nextup'); 
      currentli.addClass('previous'); 
      nextli.parent().siblings().next('li a').addClass('nextup'); 
      slide(tabs.index(nextli)); 
     }); 


     if (options.transition_interval > 0) { 
      var timer = setInterval(function() { 
       slide(); 
      }, options.transition_interval); 

      if (options.pause_on_hover || prev.pause_on_hover || next.pause_on_hover || mainIMG.pause_on_hover) { 
       tabs.mouseenter(function() { 
        clearInterval(timer); 

       }).mouseleave(function() { 
        clearInterval(timer); 
        timer = setInterval(function() { 
         slide(); 
        }, options.transition_interval); 
       }); 
      } 
     } 
    }; 
})(jQuery); 

は、基本的には「次へ」ボタンをわずかに変更されたスライド()関数に便乗: は、ここで私が興味を持っていることあなたのそれらのために見つかった答えです。 'Prev'ボタンのために私はslide()のコピーを作り、それをprevslide()と呼んだ。新しい関数は、次のリスト項目を見つける代わりに、前の項目を見つけて、現在のクラスをアンカータグに追加します。 Firefoxでは、タブの1つをクリックした後に、「現在の」クラスのCSSが、タイマーがそれを過ぎて循環するまで、離れていなかったので、「前の」クラスと「次の」クラスを追加しなければならなかった。 pause_on_hoverを 'Next'で動作させる方法を教えていただけたら、& 'PREV'ボタンを押してください。

関連する問題