导航菜单
  • 首页
  • 首页>万博manbext3.0首页登录集>JavaScript万博manbext3.0首页登录集

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

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

    那这次用原生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="&rvpu;#&rvpu;&octq;dmbtt=&rvpu;gz-cboofs-b&rvpu;&hu;"
                  <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