javaScript 物体多形态改变加回调函数

小方块同时改变 width height top left opacity(透明度)  加回调函数 改变第二个方块。

效果如下:

 

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 
  4 <head>
  5     <meta charset="UTF-8">
  6     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7     <meta http-equiv="X-UA-Compatible" content="ie=edge">
  8     <title>Document</title>
  9     <style>
 10         div {
 11             width: 100px;
 12             height: 100px;
 13             opacity: 0.1;
 14             background-color: red;
 15             position: absolute;
 16             left: 0;
 17         }
 18 
 19         #topDiv {
 20             top: 100px;
 21 
 22         }
 23 
 24         #bottomDiv {
 25             top: 300px;
 26         }
 27     </style>
 28 </head>
 29 
 30 <body>
 31     <div id="topDiv"></div>
 32 
 33     <div id="bottomDiv"></div>
 34 
 35 </body>
 36 <script>
 37 
 38     var topDiv = document.getElementById("topDiv");
 39     var bottomDiv = document.getElementById("bottomDiv"); //选择两个小方块 
 40 
 41     //获取css样式函数
 42     function getStyle(dom, attr) {  //兼容ie 获取css样式
 43         if (window.getComputedStyle) {
 44             return window.getComputedStyle(dom, null)[attr];
 45         } else {
 46             return dom.currentStyle[attr];
 47         }
 48     }
 49     //绑定事件函数
 50     function addEvent(ele, type, handle) { //兼容ie 绑定事件
 51         if (ele.addEventListener) {
 52             return ele.addEventListener(type, handle, false);
 53         } else if (ele.attachEvent) {
 54             ele.attachEvent('on' + type, function () {
 55                 handle.call(ele);
 56             })
 57         } else {
 58             ele['on' + type] = handle;
 59         }
 60     }
 61 
 62     addEvent(topDiv, "click", function () {//绑定事件
 63         startMove(this, { width: 400, height: 400, top: 200, left: 300, opacity: 1 }, function () {
 64             //传入第一个值为 dom, 第二个值为对象方式 键 => 值   第三个为回调函数, 
 65             startMove(bottomDiv, { width: 400, height: 400, top: 200, left: 800, opacity: 1 }, function () {
 66                 alert("over");
 67             });
 68         })
 69     })
 70 
 71 
 72 
 73     function startMove(dom, attrObj, callback) {
 74         clearInterval(dom.timer);
 75     //清理上个定时器,如果不清理上个定时器,多次调用同个函数会导致同时执行多个定时器,会发生很好玩的现象,多个定时器同时抢行。
 76         if (attrObj.opacity) {
 77             attrObj.opacity *= 100;
 78         //判断传进来的对象中是否有opacity,有的话 把数放大一百倍。
 79         //因为opacity的值 是在 0 ~ 1 之间,如果放大一百倍,处理小数点也不怕。下面代码会直接把小数点给干掉
 80         //92行的代码会干掉小数点 speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);   三目运算符
 81         }
 82 
 83         dom.timer = setInterval(function () {
 84             var speed = null, iCur = null;//iCur 用来存要修改值的当前值
 85             var bStop = true; //用来记录 物体是否 运行到目标点,如果没有就为flase,如果为true,停止定时器,
 86 
 87             for (var attr in attrObj) {
 88                 if (attr == "opacity") {
 89                     iCur = parseFloat(getStyle(dom, attr)) * 100;
 90                     //传进来的值放大一百倍, 当前的opacity值也要放大一百倍
 91                 } else {
 92                     iCur = parseInt(getStyle(dom, attr));
 93                     //获取要改变的物体当前值。
 94                 }
 95 
 96                 speed = (attrObj[attr] - iCur) / 7;//物体的速度 距离目标点越近,就越小 当到达目标点时,速度减小为0
 97                 speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
 98                 //舍弃计算之后的小数点,没见过哪个页面的 width和height的值带小数点的吧
 99 
100                 if (attr == "opacity") {
101                     dom.style.opacity = (speed + iCur) / 100;
102                     //计算完速度后 把放大一百倍的数值 恢复原状,赋值
103                 } else {
104                     dom.style[attr] = speed + iCur + 'px';
105                 }
106 
107                 if (attrObj[attr] !== iCur) {
108                     bStop = false;
109                     //判断 元素的当前值 是否已经运动 到目标点,
110                     //如果不到,把bStop 变成false, 定时器不会停止,只要进来一次,说明还没有运动到目标点,继续运行。
111                     //只要 没有进来过判断,说明,全部要运动的 width height 等 已经到达目标点, 
112                     
113                 }
114             }
115             if (bStop) {
116                 clearInterval(dom.timer);//bStop 为true的时候,说明 全部已经到点,可以停止定时器了, 
117                 callback();//定时器停止后,执行回调函数, 这个函数会等到 startMove()执行完毕后触发。
118                 
119             }
120         }, 30)
121     }
122 </script>
123 
124 </html>

附上没有注释的代码,有时候有注释的代码 看起来 还比较复杂

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 
  4 <head>
  5     <meta charset="UTF-8">
  6     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7     <meta http-equiv="X-UA-Compatible" content="ie=edge">
  8     <title>Document</title>
  9     <style>
 10         div {
 11             width: 100px;
 12             height: 100px;
 13             opacity: 0.1;
 14             background-color: red;
 15             position: absolute;
 16             left: 0;
 17         }
 18 
 19         #topDiv {
 20             top: 100px;
 21 
 22         }
 23 
 24         #bottomDiv {
 25             top: 300px;
 26         }
 27     </style>
 28 </head>
 29 
 30 <body>
 31     <div id="topDiv"></div>
 32 
 33     <div id="bottomDiv"></div>
 34 
 35 </body>
 36 <script>
 37 
 38     var topDiv = document.getElementById("topDiv");
 39     var bottomDiv = document.getElementById("bottomDiv"); 
 40 
 41    
 42     function getStyle(dom, attr) { 
 43         if (window.getComputedStyle) {
 44             return window.getComputedStyle(dom, null)[attr];
 45         } else {
 46             return dom.currentStyle[attr];
 47         }
 48     }
 49   
 50     function addEvent(ele, type, handle) { 
 51         if (ele.addEventListener) {
 52             return ele.addEventListener(type, handle, false);
 53         } else if (ele.attachEvent) {
 54             ele.attachEvent('on' + type, function () {
 55                 handle.call(ele);
 56             })
 57         } else {
 58             ele['on' + type] = handle;
 59         }
 60     }
 61 
 62     addEvent(topDiv, "click", function () {
 63         startMove(this, { width: 400, height: 400, top: 200, left: 300, opacity: 1 }, function () {
 64             startMove(bottomDiv, { width: 400, height: 400, top: 200, left: 800, opacity: 1 }, function () {
 65                 alert("over");
 66             });
 67         })
 68     })
 69 
 70 
 71 
 72     function startMove(dom, attrObj, callback) {
 73         clearInterval(dom.timer);
 74         if (attrObj.opacity) {
 75             attrObj.opacity *= 100;
 76         }
 77 
 78         dom.timer = setInterval(function () {
 79             var speed = null, iCur = null;
 80             var bStop = true; 
 81 
 82             for (var attr in attrObj) {
 83                 if (attr == "opacity") {
 84                     iCur = parseFloat(getStyle(dom, attr)) * 100;
 85                 } else {
 86                     iCur = parseInt(getStyle(dom, attr));
 87                 }
 88                 //物体的速度 距离目标点越近,就越小 当到达目标点时,速度减小为0
 89                 speed = (attrObj[attr] - iCur) / 7;
 90                 speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
 91                 if (attr == "opacity") {
 92                     dom.style.opacity = (speed + iCur) / 100;
 93                 } else {
 94                     dom.style[attr] = speed + iCur + 'px';
 95                 }
 96 
 97                 if (attrObj[attr] !== iCur) {
 98                     bStop = false;
 99                 }
100             }
101             if (bStop) {
102                 clearInterval(dom.timer); 
103                 callback();
104                 
105             }
106         }, 30)
107     }
108 </script>
109 
110 </html>

 

posted @ 2019-04-22 22:02  杨耿  阅读(295)  评论(0编辑  收藏  举报