【问题标题】:How to add smooth transition between first and last slide of a carousel?如何在轮播的第一张和最后一张幻灯片之间添加平滑过渡?
【发布时间】:2020-03-07 13:11:00
【问题描述】:

这有点难以解释,所以我做了this codepen 以供参考。 我正在尝试使用 vanilla JavaScript 克隆 Bootstrap 轮播,我在幻灯片之间添加了过渡,这对第一张和最后一张幻灯片之间存在的所有幻灯片都很有效,但是当我单击上一个按钮从第一张幻灯片转到最后一张幻灯片或单击下一个按钮从最后一张幻灯片到第一张幻灯片这个过渡的行为很奇怪,它沿着中间的所有其他幻灯片传播。

这是我使用的html:

   <div class="carousel-container">
    <div class="carousel-slide">
      <img src="imgs/pc1(1).jpg" class="firstSlide" alt="">
      <img src="imgs/pc1(2).jpg" alt="">
      <img src="imgs/pc1(3).jpg" class="lastSlide" alt="">
    </div>
  </div>
  <button id="prevBtn">Prev</button>
  <button id="nextBtn">Next</button>

和 JavaScript:

const carousel_slide = document.querySelector(".carousel-slide");
const carousel_images = document.querySelectorAll(".carousel-slide img");
const prev_btn = document.querySelector("#prevBtn");
const next_btn = document.querySelector("#nextBtn");

let counter = 0;
let size = carousel_images[0].clientWidth;

next_btn.addEventListener("click", () => {
  carousel_slide.style.transition = "all 0.3s ease-in-out";
  counter++;
  if (counter >= carousel_images.length) {
    counter = -1;
    counter++;
  }
  carousel_slide.style.transform = `translateX(${-size * counter}px)`;
});

prev_btn.addEventListener("click", () => {
  carousel_slide.style.transition = "all 0.3s ease-in-out";
  counter--;
  if (counter < 0) {
    counter = carousel_images.length - 2;
    counter++;
  }
  carousel_slide.style.transform = `translateX(${-size * counter}px)`;
});

请帮我解决这个轮播的这些结尾幻灯片之间的过渡问题?谢谢

【问题讨论】:

    标签: javascript html css


    【解决方案1】:

    首先复制第一张幻灯片并插入最后,然后复制最后一张幻灯片并插入开头:

    var lastSlide = carousel_images[slidecount - 1].outerHTML;
    var firstSlide = carousel_images[0].outerHTML;
    carousel_slide.insertAdjacentHTML('afterbegin', lastSlide);
    carousel_slide.insertAdjacentHTML('beforeend', firstSlide);
    // Shift to the second slide:
    carousel_slide.style.transform = `translateX(${-size}px)`;
    

    当您移动到第一张幻灯片之前的幻灯片(最后一张的副本)时,您等待动画结束,然后默默地切换到最后一张:

    if (counter < 0) {
      setTimeout(() => {
        counter = carousel_images.length - 1;
        carousel_slide.style.transition = "none";
        carousel_slide.style.transform = `translateX(${-size * (counter + 1)}px)`;
      }, 300);
    }
    

    当您移到最后一张(第一个的副本)之后的幻灯片时,您会默默地移到第一张:

    if (counter >= carousel_images.length) {
      setTimeout(() => {
        counter = 0;
        carousel_slide.style.transition = "none";
        carousel_slide.style.transform = `translateX(${-size}px)`;
      }, 300);
    }
    

    工作演示:https://codepen.io/bortao/pen/MWwOVbd

    【讨论】:

    • 谢谢@ariel,这是一个绝妙的解决方案!
    • 你能详细说明一下吗,为什么你从counter = carousel_images.length - 1;中减去了1,然后在counter这里加了1translateX(${-size * (counter + 1)}px)
    • 1) 因为最后一个是第一个重复的。所以我们需要last - 1 2)计数器需要加1,因为第一张幻灯片是最后一张重复
    • 谢谢,我们分别在最后和最先克隆了 first 和 last,但是 console.log(carousel_images.length) 输出的是 5 而不是 7。这是为什么呢?
    • 啊是的..正在考虑这个问题。当您在克隆之前执行carousel_images = document.querySelectorAll(".carousel-slide img"); 时,它只会保存原始幻灯片。如果您在克隆后执行此操作,将有 7 个条目
    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 2020-04-27
    • 1970-01-01
    • 2016-08-06
    • 2021-10-12
    • 2014-10-15
    相关资源
    最近更新 更多