Qrara
@Qrara (Qrara)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

jQueryのスライドショー

解決したいこと

jQueryの勉強をしています。
課題として、jQueryでスライドショーを作ることになったのですが、3時間格闘しているので質問させてください。
ボタンを押すとスライドする仕組みなのですが、1回目はスライドできます。
ただ2回目にスライドができなくなってしまいます。
なぜできないのかを教えて頂きたいです。

https://qiita.com/pizzzza-planet/items/a6eca4abf9f93409b7bc
こちらの記事を参考にしています。

右端にいる状態で .next を押すと最初の位置に戻り、左端にいる状態で .prev を押すと最後の位置に移動する。
これもしたいのですが上手くいきません。

該当するソースコード

  <div class="slider-wrap">
    <div class="slider-area">
      <ul class="slider-list clearfix">
        <li><img src="img/1.jpg" alt=""></li>
        <li><img src="img/2.jpg" alt=""></li>
        <li><img src="img/3.jpg" alt=""></li>
        <li><img src="img/4.jpg" alt=""></li>
      </ul>
      <button type="button" class="slider-ctrl-btn prev" data-ctrl="prev"></button>
      <button type="button" class="slider-ctrl-btn next" data-ctrl="next"></button>
    </div>
  </div>

<script defer>
window.addEventListener( 'load', function(){
  $(".slider-ctrl-btn").click(function () {

    let pages = [];
    let numCount = $('.slider-list li').length;
    let num = 0;
    let pagesNum = 0;

    for(let i = 0; i < numCount; i++){
      if (i == 0) {
        pages.push(0);
      } else {
        num += - $('.slider-list li').eq(i).width();
        pages.push(num);
      }
    }

    if ($(this).data('ctrl') === 'next') {
      let step = 1;
      pagesNum = pagesNum + step;
      if (pagesNum === pages.length) {
        pagesNum = 0;
      }
      $(".slider-list").animate({left: pages[pagesNum]})
    } else if ($(this).data('ctrl') === 'prev') {
      let back = -1;
      pagesNum = pagesNum + back;
      if (pagesNum === -1) {
        pagesNum = pages.length - 1;
      }
      $(".slider-list").animate({left: pages[pagesNum]})
    }
  });
}, false);
</script>

CSS

.slider-wrap {
  width: 600px;
  padding: 10px;
  margin: 0 auto;
  border-radius: 10px;
  background-color: #DDD;
  box-shadow: 0 2px 5px rgba(50, 50, 50, 0.4);
}
.slider-area {
  position: relative;
  width: 600px;
  height: 300px;
  background-color: #FFF;
  overflow: hidden;
}
.slider-list {
  position: absolute;
  top: 0;
  left: 0;
  width: 2400px;
  height: 300px;
}
.slider-list > li { float: left;list-style-type:none; }
.slider-ctrl-btn {
  position: absolute;
  top: 50%;
  width: 30px;
  height: 30px;
  margin-top: -15px;
  cursor: pointer;
  border-radius: 15px;
  background-color: rgba(255, 255, 255, 0.5);
}
.slider-ctrl-btn.prev { left: 30px; }
.slider-ctrl-btn.next { right: 30px; }

.swiper,
.slick {
  max-width: 500px;
  margin: 30px auto 0;
}
.swiper-button-prev,
.swiper-button-next {
  color: rgb(0, 106, 255);
}
.swiper-pagination span {
  background-color:  #fff;
}

.slick-prev {
  left: 25px;
}
.slick-next {
  right: 25px;
}
.slick-prev,
.slick-next {
  z-index: 100;
}

自分で試したこと

クリックで違う動作になってしまうため、if文がおかしいのかと思い変数を変えたり数字を変えたりしたのですが上手く動作しませんでした。
何卒宜しくお願い致します。

0

3Answer

注目するところは参照元の最後のコードです。

$(".slider-ctrl-btn").click(function () {
    // ...
});

この中身を見比べてください。参照元と異なっていて、そこに原因があります。

まず.animate()がどのような動作をするのか理解するのが良いと思います。

その上で、.animate()にどのような値を設定しているのか確認しましょう。
下記のコードはボタン1~4でスライドさせるもので、設定している値は参照元と同じものです。

See the Pen MWXgwPe by blue32a (@blue32a) on CodePen.

1Like

Comments

  1. @Qrara

    Questioner

    ありがとうございます!お時間があれば1つ質問させていただいても宜しいでしょうか。

出来ないのはイメージと実際に食い違いがあるからです。
どのように動くのかわからないコードを組み立てても、イメージ通りには動かないものです。
ひとつずつ確認していきましょう。

console.logで値を出力したり、デベロッパーツールを使ってデバッグすることができます。

window.addEventListener( 'load', function(){

$(".slider-ctrl-btn").click(function () {
  let numCount = $('.slider-list li').length;
  console.log('numCount', numCount); // ???
});

}, false);
window.addEventListener( 'load', function(){
  $(".slider-ctrl-btn").click(function () {

    let pages = [];
    let numCount = $('.slider-list li').length;
    let num = 0;
    let pagesNum = 0;

    for(let i = 0; i < numCount; i++){
      if (i == 0) {
        pages.push(0);
      } else {
        num += - $('.slider-list li').eq(i).width();
        pages.push(num);
      }
    }

    console.log('pagesNum', pagesNum); // ???
    console.log('pages', pages); // ???

    if ($(this).data('ctrl') === 'next') {
      let step = 1;
      pagesNum = pagesNum + step;
      if (pagesNum === pages.length) {
        pagesNum = 0;
      }
      console.log('pagesNum', pagesNum); // ???
      console.log('pages[pagesNum]', pages[pagesNum]); // ???
      $(".slider-list").animate({left: pages[pagesNum]})
    } else if ($(this).data('ctrl') === 'prev') {
      let back = -1;
      pagesNum = pagesNum + back;
      if (pagesNum === -1) {
        pagesNum = pages.length - 1;
      }
      console.log('pagesNum', pagesNum); // ???
      console.log('pages[pagesNum]', pages[pagesNum]); // ???
      $(".slider-list").animate({left: pages[pagesNum]})
    }
  });
}, false);
1Like

Comments

  1. @Qrara

    Questioner

    コンソール見やすいです!ありがとうございます!
    コンソールで確認した結果、pagesNumに対して +1 が上手くできていないことが分かりました!
    どこが原因なのか1つずつ確認したいと思います!

回答ありがとうございます!申し訳ないのですが、質問1ついいでしょうか。
コードも短くanimateを使ったコードでまさに求めていた記述でした!

ただ、自分が作っているのが矢印を押すとスライドするものなので、
書いていただいたコードを参考にさせていただき、自分なりにコードを書いてみたのですが、うまくいきません。

矢印1つクリックするだけで、一個ずつスライドのやり方はこのやり方で合っているのでしょうか。

<script defer>
window.addEventListener( 'load', function(){


$(".slider-ctrl-btn").click(function () {
let numCount = $('.slider-list li').length;
if ($(this).data('ctrl') === 'next') {
if (numCount == 0){
$(".slider-list").animate({left: 0});
} else if (numCount == 1){
$(".slider-list").animate({left: -600});
} else if (numCount == 2){
$(".slider-list").animate({left: -1200});
} else if (numCount == 3){
$(".slider-list").animate({left: -1800});
}
} else if ($(this).data('ctrl') === 'prev') {
if (numCount == 0){
$(".slider-list").animate({left: 0});
} else if (numCount == 1){
$(".slider-list").animate({left: +600});
} else if (numCount == 2){
$(".slider-list").animate({left: +1200});
} else if (numCount == 3){
$(".slider-list").animate({left: +1800});
}
}
});


}, false);
</script>
0Like

Your answer might help someone💌