js实现无缝轮播图

 CSS样式参考:

<style type="text/css">
    * {
      padding: 0;
      margin: 0;
      list-style: none;
      border: 0;
    }

    .all {
      width: 500px;
      height: 300px;
      padding: 7px;
      border: 1px solid #ccc;
      margin: 100px auto;
      position: relative;
    }

    .screen {
      width: 500px;
      height: 300px;
      overflow: hidden;
      position: relative;
    }

    .screen li {
      width: 500px;
      height: 300px;
      overflow: hidden;
      float: left;
    }

    .screen ul {
      position: absolute;
      left: 0px;
      top: 0px;
      width: 3000px;
    }

    .all ol {
      position: absolute;
      right: 10px;
      bottom: 10px;
      line-height: 20px;
      text-align: center;
    }

    .all ol li {
      float: left;
      width: 20px;
      height: 20px;
      background: #fff;
      border: 1px solid #ccc;
      margin-left: 10px;
      cursor: pointer;
    }

    .all ol li.current {
      background: yellow;
    }

    #arr {
      display: none;
      z-index: 1000;

    }

    #arr span {
      width: 40px;
      height: 40px;
      position: absolute;
      left: 5px;
      top: 50%;
      margin-top: -20px;
      background: #000;
      cursor: pointer;
      line-height: 40px;
      text-align: center;
      font-weight: bold;
      font-family: '黑体';
      font-size: 30px;
      color: #fff;
      opacity: 0.3;
      border: 1px solid #fff;
    }

    #arr #right {
      right: 5px;
      left: auto;
    }
  </style>

body代码参考:

<body>
  <div class="all" id='box'>
    <div class="screen" id="screen">
      <ul>
        <li>
          <img src="../images/1.jpg" width="500" height="300" />
        </li>
        <li>
          <img src="../images/2.jpg" width="500" height="300" />
        </li>
        <li>
          <img src="../images/3.jpg" width="500" height="300" />
        </li>
        <li>
          <img src="../images/4.jpg" width="500" height="300" />
        </li>
        <li>
          <img src="../images/5.jpg" width="500" height="300" />
        </li>
      </ul>
      <ol>

      </ol>
    </div>
    <div id="arr">
      <span id="left">&lt;</span>
      <span id="right">&gt;</span>
    </div>
  </div>

JS代码参考:
  <script>
    //1 获取所有的节点
    var boxObj = document.querySelector('#box');
    var screenObj = document.querySelector('#screen');
    var ulObj = document.querySelector('ul');
    var lisObj = ulObj.children;
    var arrObj = document.querySelector('#arr');
    var leftObj = document.querySelector('#left');
    var rightObj = document.querySelector('#right');
    var olObj = document.querySelector('ol');
    //2 生成与图片对应的原点,几张图片就对应几个原点
    for (var i = 0; i < lisObj.length; i++) {
      var newLi = document.createElement('li');
      newLi.innerHTML = i + 1;
      if (i == 0) {
        newLi.classList.add('current')
      }

      newLi.onclick = banner;
      // 保存当前图片的索引
      newLi.setAttribute('index', i)
      //3 点击对应的图标是触发事件
      olObj.appendChild(newLi);
    }
    // 克隆第一张图片放到最后
    var newImg = lisObj[0].cloneNode(true);
    newImg.style.borderTop = 'solid 1px red';
    ulObj.appendChild(newImg);


    // 让轮播图随着点击的序号动起来
    //保存索引

    var imgIndex = 0;
    var isClick = true;
    function banner() {
      // console.log(this);
      // 获取图片对应的索引值
      imgIndex = this.getAttribute('index');
      // 获取screen的宽度
      var scWid = screenObj.offsetWidth;
      // 计算移动的目标值
      // 第0张图片显示时,ul的left为0  第一张图片显示ul的left为-scWid
      var target = imgIndex * scWid;
      startMove(ulObj, {
        left: -target
      }, function () {
        isClick = true;
        console.log(66666);

      });
      selectOl();
    }


    // 让图片对应的索引选中
    function selectOl() {
      for (let i = 0; i < olObj.children.length; i++) {
        olObj.children[i].classList.remove('current')

      }
      olObj.children[imgIndex].classList.add('current')
    }

    // 鼠标移入则显示对应的按钮
    boxObj.onmouseover = () => {
      arrObj.style.display = 'block';
    }
    screenObj.onmouseout = () => {
      arrObj.style.display = 'none';
    }

    //左边按钮的点击
    leftObj.onclick = function () {
      console.log(isClick);

      if (!isClick) return;
      isClick = false;
      //如果是第一张图片,则应该让所有的图片显示到左侧
      if (imgIndex == 0) {
        // 获取图片总的长度(包括克隆的第一张图片)
        var tmpLen = ulObj.children.length - 1
        //  直接设置ul的left坐标
        ulObj.style.left = - tmpLen * screenObj.offsetWidth + 'px';
        //设置索引
        imgIndex = tmpLen - 1;
      } else {
        imgIndex--;
      }
      // 调用序号点击的方法
      olObj.children[imgIndex].onclick();
    }

    // 点击右边按钮时
    rightObj.onclick = function () {
      // 判断是否为最后一张,第五张
      if (!isClick) return;
      isClick = false;
      if (imgIndex == olObj.children.length - 1) {
        // 从第五张运动到克隆的第六张,到达时将ul的left设置为0
        let target = (imgIndex - 0 + 1) * screenObj.offsetWidth;
        startMove(ulObj, { left: -target }, function () {
          ulObj.style.left = '0px';
          // console.log('5555');
          isClick = true;
        })
        imgIndex = 0;
        selectOl();
      } else {
        imgIndex++;
        olObj.children[imgIndex].onclick();

      }
    }
  </script>
</body>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值