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

帮忙找bug, 参考老师的思路写的单线程链式同步动画好像有些问题, 大家来找找.

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>链式同步运动</title>
		<style type="text/css">
			#div1 {
				margin:0 auto;
				width:200px;
				height:200px;
				background:red;
				filter:alpha(opacity=100);
				opacity:1;
			}
			#div2 {
				margin:20px auto;
				width:200px;
				height:200px;
				background:green;
				filter:alpha(opacity=100);
				opacity:1;
			}
		</style>
	</head>
	<body>
		<div id="div1"></div>
		<div id="div2"></div>
		<script type="text/javascript">
			var div1 = document.getElementById("div1");
			var div2 = document.getElementById("div2");
			div1.onmouseover = function() {
				change(this,{"width":400,"height":300,"opacity":20},function() {
					change(this,{"width":200,"height":200,"opacity":100},function() {
						change(this,{"width":400,"height":400,"opacity":10});
					})
				})
			}
			div1.onmouseout = function() {
				change(this,{"width":400,"height":300,"opacity":20},function() {
					change(this,{"width":300,"height":300,"opacity":60},function() {
						change(this,{"width":200,"height":200,"opacity":100});
					})
				})
			}
			div2.onmouseover = function() {
				change(this,{"width":400,"height":300,"opacity":10},function() {
					change(this,{"width":200,"height":200,"opacity":100},function() {
						change(this,{"width":400,"height":400,"opacity":10});
					})
				})
			}
			div2.onmouseout = function() {
				change(this,{"width":400,"height":300,"opacity":20},function() {
					change(this,{"width":300,"height":300,"opacity":60},function() {
						change(this,{"width":200,"height":200,"opacity":100});
					})
				})
			}
			function change(obj,target,callback) {
				//首先清除上一个定时器
				clearInterval(obj.timer);
				//定义变量
				var origin={};
				var speed = 0;
				var flag = true;
				//遍历获取初始属性
				for(attr in target) {
					if( attr === "opacity" ) {
						origin[attr] = Math.round(getStyle(obj,attr)*100);		
					} else {
						origin[attr] = parseInt(getStyle(obj,attr));		
					}
				}
				//设置定时器
				obj.timer = setInterval(function() {
					
					//初始化标记true
					flag = true;
					
					//遍历目标值
					for( attr in target) {
						
						//计算速度
						speed = (target[attr]-origin[attr])/10;
						speed = speed>0?Math.ceil(speed):Math.floor(speed);
						
						//改变初始数值
						origin[attr] += speed;
						if(attr === "opacity") {
							obj.style.opacity = origin[attr]/100;
							obj.style.filter = 'alpha(opacity='+origin[attr]+')';
						} else {
							obj.style[attr] = origin[attr] + "px";
						}
						
						//若有一个不等则将标记设为false
						if(target[attr] != origin[attr]) {
							flag = false;
						}
					}
					console.log("定时器清除了没?");
					//如果标记值为true清除定时器
					if(flag) {
						clearInterval(obj.timer);
						//设置回调函数
						if(callback) {
							callback.call(obj);
						}
					}	
				},30);
			}
			
			//获取元素外联和内联样式
			function getStyle(obj,attr) {
				return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj,false)[attr];
			}
		</script>
	</body>
</html>


正在回答

2 回答

题主的程序测着没问题啊。。

0 回复 有任何疑惑可以回复我~

<!DOCTYPE html>

<html>

    <head>

        <meta charset="UTF-8">

        <title>链式同步运动</title>

        <style type="text/css">

            #div1 {

                margin:0 auto;

                width:100px;

                height:100px;

                background:red;

                filter:alpha(opacity=100);

                opacity:1;

            }

            #div2 {

                margin:20px auto;

                width:100px;

                height:100px;

                background:green;

                filter:alpha(opacity=100);

                opacity:1;

            }

        </style>

    </head>

    <body>

        <div id="div1"></div>

        <div id="div2"></div>

        <script type="text/javascript">

            var div1 = document.getElementById("div1");

            var div2 = document.getElementById("div2");

            div1.onmouseover = function() {

                change(this,{"width":200,"height":200,"opacity":20})

            }

            div1.onmouseout = function() {

                change(this,{"width":100,"height":100,"opacity":100})

            }

            div2.onmouseover = function() {

                change(this,{"width":200,"height":200,"opacity":10})

            }

            div2.onmouseout = function() {

                change(this,{"width":100,"height":100,"opacity":100})

            }

            function change(obj,target,callback) {

                //首先清除上一个定时器

                clearInterval(obj.timer);

                //定义变量

                var origin={};

                var speed = 0;

                var flag = true;

                //遍历获取初始属性

                for(attr in target) {

                    if( attr === "opacity" ) {

                        origin[attr] = Math.round(getStyle(obj,attr)*100);       

                    } else {

                        origin[attr] = parseInt(getStyle(obj,attr));     

                    }

                }

                //设置定时器

                obj.timer = setInterval(function() {

                     

                    //初始化标记true

                    flag = true;

                     

                    //遍历目标值

                    for( attr in target) {

                         

                        //计算速度

                        speed = (target[attr]-origin[attr])/10;

                        speed = speed>0?Math.ceil(speed):Math.floor(speed);

                         

                        //改变初始数值

                        origin[attr] += speed;

                        if(attr === "opacity") {

                            obj.style.opacity = origin[attr]/100;

                            obj.style.filter = 'alpha(opacity='+origin[attr]+')';

                        } else {

                            obj.style[attr] = origin[attr] + "px";

                        }

                         

                        //若有一个不等则将标记设为false

                        if(target[attr] != origin[attr]) {

                            flag = false;

                        }

                    }

                    console.log("定时器清除了没?");

                    //如果标记值为true清除定时器

                    if(flag) {

                        clearInterval(obj.timer);

                        //设置回调函数

                        if(callback) {

                            callback.call(obj);

                        }

                    }  

                },30);

            }

             

            //获取元素外联和内联样式

            function getStyle(obj,attr) {

                return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj,false)[attr];

            }

        </script>

    </body>

</html>


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

mwm喵 提问者

????没有改动额
2016-11-06 回复 有任何疑惑可以回复我~
#2

前端_小小白 回复 mwm喵 提问者

鼠标移入移出事件那边改了
2016-11-06 回复 有任何疑惑可以回复我~
#3

mwm喵 提问者 回复 前端_小小白

bug应该不是在函数调用那块 鼠标移入移出事件后面加的是链式操作的回调函数,没问题的. 其实我想你们找的bug是在我写的change函数里面 在透明度变化的时候会有极小的几率卡在0.19和0.2之间这是其一(我测试几十次好像出现了一次)(帮我解决下) 还有一些bug就需要你们测试了
2016-11-06 回复 有任何疑惑可以回复我~
#4

常班长 回复 mwm喵 提问者

33行和34行里的回调函数里不能引用this吧,此处的this应该不是指向的当前<div>标签,而是指向的window
2016-11-08 回复 有任何疑惑可以回复我~
#5

mwm喵 提问者 回复 常班长

我change的回调函数用call改变了this指向了(指向的就是当前的div哦) (仔细看代码)
2016-11-08 回复 有任何疑惑可以回复我~
查看2条回复

举报

0/150
提交
取消

帮忙找bug, 参考老师的思路写的单线程链式同步动画好像有些问题, 大家来找找.

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