<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Test</title>
<style>
*{
margin: 0;
padding: 0;
}
#p1{
width: 100px;
height: 100px;
position: absolute;
top: 100px;
left: 100px;
background: lightseagreen;
}
</style>
</head>
<body style="height:2000px;">
<p id="p1"></p>
</body>
<script language="JavaScript">
function doAnimate(obj, destination, attr, callback){
var timer = obj.timer;
var start = 0;
var iSpeed = 0;
clearInterval(timer);
timer = setInterval(function(){
if(attr != "opacity"){
start = parseInt(getStyle(obj, attr));
}else{
start = parseInt(parseFloat(getStyle(obj, attr))*100);
}
var dis = (destination - start)/8;
iSpeed = dis>0?Math.ceil(dis):Math.floor(dis);
if(destination == start){
clearInterval(timer);
callback && callback();
}
start += iSpeed;
if(attr != "opacity"){
obj.style[attr] = start + "px";
}else{
obj.style.opacity = start/100;
obj.style.mozOpacity = start/100;
obj.style.filter = "filter:alpha(opacity="+start+")";
}
}, 30);
}
function getStyle(obj, attr){
if(obj.currentStyle){
return obj.currentStyle[attr];
}else{
return getComputedStyle(obj, false)[attr];
}
}
</script>
<script language="JavaScript">
var op = document.getElementById("p1");
doAnimate(op, 400, "left", function(){
console.log("1:"+getStyle(op, "left"));
op.style.left = 0+"px";
console.log("2:"+getStyle(op, "left"));
});
</script>
</html>
这个例子想要的效果是:p缓冲运动到400px处在立刻回到0px处,自己封装的doAnimate函数的回掉函数应该没问题,但是就是回掉函数中的对left的设置完全没起作用。
如上图所示,p的left属性并没有变成"0px",问题就是这样,求大神帮忙看看
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
当你跑到400位置的时候执行如下代码
执行完回调后,你并没有返回,这个时候start=400,代码继续往下执行。
能发现问题所在了么?
加个return;
这一句是执行了的,p从左边开始,然后再次执行到下面这句时,start仍然是400,所以又跑到右边了
改了一下楼主的代码,用requestAnimationFrame相对于settimeout方法可以提高动画效率,对于开始和结束可以在写的具体点,这里就简单的改成了以下代码: