<!DOCTYPE html>
<html>
<head>
<!-- 同时运动动画 -->
<meta charset="utf-8">
<title>More</title>
<style type="text/css">
body, ul, li, span {
margin: 0;
padding: 0;
}
ul {
list-style: none;
padding-left: 0;
}
ul li {
background-color: red;
width: 200px;
height: 100px;
margin-bottom: 20px;
border: 4px solid black;
filter: alpha(opacity=30);/*针对IE设置透明度*/
opacity: 0.3;/*针对火狐/chrome浏览器*/
}
</style>
<script src="same.js"></script>
<script>
window.onload = function() {
var li1=document.getElementById("li1");
li1.onmouseover=function(){
startMove(li1,{width:201,height:200,opacity:100});
}
li1.onmouseout=function(){
startMove(li1,{width:200,height:100,opacity:30});
}
}
</script>
</head>
<body>
<ul>
<li id="li1"></li>
</ul>
</body>
</html>
function getStyle(obj,attr) {
if(obj.currentStyle){//IE浏览器
return obj.currentStyle[attr];
}
else{//firefox浏览器
return getComputedStyle(obj,false)[attr];
}
}
function startMove(obj,json,fn) {//添加一个回调函数fn
var flag=true;//假设,标志所有运动是否到达目标值
clearInterval(obj.timer);
obj.timer = setInterval(function(){
for(var attr in json){
//1.取当前的值
var icur=null;
if(attr=='opacity'){
icur=Math.round(parseFloat(getStyle(obj,attr))*100);
}
else{
icur=parseInt(getStyle(obj,attr));
}
//2.算速度
var speed = (json[attr]-icur)/8;
speed = speed>0?Math.ceil(speed):Math.floor(speed);
//3.检测停止
if(icur != json[attr]) {
flag=false;
}
if(attr=='opacity'){
obj.style.filter='alpha(opacity:'+(icur+speed)+')';
obj.style.opacity=(icur+speed)/100;
}
else{
obj.style[attr] = icur+speed+'px';
}
}
if(flag){
clearInterval(obj.timer);
if(fn){
fn();
}
}
},30)
}
当加了一个定时器后,为什么不清除定时器,动画也能停止?
注意:在缓冲运动中,一定是在缓冲运动中,speed的值为0后动画停止了,此时定时器实际上还在运行中。
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title> p标签</title> <style type='text/css'> *{ margin:0px; padding:0px; } li{ width:200px; height:100px; margin:20px; list-style:none; background-color:yellow; opacity:0.3; } </style> <script type='text/javascript'> window.onload=function(){ var oLi=document.getElementsByTagName('li'); for(var i=0;i<oLi.length;i++){ oLi[i].onmouseover=function(){ var that=this; startMove(this,{width:400,height:200},function(){ startMove(that,{opacity:100}); }); } oLi[i].onmouseout=function(){ var that=this; startMove(this,{height:100,width:200},function(){ startMove(that,{opacity:30}) }); } } } function getStyle(obj,attr){ if(obj.currentStyle){ return obj.currentStyle[attr]; }else{ return getComputedStyle(obj,false)[attr]; } } function startMove(obj,json,fn){ clearInterval(obj.timer); obj.timer=setInterval(function(){ for(var attr in json){ var flag = true; var icur=null; if(attr=='opacity'){ icur=Math.round(parseFloat(getStyle(obj,attr))*100); } else{ icur=parseInt(getStyle(obj,attr)); } var speed=(json[attr]-icur)/8; speed=speed>0?Math.ceil(speed):Math.floor(speed); if(icur!=json[attr]){ flag = false; } if(attr=='opacity'){ obj.style.filter='alpha(opacity:'+(icur+speed); obj.style.opacity=(icur+speed)/100; } else{ obj.style[attr]=icur+speed+'px'; } } if (flag) { clearInterval(obj.timer); if(fn) { fn(); } } },30) } </script> </head> <body> <ul> <li></li> <li></li> <li></li> </ul> </body> </html>
对于同时进行的运动,停止所有动画的一个判定条件。
同时运动的关键在于,使用遍历,给dom加上不一样的定时器。
for in ----------------多用于遍历json对象。
对于复杂,多参数的函数,我们可以考虑把入参的结构改为json
<!DOCTYPE html> <html> <head> <title> new document </title> <style> *{padding:0;margin:0;} #div1{height:200px;width:200px;position:relative;background:#F00;left:-200px;top:0px;} #div2{height:200px;width:200px;background:#66F; filter:alpha(opacity:50);opacity:0.5;-moz-opacity:0.5;} #share{height:32px;line-height:16px;width:15px; background:#03F;color:#fff;position:absolute;left:200px;top:85px;} #ul li{height:50px;width:200px; background:#FF3;margin:10px 0px;border:4px solid #39F;opacity:1; filter:alpha(opacity:100); cursor:pointer;} </style> <script> window.onload = function(){ var oDiv=document.getElementById("div1"); var aDiv=document.getElementById("div2"); var aLi=document.getElementsByTagName("li"); //鼠标移入,div1滑出 oDiv.onmouseover = function(){ startMove(oDiv,{left:0}); } //鼠标移开,div1滑回 oDiv.onmouseout = function(){ startMove(oDiv,{left:-200}); } //鼠标移入,div2透明度变100 aDiv.onmouseover = function(){ startMove(aDiv,{opacity:100}); } aDiv.onmouseout = function(){ startMove(aDiv,{opacity:30}); } //黄块组合运动 for(i=0;i<aLi.length;i++){ aLi[i].timer=null; //给每个li单独添加定时器,避免公用定时器 aLi[i].onmouseover = function(){ var nextE=this; startMove(this,{width:400,height:100},function(){ startMove(nextE,{opacity:50}); }); } aLi[i].onmouseout = function(){ startMove(this,{opacity:100,width:390,height:50}); } } } //var timer=null; //json // var json = {a:2,b:7,c:0}; // for(var i in json){ // //alert(i); //依次弹出变量a,b,c // alert(json[i]); //依次弹出变量的值2,7,0 // } //Start运动框架 //json语句 // var json = {a:2,b:7,c:0}; // for(var i in json){ // //alert(i); //依次弹出变量a,b,c // alert(json[i]); //依次弹出变量的值2,7,0 // } //startMove(obj,{attr1:itarget1,attr2:itarget2},fn) //attr表属性,iTarget表目标值,多个属性目标值组成json数组 function startMove(e,json,fn){ //e表对象,json表{attr1:itarget1,attr2:itarget2,···},fn表回调函数 clearInterval(e.timer); //清除定时器,e.timer表示给每个对象定义一个定时器,避免共用一个定时器 e.timer = setInterval(function(){ for(var attr in json){ //定义attr为json中的变量,即属性,遍历所有属性。避免一个属性变化完后,其他属性也停止变化 var flag = true; //假设所有属性都已经满足icur == json[attr]时,flag为true //取当前的值 var icur=0; if(attr == 'opacity'){ icur=Math.round(parseFloat(getStyle(e,attr))*100); } else{ icur=parseInt(getStyle(e,attr)); } //算速度 var speed=(json[attr]-icur)/5; speed=speed>0?Math.ceil(speed):Math.floor(speed); //检测停止 if(icur != json[attr]){ //json[attr]表示iTarget,即如果当前存在属性值不等于目标值,flag值为false flag=false; } if(attr == 'opacity'){ e.style.opacity=(icur+speed)/100; e.style.filter="alpha(opacity:"+icur+speed+")"; } else{ e.style[attr]=icur+speed+"px"; } } if(flag){ //flag为true,即所有当前属性值等于目标值时时,执行下面的方法 clearInterval(e.timer3); if(fn){ fn(); } } },50) } //获取样式,兼容处理 function getStyle(obj,attr){ if(obj.currentStyle){ return obj.currentStyle[attr]; } else{ return getComputedStyle(obj,false)[attr]; } } //End运动框架 </script> </head> <body> <div id="div1"> <span id="share">分享</span> </div> <div id="div2"></div> <ul id="ul"> <li id="li1"></li> <li id="li2"></li> <li id="li3"></li> </ul> </body> </html>
//Start运动框架 //json语句 // var json = {a:2,b:7,c:0}; // for(var i in json){ // //alert(i); //依次弹出变量a,b,c // alert(json[i]); //依次弹出变量的值2,7,0 // } //startMove(obj,{attr1:itarget1,attr2:itarget2},fn) //attr表属性,iTarget表目标值,多个属性目标值组成json数组 function startMove(e,json,fn){ //e表对象,json表{attr1:itarget1,attr2:itarget2,···},fn表回调函数 clearInterval(e.timer); //清除定时器,e.timer表示给每个对象定义一个定时器,避免共用一个定时器 e.timer = setInterval(function(){ for(var attr in json){ //定义attr为json中的变量,即属性,遍历所有属性。避免一个属性变化完后,其他属性也停止变化 var flag = true; //假设所有属性都已经满足icur == json[attr]时,flag为true //取当前的值 var icur=0; if(attr == 'opacity'){ icur=Math.round(parseFloat(getStyle(e,attr))*100); } else{ icur=parseInt(getStyle(e,attr)); } //算速度 var speed=(json[attr]-icur)/5; speed=speed>0?Math.ceil(speed):Math.floor(speed); //检测停止 if(icur != json[attr]){ //json[attr]表示iTarget,即如果当前存在属性值不等于目标值,flag值为false flag=false; } if(attr == 'opacity'){ e.style.opacity=(icur+speed)/100; e.style.filter="alpha(opacity:"+icur+speed+")"; } else{ e.style[attr]=icur+speed+"px"; } } if(flag){ //flag为true,即所有当前属性值等于目标值时时,执行下面的方法 clearInterval(e.timer3); if(fn){ fn(); } } },50) } //获取样式,兼容处理 function getStyle(obj,attr){ if(obj.currentStyle){ return obj.currentStyle[attr]; //IE } else{ return getComputedStyle(obj,false)[attr]; //FireFox及谷歌 } } //End运动框架
function startMove(obj,json,fn){
var flag =true; //设定所有假设都成立
clearInterval(obj.timer);
obj.timer =setInterval(function(){
for(attr in json){
var icur =0;
if(attr =='opacity'){
var icur =parseFloat(getStyle(obj,attr)*100);
}else{
var icur =parseInt(getStyle(obj,attr));
}
var speed =(json[attr] - icur)/8;
speed =speed>0? Math.ceil(speed) : Math.floor(speed);
if(json[attr] != icur){
flag = false;
} // 如果遍历所有只要有不等于的假设不成立,继续执行该进行的操作。
if(attr == 'opacity'){
obj.style.filter = "alpha(opacity:"+(icur +speed)+")";
obj.style.opacity= (icur+speed)/100;
}else{
obj.style[attr] = icur +speed+'px';
}
if(flag){
clearInterval(obj.timer);
if(fn){
fn();
}
}
}
},30)
}
function getStyle(obj,attr){
if(obj.currentStyle){
return obj.currentStyle[attr];
} //基于IE
else{
return getComputedStyle(obj,false)[attr];
}
}
JSON格式:var json = {key : value , key1 : value1};
遍历:for(var i : json) {
i;(key值)
json[i];(value值)
}