Js封装的动画函数实现轮播图

---恢复内容开始---

  • 效果图说明:当鼠标移到哪一个按钮上的时候会自动跳转到某一张图片上,并且按钮会以高亮显示

  • 项目目录结构

  • 用到的js封装的animate()动画

       

 function animate(element, target) {
    clearInterval(element.timeId);
    //定时器的id值存储到对象的一个属性中
    element.timeId = setInterval(function () {
      //获取元素的当前的位置,数字类型
      var current = element.offsetLeft;
      //每次移动的距离
      var step = 10;
      step = current < target ? step : -step;
      //当前移动到位置
      current += step;
      if (Math.abs(current - target) > Math.abs(step)) {
        element.style.left = current + "px";
      } else {
        //清理定时器
        clearInterval(element.timeId);
        //直接到达目标
        element.style.left = target + "px";
      }
    }, 20);
  }
animate.js
  • 简单轮播图代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
         * {
      margin: 0;
      padding: 0
    }

    ul {
      list-style: none
    }

    img {
      vertical-align: top
    }

    .box {
      width: 730px;
      height: 454px;
      margin: 100px auto;
      padding: 5px;
      border: 1px solid #ccc;
    }

    .inner {
      width: 730px;
      height: 454px;
      background-color: pink;
      overflow: hidden;
      position: relative;
    }

    .inner ul {
      width: 1000%;
      position: absolute;
      top: 0;
      left: 0;
    }

    .inner li {
      float: left;
    }

    .square {
      position: absolute;
      right: 10px;
      bottom: 10px;
    }

    .square span {
      display: inline-block;
      width: 16px;
      height: 16px;
      background-color: #fff;
      text-align: center;
      line-height: 16px;
      cursor: pointer;
    }

    .square span.current {
      background-color: orangered;
      color: #fff;
    }

    </style>
</head>
<body>
    <div class="box" id="box">
  <div class="inner"><!--相框-->
    <ul>
      <li><a href="#"><img src="images/1.jpg" alt=""/></a></li>
      <li><a href="#"><img src="images/2.jpg" alt=""/></a></li>
      <li><a href="#"><img src="images/3.jpg" alt=""/></a></li>
      <li><a href="#"><img src="images/4.jpg" alt=""/></a></li>
      <li><a href="#"><img src="images/5.jpg" alt=""/></a></li>
      <li><a href="#"><img src="images/6.jpg" alt=""/></a></li>
    </ul>
    <div class="square">
      <span class="current">1</span>
      <span>2</span>
      <span>3</span>
      <span>4</span>
      <span>5</span>
      <span>6</span>
    </div>
  </div>
</div>

<script src="animate.js"type="text/javascript"></script>
<script>
    /*我们需要操作:
    当点击右下角按钮时对应的图片移动
    1.需要获取ul的宽度
    2.需要获取每个li的宽度
    3.获取相框的宽度
    4.获取右下角的span,并且为每个span注册鼠标移入和移除

    */
    //获取最外面的div
    var oDiv=document.getElementById('box');
    //获取inner由于inner没有用id所有我们用children的方式
    var inner=oDiv.children[0];
    //获取ul以及他的宽度
    var oUl=inner.children[0];
    //获取相框的宽度
    var imgWidth=inner.offsetWidth;
    var oLi=oUl.children;
    //获取sapn
    var oSpan=inner.children[1].children;

    /*为每个span注册鼠标进入的事件,并且鼠标进入时,对应的地方会显示高亮,这里用排他

    排他功能:就是先将全部的属性移除,然后在某个上面加上特有的current属性
    */

    for(var i=0;i<oSpan.length;i++){
      //由于每循环一次i就会变,所以先保存下来
     //循环的时候把索引值保存在每个span的自定义属性中
    oSpan[i].setAttribute("index",i);
    oSpan[i].onmouseover=function(){

    for(var j=0;j<oSpan.length;j++){
        //先去掉其他属性
        oSpan[j].removeAttribute('class');
    }
    this.className="current";
    
    //移动ul:不管是向左移动还是向右移动ul的left总负的,最大也只可能为0,

     //获取当前鼠标进入的span的索引
      var index=this.getAttribute("index");
      animate(oUl,-index*imgWidth);



    }
    }


  

</script>
</body>
</html>
简单轮播图.html
  • 轮播图的基本实现(排他功能,用相框的宽度求出移动的距离)

      思路理解:

当鼠标放到按钮上的时候,ul移出去的距离为=相框宽度*按钮的下标

  

    根据上面接下来获取需要用到的元素对象:

//获取最外面的div
    var oDiv=document.getElementById('box');
    //获取inner由于inner没有用id所有我们用children的方式
    var inner=oDiv.children[0];
    //获取ul以及他的宽度
    var oUl=inner.children[0];
    //获取相框的宽度
    var imgWidth=inner.offsetWidth;
    var oLi=oUl.children;
    //获取sapn
    var oSpan=inner.children[1].children;

遍历每个li,并且做排他功能功能

for(var i=0;i<oSpan.length;i++){
      //由于每循环一次i就会变,所以先保存下来
     //循环的时候把索引值保存在每个span的自定义属性中,
    oSpan[i].setAttribute("index",i);
    oSpan[i].onmouseover=function(){

    for(var j=0;j<oSpan.length;j++){
        //先去掉其他属性
        oSpan[j].removeAttribute('class');
    }
    this.className="current";
    
    //移动ul:不管是向左移动还是向右移动ul的left总负的,最大也只可能为0,

     //获取当前鼠标进入的span的索引
      var index=this.getAttribute("index");
      animate(oUl,-index*imgWidth);

    }
    }

---恢复内容结束---

虽然现在走得很慢,但不会一直这么慢
原文地址:https://www.cnblogs.com/xxm980617/p/10466720.html