封装好的运动函数:
1.能控制目标元素的多种属性
2.能自动获取元素的样式表:
3.获取样式函数兼容
4.能对于元素的多属性进行动画(缓动动画)修改
5.能区分透明度等没单位的属性和px属性的变化
animate.js
1 /** 2 * 获取样式函数 3 * @param element 要获取的样式的对象 4 * return 目标css样式对象 5 * */ 6 function getStyle(element) { 7 if(window.getComputedStyle) { 8 return window.getComputedStyle(element,null); 9 }else if(element.currentStyle){ 10 return element.currentStyle; 11 } 12 } 13 14 /** 15 * 动画函数 16 * @param element html标签 17 * @param attr 标签属性 18 * @param target 目标参数 19 * */ 20 function animate(element,obj) { 21 clearInterval(element.timer); 22 element.timer = setInterval(function () { 23 var flag = true; 24 for(var attr in obj){ 25 // 在for in 的内部要区别开到底是透明度还是像素px的变化 26 if( attr == "opacity") { 27 var current = getStyle(element)[attr]; 28 var target = obj[attr]; 29 current = current * 100; 30 target = target * 100; 31 // Math.round() 函数返回一个数字四舍五入后最接近的整数值。 32 current = Math.round(current); 33 var step = (target - current) / 10; 34 current += current <= target ? Math.ceil(step):Math.floor(step); 35 if(current != target) { 36 flag = false; 37 } 38 // element.style.left等 39 element.style[attr] = current / 100; 40 }else if(attr == "zIndex"){ 41 element.style[attr] = obj[attr]; 42 } else{ 43 var current = parseInt(getStyle(element)[attr]); 44 var target = obj[attr]; 45 var step = (target - current) / 10; 46 current += current <= target ? Math.ceil(step):Math.floor(step); 47 if(current != target) { 48 flag = false; 49 } 50 // element.style.left等 51 element.style[attr] = current+ "px"; 52 } 53 } 54 if(flag) { 55 clearInterval(element.timer); 56 } 57 },40); 58 }
animate2.js
1 // 多个属性运动框架 添加回调函数 2 function animate(obj,json,fn) { // 给谁 json 3 clearInterval(obj.timer); 4 obj.timer = setInterval(function() { 5 var flag = true; // 用来判断是否停止定时器 一定写到遍历的外面 6 for(var attr in json){ // attr 属性 json[attr] 值 7 //开始遍历 json 8 // 计算步长 用 target 位置 减去当前的位置 除以 10 9 // console.log(attr); 10 var current = 0; 11 if(attr == "opacity") 12 { 13 current = Math.round(parseInt(getStyle(obj,attr)*100)) || 0; 14 console.log(current); 15 } 16 else 17 { 18 current = parseInt(getStyle(obj,attr)); // 数值 19 } 20 // console.log(current); 21 // 目标位置就是 属性值 22 var step = ( json[attr] - current) / 10; // 步长 用目标位置 - 现在的位置 / 10 23 step = step > 0 ? Math.ceil(step) : Math.floor(step); 24 //判断透明度 25 if(attr == "opacity") // 判断用户有没有输入 opacity 26 { 27 if("opacity" in obj.style) // 判断 我们浏览器是否支持opacity 28 { 29 // obj.style.opacity 30 obj.style.opacity = (current + step) /100; 31 } 32 else 33 { // obj.style.filter = alpha(opacity = 30) 34 obj.style.filter = "alpha(opacity = "+(current + step)* 10+")"; 35 36 } 37 } 38 else if(attr == "zIndex") 39 { 40 obj.style.zIndex = json[attr]; 41 } 42 else 43 { 44 obj.style[attr] = current + step + "px" ; 45 } 46 47 if(current != json[attr]) // 只要其中一个不满足条件 就不应该停止定时器 这句一定遍历里面 48 { 49 flag = false; 50 } 51 } 52 if(flag) // 用于判断定时器的条件 53 { 54 clearInterval(obj.timer); 55 //alert("ok了"); 56 if(fn) // 很简单 当定时器停止了。 动画就结束了 如果有回调,就应该执行回调 57 { 58 fn(); // 函数名 + () 调用函数 执行函数 59 } 60 } 61 },30) 62 } 63 function getStyle(obj,attr) { // 谁的 那个属性 64 if(obj.currentStyle) // ie 等 65 { 66 return obj.currentStyle[attr]; // 返回传递过来的某个属性 67 } 68 else 69 { 70 return window.getComputedStyle(obj,null)[attr]; // w3c 浏览器 71 } 72 }
旋转木马例子
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>旋转木马轮播图</title> 6 <style> 7 /*初始化 reset*/ 8 blockquote,body,button,dd,dl,dt,fieldset,form,h1,h2,h3,h4,h5,h6,hr,input,legend,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0} 9 body,button,input,select,textarea{font:12px/1.5 "Microsoft YaHei", "微软雅黑", SimSun, "宋体", sans-serif;color: #666;} 10 ol,ul{list-style:none} 11 a{text-decoration:none} 12 fieldset,img{border:0;vertical-align:top;} 13 a,input,button,select,textarea{outline:none;} 14 a,button{cursor:pointer;} 15 16 .wrap{ 17 1200px; 18 margin:100px auto; 19 } 20 .slide { 21 height:500px; 22 position: relative; 23 } 24 .slide li{ 25 position: absolute; 26 left:200px; 27 top:0; 28 } 29 .slide li img{ 30 100%; 31 } 32 .arrow{ 33 /*opacity: 0;*/ 34 } 35 .prev,.next{ 36 76px; 37 height:112px; 38 position: absolute; 39 top:50%; 40 margin-top:-56px; 41 background: url(images/prev.png) no-repeat; 42 z-index: 99; 43 } 44 .next{ 45 right:0; 46 background-image: url(images/next.png); 47 } 48 </style> 49 </head> 50 51 <body> 52 <div class="wrap" id="wrap"> 53 <div class="slide" id="slide"> 54 <ul> 55 <li> 56 <a href="#"><img src="images/slidepic1.jpg" alt="" /></a> 57 </li> 58 <li> 59 <a href="#"><img src="images/slidepic2.jpg" alt="" /></a> 60 </li> 61 <li> 62 <a href="#"><img src="images/slidepic3.jpg" alt="" /></a> 63 </li> 64 <li> 65 <a href="#"><img src="images/slidepic4.jpg" alt="" /></a> 66 </li> 67 <li> 68 <a href="#"><img src="images/slidepic5.jpg" alt="" /></a> 69 </li> 70 </ul> 71 <div class="arrow" id="arrow"> 72 <a href="javascript:;" class="prev" id="arrLeft"></a> 73 <a href="javascript:;" class="next" id="arrRight"></a> 74 </div> 75 </div> 76 </div> 77 <!--把动画函数封装好,再通过script标签的属性引入到当前文件--> 78 <script src="animate.js"></script> 79 <script> 80 /** 81 * 第一个功能: 82 * 让图片都散开,到达每一张图片应该到达的位置 83 * 根据config数组,设置每一张图片的位置即可 84 * 85 * 第二个功能 86 * 旋转 87 * 点击左右按钮 88 */ 89 var config = [ 90 { 91 400, 92 top: 20, 93 left: 50, 94 opacity: 0.2, 95 zIndex: 2 96 }, //0 97 { 98 600, 99 top: 70, 100 left: 0, 101 opacity: 0.8, 102 zIndex: 3 103 }, //1 104 { 105 800, 106 top: 100, 107 left: 200, 108 opacity: 1, 109 zIndex: 4 110 }, //2 111 { 112 600, 113 top: 70, 114 left: 600, 115 opacity: 0.8, 116 zIndex: 3 117 }, //3 118 { 119 400, 120 top: 20, 121 left: 750, 122 opacity: 0.2, 123 zIndex: 2 124 } //4 125 ]; 126 127 var slide = document.getElementById('slide'); 128 var slideItem = slide.children[0].children; 129 var arrLeft = document.getElementById("arrLeft"); 130 var arrRight = document.getElementById("arrRight"); 131 // 页面加载完毕后,运行散开动画 132 for(var i = 0 ; i < slideItem.length; i++ ) { 133 animate(slideItem[i],config[i]); 134 135 } 136 // 给右按钮添加点击事件 137 138 arrRight.onclick = function () { 139 //splice() 方法通过删除现有元素和/或添加新元素来更改一个数组的内容。 140 // config.splice(0,1)[0] 截取数组的第一个元素 141 // 再把截取的元素放到改变之后的数组的最后位置 142 config.splice(config.length,0,config.splice(0,1)[0]); 143 for(var i = 0 ; i < slideItem.length; i++ ) { 144 animate(slideItem[i],config[i]); 145 } 146 } 147 arrLeft.onclick = function () { 148 config.splice(0,0,config.splice(config.length-1,1)[0]); 149 for(var i = 0 ; i < slideItem.length; i++ ) { 150 animate(slideItem[i],config[i]); 151 } 152 } 153 154 155 </script> 156 </body> 157 158 </html>