为了账号安全,请及时绑定邮箱和手机立即绑定

我在做多目标联动时为什么就会出错?

根据《js动画效果》课程中5-1节,我自己实践了一下,发现如果只对单独一个对象做动画可以实现链式动画效果,但一旦对多个对象(比如lis = getElementsByTagName("li")中的每个lis[i])添加动画效果后,鼠标移动到对象上时就会出错。浏览器调试错误截屏如下:

http://img1.sycdn.imooc.com//57148f090001f08513660029.jpg

我的html代码如下:

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8"> 
	<title>分享栏js动画</title>
	<script type="text/javascript" src="js/action.js"></script>

	<style type="text/css">
		*{
			margin: 0;
			padding:0;
		}
		ul{
			margin-top: 30px;
			list-style: none;
		}
		ul li{
			width: 200px;
			height: 50px;
			background-color: red;
			margin-bottom: 20px;
			border:2px solid #000;
			filter:alpha(opacity:30);
			opacity: 0.3;
		}
	</style>
	<script type="text/javascript">
		window.onload = function(){
			var lis = document.getElementsByTagName("li");
			var li = document.getElementById("li");
			var timer = null;//定义定时器
			var alpha = 0;
			/*li.onmouseover = function(){
				startAct(li,"height",100,function(){
					startAct(li, "width",400);
				});
			}
			li.onmouseout = function(){
				startAct(li,"width",200,function(){
					startAct(li, "height",50);
				});
			}*/
			for(var i=0; i<lis.length; i++){
				//宽度/高度变化
				lis[i].timer = null;//为每个lis对象定义一个timer
				lis[i].onmouseover = function(){
					startAct(this,"height",100,function(){
						//alert(1);
						startAct(this,"width",400);
					});
				}
				lis[i].onmouseout = function(){
					startAct(this,"height",50);
				}
			}

		}

	</script>
</head>
<body>
	<ul>
		<li id="li"></li>
		<li></li>
		<li></li>
	</ul>	
</body>
</html>

js代码如下(js/action.js):

function startAct(obj,type,iTarget,fn){//obj指作用对象,type指被改变的属性,ITarget指改变的目标值
	//初始化清除定时器
	clearInterval(obj.timer);

	var speed = 0;//定义速度
	obj.timer = setInterval(function(){
		if(type == "alpha"){//如果是透明度变化
			if(obj.alpha > iTarget){
				speed = -10;
			}else{
				speed = 10;
			}
			if(obj.alpha == iTarget){
				clearInterval(obj.timer);
			}else{
				obj.alpha = obj.alpha+speed;
				obj.style.filter = "alpha(opacity:"+obj.alpha+")";
				obj.style.opacity = obj.alpha/100;	
			}
		}else{//如果不是透明度变化
			//获取对象容器当前属性的值
			var oStyleValue = parseInt(getStyle(obj,type));
			//判断速度正负情况下的取值
			speed = speed>0 ? Math.ceil((iTarget-oStyleValue)/5) : Math.floor((iTarget-oStyleValue)/5);
			//判断对象是否运行到目标值
			if(oStyleValue == iTarget){
				clearInterval(obj.timer);
				if(fn){
					fn();
				}
			}else{
				obj.style[type] = oStyleValue + speed +"px";				
			}
				
		}
	},30);
}

//获取obj对象某属性当前具体值
function getStyle(obj, type){
	if(obj.currentStyle){//IE浏览器
		return obj.currentStyle[type];
	}else{//Firefox浏览器
		return getComputedStyle(obj,false)[type];
	}
}


正在回答

1 回答

startAct(this,"height",100,function(){

                        //alert(1);

                        startAct(this,"width",400);

                    });

你这里的对象参数第二个不能为this,第二个this是函数,不是li


你可以var _this = this;

startAct(_this,"height",100,function(){

                        //alert(1);

                        startAct(_this,"width",400);

                    });

,这样是OK的


2 回复 有任何疑惑可以回复我~
#1

kevine099

牛,确实如此
2016-04-18 回复 有任何疑惑可以回复我~
#2

缄默蜀黍ONE 提问者

非常感谢!
2016-04-18 回复 有任何疑惑可以回复我~
#3

缄默蜀黍ONE 提问者

开始一直都以为那个this指代每次遍历后的对象,苦了我了,想了半个下午[/笑哭][/捂脸],再次感谢大神指点d=====( ̄▽ ̄*)b
2016-04-18 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

我在做多目标联动时为什么就会出错?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信