首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jquery Slider循环

Jquery Slider循环
EN

Stack Overflow用户
提问于 2018-10-20 10:40:31
回答 1查看 934关注 0票数 1

希望你做得很好!我有一个jquery卡滑块不能正常工作。当它转到最后一张幻灯片时,会出现空白屏幕。看上去有那么多小马车。当我试图回到以前的滑块时,它也不起作用。

能让滑块从最后一张牌转到第一张牌吗?将其从最后一张幻灯片传送到第一张幻灯片的循环。如果看了最后一张卡,我不想它结束,我想从头再来。

任何帮助都将不胜感激。

代码语言:javascript
复制
$num = $('.my-card').length;
$even = $num / 2;
$odd = ($num + 1) / 2;

if ($num % 2 == 0) {
  $('.my-card:nth-child(' + $even + ')').addClass('active');
  $('.my-card:nth-child(' + $even + ')').prev().addClass('prev');
  $('.my-card:nth-child(' + $even + ')').next().addClass('next');
} else {
  $('.my-card:nth-child(' + $odd + ')').addClass('active');
  $('.my-card:nth-child(' + $odd + ')').prev().addClass('prev');
  $('.my-card:nth-child(' + $odd + ')').next().addClass('next');
}

$('.my-card').click(function() {
  $slide = $('.active').width();
  console.log($('.active').position().left);
  
  if ($(this).hasClass('next')) {
    $('.card-carousel').stop(false, true).animate({left: '-=' + $slide});
  } else if ($(this).hasClass('prev')) {
    $('.card-carousel').stop(false, true).animate({left: '+=' + $slide});
  }
  
  $(this).removeClass('prev next');
  $(this).siblings().removeClass('prev active next');
  
  $(this).addClass('active');
  $(this).prev().addClass('prev');
  $(this).next().addClass('next');
});


// Keyboard nav
$('html body').keydown(function(e) {
  if (e.keyCode == 37) { // left
    $('.active').prev().trigger('click');
  }
  else if (e.keyCode == 39) { // right
    $('.active').next().trigger('click');
  }
});



  

$('a.slide-control').on('click', function(e){
  e.preventDefault();
  var slides = $('.my-card');
  var nextSlide;
  $slide = $('.active').width();

  if($(this).attr('id') === "prev-slide"){
    nextSlide = $('.active').prev();
      $('.card-carousel').stop(false, true).animate({left: '+=' + $slide});
  } else {
    nextSlide = $('.active').next();
      $('.card-carousel').stop(false, true).animate({left: '-=' + $slide});
  }
  
  
  $(slides).each(function(){
      $(this).removeClass('prev active next');
  })
  
  $(nextSlide).addClass('active');
  $(nextSlide).prev().addClass('prev');
  $(nextSlide).next().addClass('next');
})
代码语言:javascript
复制
html body {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
  overflow-x: hidden;
}

.card-carousel {
  display: flex;
  align-items: center;
  justify-content: center;
  position: relative;
}

.card-carousel .my-card {
  height: 400px;
  width: 500px;
  position: relative;
  z-index: 1;
  -webkit-transform: scale(0.6) translateY(-2rem);
  transform: scale(0.6) translateY(-2rem);
  opacity: 0;
  cursor: pointer;
  pointer-events: none;
  background: #2e5266;
  background: linear-gradient(to top, #2e5266, #6e8898);
  transition: 1s;
}

.card-carousel .my-card.active {
  z-index: 3;
  -webkit-transform: scale(1) translateY(0) translateX(0);
  transform: scale(1) translateY(0) translateX(0);
  opacity: 1;
  pointer-events: auto;
  transition: 1s;
}

.card-carousel .my-card.prev, .card-carousel .my-card.next {
  z-index: 2;
  -webkit-transform: scale(0.8) translateY(-1rem) translateX(0);
  transform: scale(0.8) translateY(-1rem) translateX(0);
  opacity: 0.6;
  pointer-events: auto;
  transition: 1s;
}
代码语言:javascript
复制
<html>
<head>
<link rel="stylesheet" type="text/css" href="https://use.fontawesome.com/releases/v5.4.1/css/all.css">
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
</head>
<body>
<div class="heading">
</div>
<div class="card-carousel">
  <div class="my-card"></div>
  <div class="my-card"></div>
  <div class="my-card"></div>
  <div class="my-card"></div>
  <div class="my-card"></div>
  <div class="my-card"></div>
  <div class="my-card"></div>
  <div class="my-card"></div>
  <div class="my-card"></div>
</div>

  <div style="font-size:70px">
    <a class="slide-control" id="prev-slide" href=""><i class="fas fa-chevron-circle-left"></i></a>
    <a class="slide-control"  id="next-slide" href=""><i class="fas fa-chevron-circle-right"></i></a>
  </div>
</body>
</html>

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-20 13:02:06

  • 欢迎来到响应性设计(毕竟是2018年)。使用响应单元,如%。 如果您需要一个固定的宽度,而不是简单地创建一个中立的包装,将封装您的可重用灵活旋转木马!
  • 命名类中保持一致。使用CSS命名约定,比如i.e:西服
  • 不要使用ID,否则您可能会发现自己到处都是复制的JS代码,以防出现多个图库。
  • 不要不必要地使用html, body的风格。将元素包装到.Carousel包装器组件中。
  • 如果不使用实际的链接,则使用<button>元素(并相应地对其进行样式设置)。
  • 尽可能使用CSS transform而不是jQuery的.animate()
  • jQuery变量命名约定对前缀使用只对元素集合引用。这样做吧。
  • 如果您有多个动画触发器,不要在代码中到处创建动画,而是创建一个可重用的函数。触发器只应增加或减少当前活动的i.索引计数器
  • 了解JS基础知识,三元操作符?:
  • 尝试获取中间索引时使用Math.floor
  • 使用模块运算符%将索引重置为0,当索引超过tot时(卡数)
  • 生成的代码应该看起来很漂亮,并且容易读/可调试:

代码语言:javascript
复制
$(".Carousel").each(function() {

  var $this = $(this),
      $btns = $this.find(".Carousel-prev, .Carousel-next"),
      $slider = $this.find(".Carousel-slider"),
      $cards = $slider.find(">*"),
      tot = $cards.length,
      i = Math.floor(tot / 2); // Somewhere in the middle

  function anim() {
    i = i < 0 ? tot - 1 : i % tot; // Fix index
    var $active = $cards.eq(i);
    $cards.removeClass('active prev next');
    $active.addClass('active');
    $active.prev().addClass('prev');
    $active.next().addClass('next');
    $slider.css({transform: `translateX(-${100*i}%)`}); // CSS! yey
  }

  $cards.on("click", function() {
    i = $cards.index(this);
    anim();
  });

  $btns.on("click", function() {
    i = $(this).is(".Carousel-next") ? ++i : --i;
    anim();
  });

  anim();

  // Keyboard nav
  $(document).on("keydown", function(e) {
    var k = e.which;
    if (k === 37 || k === 39) {
      i = k === 39 ? ++i : --i;
      anim();
    }
  });

});
代码语言:javascript
复制
/*QuickReset*/*{margin:0;box-sizing: border-box;}html,body{height:100%;font:14px/1.4 sans-serif;}

/* Carousel component */

.Carousel {
  position: relative;
  overflow: hidden;
  width: 100%;
}

.Carousel-slider {
  display: flex;
  height: 150px; /* for demo */
  transition: 1s;
  -webkit-backface-visibility: hidden;
}

.Carousel-slider>* {
  /* CARDS */
  position: relative;
  flex: 0 0 90%; /* 90 flex-basis */
  margin: 0 5%; /* 90 + 5 + 5 = 100 */
  height: 100%;
  cursor: pointer;
  pointer-events: none;
  background: #6e8898;
  object-fit: cover; /*In case the card is an <img>!*/
  transform: scale(0.8);
  transition: 1s;
  -webkit-backface-visibility: hidden;
}

.Carousel-slider>.active {
  opacity: 1;
  cursor: auto;
  flex: 0 0 80%;
  margin: 0 10%;
  transform: scale(1);
  pointer-events: auto;
}

.Carousel-slider>.prev {
  transform: translateX(24%) scale(0.8);
}

.Carousel-slider>.next {
  transform: translateX(-24%) scale(0.8);
}

.Carousel-slider>.prev,
.Carousel-slider>.next {
  opacity: 0.5;
  pointer-events: auto;
}

.Carousel-controls {
  text-align: center;
}

.Carousel-prev,
.Carousel-next {
  border: 0;
  height: 3rem;
  font-size: 2em;
  line-height: 1em;
  background: #000;
  border-radius: 50%;
  color: #fff;
  cursor: pointer;
}
代码语言:javascript
复制
<div class="Carousel">
  <div class="Carousel-slider">
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <div>4</div>
    <img src="//placehold.it/800x400/0bf/fff?text=IMAGINE!" alt="Carousel image!">
    <div>6</div>
    <img src="//placehold.it/800x400/f0b/fff?text=No+limits" alt="Carousel image!">
    <div>8</div>
    <div>9</div>
  </div>
  <div class="Carousel-controls">
    <button type="button" class="Carousel-prev">&#x23f4;</button>
    <button type="button" class="Carousel-next">&#x23f5;</button>
  </div>
</div>

<script src="https://code.jquery.com/jquery-3.1.0.js"></script>

请参阅在操作当前索引anim()变量之后,如何重用i函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52904776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档