2017-06-24 2 views
0

現在、私が現在作成しているウェブサイト用に複数のスライダを作成中です。今私はそれを仕上げる途中で、解決できないような問題に遭遇したと信じています複数のスライダを作成し、それらを別々に機能させる

複数のスライダーがあるので、私はlengthを取得したり、要素(.slider)。 jquery lengthの値は、on-clickトリガー/イベントの条件の一部として使用されます。これは、下記のifの条件です。どのようにクリックして私の悪い英語のためのスライダを左に移動し、右

謝罪をするためにトリガーを..

$(window).on('load', function() { 
 

 

 
\t var sliderWrapper  = $('.slider-wrapper'), 
 
\t  sliderWrapperWidth = sliderWrapper.width(), 
 
\t  slider    = $('.slider'), 
 
\t  slideItems   = $('.slider .slide-items'), 
 
\t  position   = 0; 
 

 
    //var itemLengths = []; 
 

 
\t $('.slider-wrapper .slider').each(function() { 
 
\t \t var items = $(this).find('.slide-items').length; 
 
\t \t var sliderBox = $(this); 
 

 
\t \t //itemLengths.push(items.length); 
 
\t \t slideItems.outerWidth(sliderWrapperWidth/2); 
 

 

 
\t \t sliderBox.width(slideItems.outerWidth() * items ) 
 
    }); 
 

 
    $('.slider-wrapper .slider .buttons .prev').on('click', function(e) { 
 
     event.stopPropagation(); 
 
     if(position > 0) { 
 
      position--; 
 
      $('.slider-wrapper .slider').css({'right' : position*slideItems.width() }); 
 
     } 
 
    }); 
 

 
    $('.slider-wrapper .slider .buttons .next').on('click', function(e) { 
 
     event.stopPropagation(); 
 

 
\t  if(position < totalSlides - 1) { 
 
\t   position++; 
 
\t   $('.slider-wrapper .slider').css({'right' : position*slideItems.width() }); 
 
\t  } 
 
    }) 
 

 

 
})
/* http://meyerweb.com/eric/tools/css/reset/ 
 
    v2.0 | 20110126 
 
    License: none (public domain) 
 
*/ 
 
html, body, div, span, applet, object, iframe, 
 
h1, h2, h3, h4, h5, h6, p, blockquote, pre, 
 
a, abbr, acronym, address, big, cite, code, 
 
del, dfn, em, img, ins, kbd, q, s, samp, 
 
small, strike, strong, sub, sup, tt, var, 
 
b, u, i, center, 
 
dl, dt, dd, ol, ul, li, 
 
fieldset, form, label, legend, 
 
table, caption, tbody, tfoot, thead, tr, th, td, 
 
article, aside, canvas, details, embed, 
 
figure, figcaption, footer, header, hgroup, 
 
menu, nav, output, ruby, section, summary, 
 
time, mark, audio, video { 
 
    margin: 0; 
 
    padding: 0; 
 
    border: 0; 
 
    font-size: 100%; 
 
    font: inherit; 
 
    vertical-align: baseline; } 
 

 
/* HTML5 display-role reset for older browsers */ 
 
article, aside, details, figcaption, figure, 
 
footer, header, hgroup, menu, nav, section { 
 
    display: block; } 
 

 
body { 
 
    line-height: 1; } 
 

 
ol, ul { 
 
    list-style: none; } 
 

 
blockquote, q { 
 
    quotes: none; } 
 

 
blockquote:before, blockquote:after, 
 
q:before, q:after { 
 
    content: ''; 
 
    content: none; } 
 

 
table { 
 
    border-collapse: collapse; 
 
    border-spacing: 0; } 
 

 
* { 
 
    box-sizing: border-box; } 
 

 
.container { 
 
    max-width: 1280px; 
 
    margin: 0 auto; 
 
} 
 

 
.container .slider-wrapper { 
 
    margin-bottom: 40px; 
 
    background-color: grey; 
 
    overflow: hidden; 
 
} 
 

 
.container .slider-wrapper .slider { 
 
    position: relative; 
 
    right: 0; 
 
    display: flex; 
 
    flex-wrap: wrap; 
 
    overflow: hidden; 
 
} 
 

 
.container .slider-wrapper .slider > div { 
 
    padding: 10px; 
 
    background-color: #e5d0d0; 
 
} 
 

 
.container .slider-wrapper .slider > div p { 
 
    color: purple; 
 
} 
 

 
.container .slider-wrapper .buttons { 
 
    display: flex; 
 
    justify-content: space-between; 
 
    background: beige; 
 
    padding: 10px 0; 
 
} 
 

 

 
.container .slider-wrapper .buttons div { 
 
    background-color: cyan; 
 
} 
 

 
/*# sourceMappingURL=style.css.map */
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
\t <title>Multiple Sliders</title> 
 

 
\t <link rel="stylesheet" type="text/css" href="style.css"> 
 
\t <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
 
\t <script src="script.js"></script> 
 
</head> 
 

 

 
<body> 
 

 
<div class="container"> 
 

 
    <div class="slider-wrapper"> 
 
     <div class="slider"> 
 
      <div class="slide-items"> 
 
       <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
      </div> 
 

 
      <div class="slide-items"> 
 
       <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
      </div> 
 

 
      <div class="slide-items"> 
 
       <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
      </div> 
 

 
     </div> 
 

 
     <div class="buttons"> 
 
      <div class="prev"> 
 
       prev 
 
      </div> 
 

 
      <div class="next"> 
 
       next 
 
      </div> 
 
     </div> 
 
    </div> 
 

 

 
    <div class="slider-wrapper"> 
 
     <div class="slider"> 
 
      <div class="slide-items"> 
 
       <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
      </div> 
 

 

 
     </div> 
 

 
     <div class="buttons"> 
 
      <div class="prev"> 
 
       prev 
 
      </div> 
 

 
      <div class="next"> 
 
       next 
 
      </div> 
 
     </div> 
 
    </div> 
 

 
    <div class="slider-wrapper"> 
 
     <div class="slider"> 
 
      <div class="slide-items"> 
 
       <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
      </div> 
 

 
      <div class="slide-items"> 
 
       <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
      </div> 
 
     </div> 
 

 
     <div class="buttons"> 
 
      <div class="prev"> 
 
       prev 
 
      </div> 
 

 
      <div class="next"> 
 
       next 
 
      </div> 
 
     </div> 
 
    </div> 
 

 

 
    <div class="slider-wrapper"> 
 
     <div class="slider"> 
 
      <div class="slide-items"> 
 
       <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
      </div> 
 

 
     </div> 
 

 
     <div class="buttons"> 
 
      <div class="prev"> 
 
       prev 
 
      </div> 
 

 
      <div class="next"> 
 
       next 
 
      </div> 
 
     </div> 
 
    </div> 
 

 
    <div class="slider-wrapper"> 
 
     <div class="slider"> 
 
      <div class="slide-items"> 
 
       <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
      </div> 
 

 
      <div class="slide-items"> 
 
       <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
      </div> 
 
     </div> 
 

 
     <div class="buttons"> 
 
      <div class="prev"> 
 
       prev 
 
      </div> 
 

 
      <div class="next"> 
 
       next 
 
      </div> 
 
     </div> 
 
    </div> 
 

 

 

 
</div> 
 

 
</body> 
 

 
</html>

+1

あなたのイベント内の '' $(この)を使用してので見てください。イベントをトリガした要素を選択します。 – WizardCoder

+0

スライドを別々に動かすために '$(this) 'を使う方法をまだ分かっています。 – clestcruz

答えて

3

あなたにににlengthから値を渡すことができます

$('.slider-wrapper').each(function() { 
    var sliderWrapper  = $(this), 
     sliderWrapperWidth = sliderWrapper.width(), 
     slider    = sliderWrapper.find('.slider'), 
     slideItems   = sliderWrapper.find('.slider .slide-items'), 
     position   = 0; 

    //itemLengths.push(slideItems.length); 
    slideItems.outerWidth(sliderWrapperWidth/2); 


    slider.width(slideItems.outerWidth() * slideItems.length ); 

    sliderWrapper.find('.buttons .prev').on('click', function(e) { 
     ... 
    }); 

    sliderWrapper.find('.buttons .next').on('click', function(e) { 
     ... 
    }); 
}); 

このように、スライダーの各インスタンスにはそれぞれ独自のバリエーションがありますベールとイベント。

1

私は、各クリックイベント内で$(this)を使用して、現在のクリックされた要素に関連する変数を保存しました。また、属性をposition変数に置き換えた各スライダに追加して、各スライダに独自のスライダ位置が定義されるようにしました。

私は退屈しているので、コードを少しも整理しました。

$(document).ready(function() { 
 

 
    $('.prev').on('click', function(e) { 
 
     event.stopPropagation(); 
 
     // store variable relevent to clicked slider 
 
     var sliderWrapper  = $(this).closest('.slider-wrapper'), 
 
    \t  slideItems   = sliderWrapper.find('.slide-items'), 
 
      slider    = sliderWrapper.find('.slider'), 
 
      currentSlide  = sliderWrapper.attr('data-slide'); 
 

 
     // Check if data-slide attribute is greater than 0 
 
     if(currentSlide > 0) { 
 
      // Decremement current slide 
 
      currentSlide--; 
 
      // Assign CSS position to clicked slider 
 
      slider.css({'right' : currentSlide*slideItems.outerWidth() }); 
 
      // Update data-slide attribute 
 
      sliderWrapper.attr('data-slide', currentSlide); 
 
     } 
 
    }); 
 

 
    $('.next').on('click', function(e) { 
 
     event.stopPropagation(); 
 
     // store variable relevent to clicked slider 
 
     var sliderWrapper  = $(this).closest('.slider-wrapper'), 
 
    \t  slideItems   = sliderWrapper.find('.slide-items'), 
 
      slider    = sliderWrapper.find('.slider'), 
 
      totalSlides  = slideItems.length, 
 
      currentSlide  = sliderWrapper.attr('data-slide'); 
 

 
    // Check if dataslide is less than the total slides 
 
    if(currentSlide < totalSlides - 1) { 
 
     // Increment current slide 
 
     currentSlide++; 
 
     // Assign CSS position to clicked slider 
 
     slider.css({'right' : currentSlide*slideItems.outerWidth() }); 
 
     // Update data-slide attribute 
 
     sliderWrapper.attr('data-slide', currentSlide); 
 
    } 
 
    }) 
 

 
}); 
 

 
$(window).on('load', function() { 
 

 
    $('.slider-wrapper').each(function() { 
 
    var slideItems = $(this).find('.slide-items'), 
 
    items = slideItems.length, 
 
    sliderBox = $(this).find('.slider'), 
 
    sliderWrapperWidth = $(this).width(); 
 

 
    slideItems.outerWidth(sliderWrapperWidth/2); 
 
    sliderBox.width(slideItems.outerWidth() * items ); 
 
    }); 
 

 
});
/* http://meyerweb.com/eric/tools/css/reset/ 
 
v2.0 | 20110126 
 
License: none (public domain) 
 
*/ 
 
html, body, div, span, applet, object, iframe, 
 
h1, h2, h3, h4, h5, h6, p, blockquote, pre, 
 
a, abbr, acronym, address, big, cite, code, 
 
del, dfn, em, img, ins, kbd, q, s, samp, 
 
small, strike, strong, sub, sup, tt, var, 
 
b, u, i, center, 
 
dl, dt, dd, ol, ul, li, 
 
fieldset, form, label, legend, 
 
table, caption, tbody, tfoot, thead, tr, th, td, 
 
article, aside, canvas, details, embed, 
 
figure, figcaption, footer, header, hgroup, 
 
menu, nav, output, ruby, section, summary, 
 
time, mark, audio, video { 
 
margin: 0; 
 
padding: 0; 
 
border: 0; 
 
font-size: 100%; 
 
font: inherit; 
 
vertical-align: baseline; } 
 

 
/* HTML5 display-role reset for older browsers */ 
 
article, aside, details, figcaption, figure, 
 
footer, header, hgroup, menu, nav, section { 
 
display: block; } 
 

 
body { 
 
line-height: 1; } 
 

 
ol, ul { 
 
list-style: none; } 
 

 
blockquote, q { 
 
quotes: none; } 
 

 
blockquote:before, blockquote:after, 
 
q:before, q:after { 
 
content: ''; 
 
content: none; } 
 

 
table { 
 
border-collapse: collapse; 
 
border-spacing: 0; } 
 

 
* { 
 
box-sizing: border-box; } 
 

 
.container { 
 
    max-width: 1280px; 
 
    margin: 0 auto; 
 
} 
 

 
.container .slider-wrapper { 
 
    margin-bottom: 40px; 
 
    background-color: grey; 
 
    overflow: hidden; 
 
} 
 

 
.container .slider-wrapper .slider { 
 
    position: relative; 
 
    right: 0; 
 
    display: flex; 
 
    flex-wrap: wrap; 
 
    overflow: hidden; 
 
} 
 

 
.container .slider-wrapper .slider > div { 
 
    padding: 10px; 
 
    background-color: #e5d0d0; 
 
} 
 

 
.container .slider-wrapper .slider > div p { 
 
    color: purple; 
 
} 
 

 
.container .slider-wrapper .buttons { 
 
    display: flex; 
 
    justify-content: space-between; 
 
    background: beige; 
 
    padding: 10px 0; 
 
} 
 

 

 
.container .slider-wrapper .buttons div { 
 
    background-color: cyan; 
 
}
<div class="container"> 
 
    <div class="slider-wrapper" data-slide="0"> 
 
    <div class="slider"> 
 
     <div class="slide-items"> 
 
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
     </div> 
 

 
     <div class="slide-items"> 
 
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam eget ex mi. Etiam a vestibulum ligula, id porta dui. Duis in iaculis quam. Integer aliquam justo nec nibh consequat vulputate.</p> 
 
     </div> 
 

 
     <div class="slide-items"> 
 
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
     </div> 
 
    </div> 
 
    <div class="buttons"> 
 
     <div class="prev">prev</div> 
 
     <div class="next">next</div> 
 
    </div> 
 
    </div> 
 
    <div class="slider-wrapper" data-slide="0"> 
 
    <div class="slider"> 
 
     <div class="slide-items"> 
 
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
     </div> 
 
    </div> 
 
    <div class="buttons"> 
 
     <div class="prev">prev</div> 
 
     <div class="next">next</div> 
 
    </div> 
 
    </div> 
 

 
    <div class="slider-wrapper" data-slide="0"> 
 
    <div class="slider"> 
 
     <div class="slide-items"> 
 
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
     </div> 
 
     <div class="slide-items"> 
 
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam eget ex mi. Etiam a vestibulum ligula, id porta dui. Duis in iaculis quam. Integer aliquam justo nec nibh consequat vulputate.</p> 
 
     </div> 
 
    </div> 
 
    <div class="buttons"> 
 
     <div class="prev">prev</div> 
 
     <div class="next">next</div> 
 
    </div> 
 
    </div> 
 
    <div class="slider-wrapper" data-slide="0"> 
 
    <div class="slider"> 
 
     <div class="slide-items"> 
 
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
     </div> 
 
    </div> 
 
    <div class="buttons"> 
 
     <div class="prev">prev</div> 
 
     <div class="next">next</div> 
 
    </div> 
 
    </div> 
 
    <div class="slider-wrapper" data-slide="0"> 
 
    <div class="slider"> 
 
     <div class="slide-items"> 
 
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
     </div> 
 

 
     <div class="slide-items"> 
 
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
     </div> 
 
    </div> 
 
    <div class="buttons"> 
 
     <div class="prev">prev</div> 
 
     <div class="next">next</div> 
 
    </div> 
 
    </div> 
 
</div> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

1

あなたの問題は、セレクタの使用です。簡単に言えば、イベント関数内のセレクタは両方のスライダに当たっていました。しかし、答えは$(this)を使うだけでは簡単ではありません。ここでは、より長い答えです:

jqueryの力の多くは、要素イベントにリスナーを簡単に追加することです。何が起こっているか理解するために離れてあなたのコードの一部を取ることができます:

$('.slider-wrapper .slider .buttons .prev').on('click', function(e) { 
    event.stopPropagation(); 
    if(position > 0) { 
     position--; 
     $('.slider-wrapper .slider').css({'right' : position*slideItems.width() }); 
    } 
}); 

ライン$('.slider-wrapper .slider .buttons .prev')を要素セレクタであり、それはfind ALL elements that have hierarchy of classes 'slider-wrapper slider buttons prev'言います。 ALLに注意してください - これはあなたのコードが間違っている場所です - 私たちはしばらくそれを修正します。その行の最後は.on('click', function(e) {で、これはfor EACH of the elements you found, listen for click events and fire the following function when you hear oneです。

したがって、一致するすべての要素を見つけて、クリックイベントで関数を発生させます。これまでのところうまくいきましたが、clickイベントの内部では何が起こりますか、どのような一致要素が関数内のコンテキストであるかを具体的にどのように知っていますか。または、あなたのケースでは、ボタンに関連するものだけに影響を与えたいときに、両方のスライダに影響を与えることをどのようにして止めるのでしょうか?

これは問題の要点です。あなたのイベント関数内からこの行を見てください:

$('.slider-wrapper .slider').css({'right' : position*slideItems.width() }); 

この行は「このスタイル階層を持つすべての要素を見つける」と言うセレクタ$('.slider-wrapper .slider')を使用しています。私はペニーが今あなたと一緒に落ちているかもしれないと思う。スライダが1つの場合、一致する要素は1つだけですが、ページ上に2つのスライダがある場合、このセレクタに一致する2つの要素があります。結果はあなたが経験しているものです - ボタンをクリックすると両方のスライダが影響を受けます。

解決策は、このセレクタを変更して、ボタンと同じスライダにある要素のみに影響を与え、クリックが発生したボタンのコンテキストを参照する必要があるようにすることです。 HTMLを見て、ボタンから始めて、class='slider-wrapper'という要素に行き、class='slider'という子を見つけなければなりません。セレクタは次のようにする必要があります。

$(this).parents('.slider-wrapper').find('.slider').css({'right' : position*slideItems.width() }); 

ここで説明するjqueryの魔法がい​​くつかあります。 $(this)は、イベント関数内で使用され、イベントが発生した要素を参照します。要素のセレクタをclass='prev'に接続したので、選択している開始要素である$(this)を使用するとします。

.parents()は、指定された開始要素から要素の祖先ツリーをトラバースするセレクタです。 jquery chaining(セレクタ間のドット)のため、セレクタを順番に連鎖させることができるので、このようにセレクタを連鎖させてDOMを歩くことができます。 .parents('.slider-wrapper')を追加すると、class='slider-wrapper'の親を探すと言われています。

.find('.slider')は、検索セレクタを使用して、指定された要素からDOMツリー内でclass='slider'の子を検索します。

このすべての結果は、あなたがそれからスライダー1のボタンをクリックすると説明したセレクタはスライダー1.同じ2.

注意ここに幅広い外側の選択を持つことのパターンのみのスライダーに影響を与えるということですイベントリスナーを複数の要素に適用し、関数内で$(this)を使用することは、jquery発明者の意図とまったく同じです。祖先と子セレクタの使用を振りかけると、複雑なDOM構造内で簡単にナビゲーションとターゲット設定を行う強力な手段があります。

背景読書は:$(this)parents().find()

注jQueryの私は、変数totalSlidersの欠落に関連したサンプルコードで問題を修正しました。私は上記の同じテクニックを使用して、クリックされたボタンが属するスライダ内のスライダの数を数えました。

var totalSlides = $(this).parents('.slider-wrapper').find('.slide-items').length; 

私は5つのスライダが必要ないため、HTMLを少し修正しました。

$(window).on('load', function() { 
 

 

 
\t var sliderWrapper  = $('.slider-wrapper'), 
 
\t  sliderWrapperWidth = sliderWrapper.width(), 
 
\t  slider    = $('.slider'), 
 
\t  slideItems   = $('.slider .slide-items'), 
 
\t  position   = 0; 
 

 
\t $('.slider-wrapper .slider').each(function() { 
 
\t \t var items = $(this).find('.slide-items').length; 
 
\t \t var sliderBox = $(this); 
 

 
\t \t slideItems.outerWidth(sliderWrapperWidth/2); 
 

 
\t \t sliderBox.width(slideItems.outerWidth() * items ) 
 
    }); 
 

 

 
    $('.slider-wrapper .buttons .prev').on('click', function(e) { 
 
     event.stopPropagation(); 
 
     if(position > 0) { 
 
      position--; 
 
      $(this).parents('.slider-wrapper').find('.slider').css({'right' : position*slideItems.width() }); 
 
     } 
 
    }); 
 

 
    $('.slider-wrapper .buttons .next').on('click', function(e) { 
 
     event.stopPropagation(); 
 
     console.log('next'); 
 
     // fix - get the number of sections in THIS slider. 
 
     var totalSlides = $(this).parents('.slider-wrapper').find('.slide-items').length; 
 
     if(position < totalSlides - 1) { 
 
\t   position++; 
 
\t   $(this).parents('.slider-wrapper').find('.slider').css({'right' : position*slideItems.width()   }); 
 
\t  } 
 
    }) 
 

 
})
/* http://meyerweb.com/eric/tools/css/reset/ 
 
    v2.0 | 20110126 
 
    License: none (public domain) 
 
*/ 
 
html, body, div, span, applet, object, iframe, 
 
h1, h2, h3, h4, h5, h6, p, blockquote, pre, 
 
a, abbr, acronym, address, big, cite, code, 
 
del, dfn, em, img, ins, kbd, q, s, samp, 
 
small, strike, strong, sub, sup, tt, var, 
 
b, u, i, center, 
 
dl, dt, dd, ol, ul, li, 
 
fieldset, form, label, legend, 
 
table, caption, tbody, tfoot, thead, tr, th, td, 
 
article, aside, canvas, details, embed, 
 
figure, figcaption, footer, header, hgroup, 
 
menu, nav, output, ruby, section, summary, 
 
time, mark, audio, video { 
 
    margin: 0; 
 
    padding: 0; 
 
    border: 0; 
 
    font-size: 100%; 
 
    font: inherit; 
 
    vertical-align: baseline; } 
 

 
/* HTML5 display-role reset for older browsers */ 
 
article, aside, details, figcaption, figure, 
 
footer, header, hgroup, menu, nav, section { 
 
    display: block; } 
 

 
body { 
 
    line-height: 1; } 
 

 
ol, ul { 
 
    list-style: none; } 
 

 
blockquote, q { 
 
    quotes: none; } 
 

 
blockquote:before, blockquote:after, 
 
q:before, q:after { 
 
    content: ''; 
 
    content: none; } 
 

 
table { 
 
    border-collapse: collapse; 
 
    border-spacing: 0; } 
 

 
* { 
 
    box-sizing: border-box; } 
 

 
.container { 
 
    max-width: 1280px; 
 
    margin: 0 auto; 
 
} 
 

 
.container .slider-wrapper { 
 
    margin-bottom: 40px; 
 
    background-color: grey; 
 
    overflow: hidden; 
 
} 
 

 
.container .slider-wrapper .slider { 
 
    position: relative; 
 
    right: 0; 
 
    display: flex; 
 
    flex-wrap: wrap; 
 
    overflow: hidden; 
 
} 
 

 
.container .slider-wrapper .slider > div { 
 
    padding: 10px; 
 
    background-color: #e5d0d0; 
 
} 
 

 
.container .slider-wrapper .slider > div p { 
 
    color: purple; 
 
} 
 

 
.container .slider-wrapper .buttons { 
 
    display: flex; 
 
    justify-content: space-between; 
 
    background: beige; 
 
    padding: 10px 0; 
 
} 
 

 

 
.container .slider-wrapper .buttons div { 
 
    background-color: cyan; 
 
} 
 

 
/*# sourceMappingURL=style.css.map */
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div class="container"> 
 

 
    <div class="slider-wrapper"> 
 
     <div class="slider"> 
 
      <div class="slide-items"> 
 
       <p>1-1 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
      </div> 
 

 
      <div class="slide-items"> 
 
       <p>1-2 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
      </div> 
 

 
      <div class="slide-items"> 
 
       <p>1-3 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
      </div> 
 

 
     </div> 
 

 
     <div class="buttons"> 
 
      <div class="prev"> 
 
       prev 
 
      </div> 
 

 
      <div class="next"> 
 
       next 
 
      </div> 
 
     </div> 
 
    </div> 
 

 

 
    <div class="slider-wrapper"> 
 
     <div class="slider"> 
 
      <div class="slide-items"> 
 
       <p>2-1 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
      </div> 
 
      <div class="slide-items"> 
 
       <p>2-2 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
      </div> 
 

 
      <div class="slide-items"> 
 
       <p>2-3 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus diam nec mauris vehicula, eget euismod lorem ultrices. Fusce suscipit nisi nisi, nec fermentum ligula finibus non. Cras scelerisque risus libero, quis faucibus enim elementum non. Ut vitae purus in enim aliquam sollicitudin non et dui. Duis nec varius lectus.</p> 
 
      </div> 
 

 

 
     </div> 
 

 
     <div class="buttons"> 
 
      <div class="prev"> 
 
       prev 
 
      </div> 
 

 
      <div class="next"> 
 
       next 
 
      </div> 
 
     </div> 
 
    </div> 
 

 

 
</div>

関連する問題