首页>案例集>JavaScript案例集

克隆节点实现无缝幻灯片的滑动

做过很多种类型的幻灯片,无缝滑动幻灯加上自动播放应该是幻灯最常见的形式,各大组件库提供的幻灯也一般是这种形式。

那这次用原生js实现一个。

未标题-1.jpg

点击图片看效果。

功能:

1、默认自动播放,鼠标经过停止,移开继续自动播放。

2、点击上一张、下一张,通过左右滑动实现切换。

3、通过克隆节点实现无缝滑动。

4、核心在于定时器的运用。

核心代码:

  //准备数据
  // 初始化界面
  // 克隆第一个节点到最后,克隆最后一个节点到最前面
  // 点击下一张  改变num的值 ,实现图片向左边滑动一张  条件:如果滑动到最后一张,要立刻移动到第二张  改变小圆点的高亮状态
  // 点击上一张 改变num的值  实现图片向右边滑动一张 条件:如果滑动到第一张,则立刻移动到倒数第二张,改变小圆点的高亮
  // 点击小圆点,改变num的值,滑动图片到对应的位置,改变高亮状态

  // 找对象
  const oBanner = document.querySelector('.fy-banner');
  const oUl = oBanner.querySelector('.fy-banner-ul');
  const oDoitUl = oBanner.querySelector('.pagebarlist');
  const oDoitLis = oDoitUl.getElementsByClassName('pagebaritem');
  const oBtnNext = oBanner.querySelector('.btn-next');
  const oBtnPrev = oBanner.querySelector('.btn-prev');

  // 准备数据
  let arr = ['images/banner_1.png', 'images/banner_2.jpg'];
  let len = arr.length;
  // 获取banner的宽度
  let oBannerWidth = oBanner.clientWidth;
  // console.log(oBannerWidth);

  // 初始化界面
  let str = '';
  let str1 = '';
  arr.forEach(function (item) {
    str += `<li class="fy-banner-li">
          <a href="#" class="fy-banner-a">
              <img src="${item}" alt="中秋活动" class="fy-banner-img">
          </a>
      </li>`;
    str1 += `<li class="pagebaritem"></li>`;
  })
  oUl.innerHTML = str;
  oDoitUl.innerHTML = str1;

  // 把最后一个节点克隆到第一个位置
  oUl.prepend(oUl.lastElementChild.cloneNode(true));
  // 把第二个节点克隆到最后一个位置
  oUl.append(oUl.children[1].cloneNode(true));

  // 初始化第一个 0 1 2 3
  let num = 0;
  oDoitLis[num].classList.add('active');
  oUl.style.transform = `translateX(-${oBannerWidth * (num + 1)}px)`;

  // 自动播放
  let timer = null;
  timer = setInterval(autoPlay, 3000);
  oBanner.addEventListener('mouseenter', function () {
    clearInterval(timer);
  })
  oBanner.addEventListener('mouseleave', function () {
    timer = setInterval(autoPlay, 3000);
  })

  // 点击下一张
  oBtnNext.addEventListener('click', function () {
    autoPlay();
  })
  // 点击上一张
  oBtnPrev.addEventListener('click', function () {
    // num的变化 1 0
    num--;
    // 图片滑动
    // 异步的时候把动画移除了,所以需要再次添加上动画过程。
    slide();
    if (num <= -1) {
      num = len - 1;
      // 回到倒数第二张图片的位置
      stopSlide();
    }
    // 小圆点高亮的变化
    changeDoit();
  });


  // 点击小圆点的切换
  [...oDoitLis].forEach(function (item, index) {
    item.addEventListener('click', function () {
      // 更新num的值
      num = index;
      // 图片滑动
      slide();
      // 高亮更新
      changeDoit();
    })
  })

  function autoPlay () {
    // num的变化 1 0
    num++;
    // 图片滑动
    // 异步的时候把动画移除了,所以需要再次添加上动画过程。
    slide();
    if (num >= len) {
      num = 0;
      // 回到第二张图片的位置
      stopSlide();
    }
    changeDoit();
  }

  // 图片滑动
  function slide () {
    oUl.style.transition = '0.5s linear';
    oUl.style.transform = `translateX(-${oBannerWidth * (num + 1)}px)`;
  }

  // 图片停止滑动
  function stopSlide () {
    setTimeout(function () {
      // 异步执行把图片挪回到初始位置的时候,不能有动画
      oUl.style.transition = 'none';
      oUl.style.transform = `translateX(-${oBannerWidth * (num + 1)}px)`;
    }, 500)
  }
 
  // 小圆点高亮的变化函数
  function changeDoit () {
    [...oDoitLis].forEach(function (item, index) {
      item.classList.remove('active');
    })
    oDoitLis[num].classList.add('active');
  }
}


点赞


2
保存到:

相关文章

发表评论:

◎请发表你卖萌撒娇或一针见血的评论,严禁小广告。

Top