0
点赞
收藏
分享

微信扫一扫

JS自定义动画函数

一、自定义JS动画

//定义一个函数,控制div向左或者向右移动
/* 
参数:
   obj 要执行动画的对象
   attr:要执行动画的样式,修改动画样式,left ,right,height
   target  执行动画的目标位置
   speed  移动变化的速度
   callback  回调函数,这个函数,在动画执行完毕后执行
*/
function move(obj, attr, target, speed, callback) {
  //4.清除上一个定时器
  clearInterval(obj.timer); //因timer定义在全局,需关闭对应obj的timer定时器,这样就不会影响其他的obj的定时器
  //1:获取obj原来的attr值。getStyle()下面封装的另一个函数,用来取对应obj的原来的值
  var current = parseInt(getStyle(obj, attr)); //若取的是大小,则会得到xx px,用parseInt()取合法数字,便于下面的计算
  //2:判断变化速度的正负值。若原值current比目标值大,则此时速度应该为负数,若小,则为正值
  if (current > target) {
    //此时速度应该为负数
    speed = -speed;
  }
  //3:开启一个定时器,用来执行动画效果
  obj.timer = setInterval(function () {
    //(1):获取obj原来的attr值
    var oldValue = parseInt(getStyle(obj, attr));
    //(2):在旧值上增加值,得到新值
    var newValue = oldValue + speed;
    //向右移动时,判断newValue是否大于800
    //向左移动时,判断newValue是否小于0
    //(3):当速度为正值,新值大于目标值,或者当速度为负值,新值小于目标值时,让新值等于目标值,这样不管变化速度怎么样,都不会跑偏
    if ((speed > 0 && newValue > target) || (speed < 0 && newValue < target)) {
      newValue = target;
    }
    //(4)将新值设置给obj
    obj.style[attr] = newValue + "px";
    //(5)将元素移动到目标值时,停止移动
    if (newValue == target) {
      clearInterval(obj.timer);
      //(6)动画执行完毕,调用回调函数
      callback && callback(); //这一步是做判断,有就执行,没有就不执行
    }
  }, 30);
}
//获取当前对象的样式信息函数
function getStyle(obj, name) {
  if (window.getComputedStyle) {
    return getComputedStyle(obj, null)[name];
  } else {
    return obj.currentStyle[name];
  }
}

二、自定义动画演示

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        #box1 {
            width: 100px;
            height: 100px;
            background-color: red;
            position: absolute;
            /* 指定了值,这样在ie中不会显示auto */
            left: 0;
        }

        #box2 {
            width: 100px;
            height: 100px;
            background-color: yellow;
            position: absolute;
            top: 150px;
        }
    </style>
    <!-- 引入上面自定义的动画函数-->
    <script src="./tools.js"></script>
    <script>
        window.onload = function () {
            var box1 = document.getElementById("box1");
            var box2 = document.getElementById("box2");
            var btn = document.getElementById("btn01");
            var btn02 = document.getElementById("btn02");
            var btn03 = document.getElementById("btn03");
            var btn04 = document.getElementById("btn04");
            //  var timer;//定义变量,保存定时器的标识
            /* 目前我们的定时器的标识由全局变量timer保存,
                 所有的执行正在执行的定时器都在这个变量中保存 */
            //绑定单击响应函数
            btn.onclick = function () {
                move(box1, "left", 800, 20);
            }
            btn02.onclick = function () {
                move(box1, "left", 0, 10);
            }
            btn03.onclick = function () {
                move(box2, "left", 800, 10);
            }
            btn04.onclick = function () {
                //  move(box2, "width", 800, 10);
                move(box2, "height", 800, 10, function () {
                    // alert("hello");
                    move(box2, "width", 800, 10, function () {

                    });
               });
            }
        }
    </script>
</head>

<body>
    <button id="btn01">点击向右</button>
    <button id="btn02">点击向左</button>
    <button id="btn03">点击向左,box2向右移动</button>
    <button id="btn04">测试</button>
    <br>
    <div id="box1"></div>
    <div id="box2"></div>


</body>

</html>
举报

相关推荐

0 条评论