Карусельный слайдер — как плавно анимировать карточки?

#javascript #jquery #css #sass

#javascript #jquery #css #дерзость

Вопрос:

я не очень хорош в CSS и анимации, кто-нибудь может мне помочь с анимацией карусели?

Это моя текущая работа:https://codepen.io/aceraven777/pen/NJYxjo

HTML:

 <div class="carousel">
    <div class="card-carousel">
        <div class="my-card">111</div>
        <div class="my-card">222</div>
        <div class="my-card">333</div>
        <div class="my-card">444</div>
        <div class="my-card">555</div>
        <div class="my-card">666</div>
        <div class="my-card">777</div>
        <div class="my-card">888</div>
        <div class="my-card">999</div>
    </div>
</div>
  

SCSS:

 body {
  padding-top: 50px;
}

.carousel {
        width: 100%;
        display: flex;
        align-items: center;
        justify-content: center;
        flex-direction: column;
        font-family: 'Quicksand', sans-serif;
        overflow-x: hidden;
        position: relative;
        top: -2.5rem;

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

            .my-card {
                height: 20rem;
                width: 170px;
                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;
            }

            .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;
            }

            .my-card.prev, .my-card.next {
                z-index: 2;
                opacity: 0.6;
                pointer-events: auto;
                transition: 1s;
            }

            .my-card.prev {
                -webkit-transform: scale(0.8) translateY(-1rem) translateX(26rem);
                transform: scale(0.8) translateY(-1rem) translateX(26rem);
            }

            .my-card.next {
                -webkit-transform: scale(0.8) translateY(-1rem) translateX(-26rem);
                transform: scale(0.8) translateY(-1rem) translateX(-26rem);
            }
        }
    }
  

JS:

 var $num = $('.card-carousel .my-card').length;
    var $even = $num / 2;
    var $odd = ($num   1) / 2;

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

    $('.card-carousel .my-card').on('click', function() {
        if ($('.card-carousel').is(':animated')) {
            return;
        }

        var $slide = $('.card-carousel .active').width();

        if ($(this).hasClass('next')) {
            $('.card-carousel').animate({left: '-='   $slide});
        } else if ($(this).hasClass('prev')) {
            $('.card-carousel').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
            $('.card-carousel .active').prev().trigger('click');
        }
        else if (e.keyCode == 39) { // right
            $('.card-carousel .active').next().trigger('click');
        }
    });
  

Как я могу сделать анимацию плавной? Например, когда нужно перейти к следующей карте, карты на заднем плане ходят по кругу. Как я могу заставить его двигаться по прямой.

Я основал свой код здесь: https://www.jqueryscript.net/demo/Smooth-Card-Carousel-jQuery-CSS3

Комментарии:

1. Найдите мой ответ внизу. Вам нужны некоторые изменения в вашем SCSS-файле.

Ответ №1:

Эй, это то, что тебе нужно.

Внес несколько изменений в ваш SCSS

Ваш код

 .my-card.prev {
                -webkit-transform: scale(0.8) translateY(-1rem) translateX(26rem);
                transform: scale(0.8) translateY(-1rem) translateX(26rem);
            }

            .my-card.next {
                -webkit-transform: scale(0.8) translateY(-1rem) translateX(-26rem);
                transform: scale(0.8) translateY(-1rem) translateX(-26rem);
            }
  

SCSS

  .my-card.prev {
                -webkit-transform: scale(0.8) translateY(-1rem) translateX(0rem);
                transform: scale(0.8) translateY(-1rem) translateX(0rem);
            }

            .my-card.next {
                -webkit-transform: scale(0.8) translateY(-1rem) translateX(0rem);
                transform: scale(0.8) translateY(-1rem) translateX(0rem);
            }
  

 var $num = $('.card-carousel .my-card').length;
    var $even = $num / 2;
    var $odd = ($num   1) / 2;

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

    $('.card-carousel .my-card').on('click', function() {
        if ($('.card-carousel').is(':animated')) {
            return;
        }

        var $slide = $('.card-carousel .active').width();
        
        if ($(this).hasClass('next')) {
            $('.card-carousel').animate({left: '-='   $slide});
        } else if ($(this).hasClass('prev')) {
            $('.card-carousel').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
            $('.card-carousel .active').prev().trigger('click');
        }
        else if (e.keyCode == 39) { // right
            $('.card-carousel .active').next().trigger('click');
        }
    });  
 body {
  padding-top: 50px;
}

.carousel {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
  font-family: "Quicksand", sans-serif;
  overflow-x: hidden;
  position: relative;
  top: -2.5rem;
}
.carousel .card-carousel {
  display: flex;
  align-items: center;
  justify-content: center;
  position: relative;
}
.carousel .card-carousel .my-card {
  height: 20rem;
  width: 170px;
  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;
}
.carousel .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;
}
.carousel .card-carousel .my-card.prev, .carousel .card-carousel .my-card.next {
  z-index: 2;
  opacity: 0.6;
  pointer-events: auto;
  transition: 1s;
}
.carousel .card-carousel .my-card.prev {
  -webkit-transform: scale(0.8) translateY(-1rem) translateX(26rem);
  transform: scale(0.8) translateY(-1rem) translateX(0rem);
}
.carousel .card-carousel .my-card.next {
  -webkit-transform: scale(0.8) translateY(-1rem) translateX(-26rem);
  transform: scale(0.8) translateY(-1rem) translateX(0rem);
}  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="carousel">
	<div class="card-carousel">
		<div class="my-card">111</div>
		<div class="my-card">222</div>
		<div class="my-card">333</div>
		<div class="my-card">444</div>
		<div class="my-card">555</div>
		<div class="my-card">666</div>
		<div class="my-card">777</div>
		<div class="my-card">888</div>
		<div class="my-card">999</div>
	</div>
</div>