Как сделать более плавную анимацию?

Как сделать более плавную анимацию, чтобы слайды не прыгали, а плавно переключались? Если слайд 1, то все ок, но не могу понять, как быть, когда их 2 для отображения

    const slides = [
  {
    id: 1,
    title: "Audi",
    model: "A7",
    engine: "Бензин",
    kpp: "Автомат",
    body: "Седан",
    year_from: "2010",
    old_price: "1200000",
    price: "2100000",
    img: "/images/img1.webp",
    mod: "1.8i CVT (160 л.с.)",
    mileage: "90000",
  },
  {
    id: 2,
    title: "BMW",
    engine: "Бензин",
    model: "1 серия",
    kpp: "Механическая",
    body: "Седан",
    year_from: "2010",
    old_price: "1200000",
    price: "1100000",
    img: "/images/img1.webp",
    mod: "1.8i CVT (160 л.с.)",
    mileage: "90000",
  },
  {
    id: 3,
    title: "BMW",
    engine: "Дизель",
    model: "2 серия",
    kpp: "Механическая",
    body: "Седан",
    year_from: "2010",
    old_price: "1200000",
    price: "900000",
    img: "/images/img1.webp",
    mod: "1.8i CVT (160 л.с.)",
    mileage: "90000",
  },
  {
    id: 4,
    title: "BMW",
    engine: "Дизель",
    model: "3 серия",
    kpp: "Механическая",
    body: "Седан",
    year_from: "2011",
    old_price: "1200000",
    price: "1200000",
    img: "/images/img1.webp",
    mod: "1.8i CVT (160 л.с.)",
    mileage: "90000",
  },
  {
    id: 5,
    title: "BMW",
    engine: "Дизель",
    model: "3 серия",
    kpp: "Механическая",
    body: "Седан",
    year_from: "2010",
    old_price: "1200000",
    price: "1200000",
    img: "/images/img1.webp",
    mod: "1.8i CVT (160 л.с.)",
    mileage: "90000",
  },
  {
    id: 6,
    title: "BMW",
    engine: "Дизель",
    model: "3 серия",
    kpp: "Механическая",
    body: "Седан",
    year_from: "2001",
    old_price: "1200000",
    price: "1200000",
    img: "/images/img1.webp",
    mod: "1.8i CVT (160 л.с.)",
    mileage: "90000",
  },
];
  new Vue({
  el: '.slider-wrapper',
  computed: {
    cars() {
      if (this.slides.length === 1) {
        return [this.slides[this.active - 1]];
      }
      return [this.slides[this.active - 1], this.slides[this.active]];
    },
    numSlides() {
      return this.slidesMinusOne;
    },
    slidesMinusOne() {
      return this.slides.length - 1;
    },
  },
  data() {
    return {
      slides,
      active: 1,
    };
  },
  methods: {
    onCarClicked(car) {
      this.$emit("on-car-clicked", car);
    },
    moveToSlide(amount) {
      let newActive;
      const newIndex = this.active + amount;
      if (newIndex > this.slides.length) {
        newActive = 1;
      }
      if (newIndex === 0) {
        newActive = this.slides.length;
      }
      this.active = null;
      this.active = newActive || newIndex;
    },
    jumpToSlide(index) {
      this.active = null;
      this.active = index;
    },
    slideDotsClass(i) {
      if (i + 1 !== this.active) {
        return "";
      }
      return "dot__active";
    },
  },
})
       .slider-wrapper {
    position: relative;
}

.slider__slide {
    padding: 50px;
    cursor: pointer;
    color: #fff;
}

.slider-arrows {
    display: flex;
    color: #000;
}

.slider-arrow-left {
    position: absolute;
    transform: translate(0, -50%);
    top: 50%;
    left: 20px;
    cursor: pointer;
    width: 30px;
}

.slider-arrow-right {
    position: absolute;
    transform: translate(0, -50%);
    top: 50%;
    right: 20px;
    cursor: pointer;
    width: 30px;
}
.slider-dots {
    display: flex;
    position: absolute;
    transform: translate(0, -50%);
    right: 50%;
    bottom: 0;
}

/* .slider-dot:not(:first-child) {
    margin-left: 1.25rem;
} */
.slider-dot {
    border-radius: 50%;
    width: 1rem;
    height: 1rem;
    background: #fff;
    border: 0.15rem solid #fff;
    cursor: pointer;
    box-shadow: 0px 2px 8px #00000029;
}

.dot__active {
    background: #c8102e;
}

.cars-list {
    display: flex;
    justify-content: space-between;
}

.cars-item {
    flex-basis: 48%;
  cursor: pointer;
    box-shadow: 0 10px 10px rgba(0, 0, 0, 0.1);
}
  
  .fade-enter-active,
.fade-leave-active {
  transition: opacity 0.25s ease-out;
}

.fade-enter,
.fade-leave-to {
  opacity: 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

  <div v-if="numSlides + 1" class="slider-wrapper">
    <transition-group name="fade" tag="div" class="cars-list" mode="out-in">
      <!-- car-single -->
      <div
        class="cars-item"
        v-for="car in cars"
        :key="car.id"
        @click="onCarClicked(car)"
      >
        <div class="cars-item__img">
          <img :src="car.img" alt="" />
        </div>
        <div class="cars-item__text">
          <div class="cars-item__title">
            {{ car.title }}
          </div>
          <div class="cars-item__mod">
            {{ car.mod }}
          </div>
          <div class="cars-item__kpp">
            <span>{{ car.kpp }}</span>
            <span>{{ car.engine }}</span>
          </div>
          <div class="cars-item__year-from">
            {{ car.year_from }}
          </div>
          <div class="cars-item__mileage">
            {{ car.mileage }}
          </div>
          <div class="cars-item__old-price">
            {{ car.old_price }}
          </div>
          <div class="cars-item__price">
            {{ car.price }}
          </div>
        </div>
      </div>
    </transition-group>

    <div class="slider-dots" v-if="numSlides > 1">
      <div
        class="slider-dot"
        v-for="(btn, i) in slidesMinusOne"
        :key="btn.id"
        @click="jumpToSlide(i + 1)"
        :class="slideDotsClass(i)"
      ></div>
    </div>

    <div class="slider-arrows">
      <div @click="moveToSlide(-1)" v-if="active > 1" class="slider-arrow-left">
        Лево
      </div>
      <div
        @click="moveToSlide(1)"
        v-if="active < numSlides"
        class="slider-arrow-right"
      >
        Право
      </div>
    </div>
  </div>


Ответы (0 шт):