<!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值)
}