JQuery deslizante Loop

votos
1

¡Espero que estés bien! Tengo una tarjeta de control deslizante jQuery que no está funcionando correctamente. Cuando se va a la última diapositiva, aparece la pantalla en blanco. Parece tanto buggy. Mientras que cuando intento volver a deslizador anterior, que no funciona bien.

¿Es posible realizar un control deslizante ir desde la última carta a primera tarjeta? Un bucle que transfiere desde la última diapositiva a la primera diapositiva. Si la última carta vista, no quiero que termine, quiero ir de nuevo desde el principio.

Cualquier ayuda será apreciada.

$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');
})
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;
}
<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>

Publicado el 20/10/2018 a las 10:40
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
1

  • Bienvenido al diseño de respuesta (que de 2018 después de todo). Utilice unidades que responden como %.
    Si se necesita un ancho fijo, que simplemente crear un contenedor neutral que encapsular el carrusel flexibles reutilizable!
  • Sea consistente en nombrar clases . Utilice una convención de nombres CSS, como por ejemplo: SUIT .
  • No utilice los ID , o puede que te encuentres copia-pasteing código JS todo el lugar en caso de varias galerías.
  • No estilo innecesariamente html, body. Envolver los elementos en un .Carouselenvoltorio componente .
  • Si no se utiliza reales enlaces , utilice <button>el elemento (y estilo en consecuencia).
  • Usar CSS transformen lugar de jQuery de .animate()siempre que sea posible.
  • Una convención de nomenclatura variable de jQuery dice a prefijar con $sólo Colecciones de los elementos referencias. Hacerlo.
  • Si tiene varios disparadores de animación, no hacer animaciones en todo su código, en lugar de crear un reutilizable anim()función que hace esto. Los factores desencadenantes sólo deben aumentar o disminuir un activo actualmente contador de índicesi .
  • Llegar a conocer conceptos básicos JS, el operador ternario ?:
  • Utilizar Math.floorcuando se trata de obtener un índice medio
  • Utilice el operador módulo %para restablecer índice para 0cuando supera tot(número de tarjetas)
  • El código resultante debe ser bastante fácil de leer y / depurable:

$(".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();
    }
  });

});
/*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;
}
<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>

Ver más arriba cómo el anim()se vuelve a utilizar la función, después de manipular el índice actual i variable.

Respondida el 20/10/2018 a las 13:02
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more