源代码展示
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Test</title>
<style>
*{
margin: 0;
padding: 0;
}
#div1{
width: 100px;
height: 100px;
position: absolute;
top: 100px;
left: 100px;
background: lightseagreen;
}
</style>
</head>
<body style="height:2000px;">
<div id="div1"></div>
</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 oDiv = document.getElementById("div1");
doAnimate(oDiv, 400, "left", function(){
console.log("1:"+getStyle(oDiv, "left"));
oDiv.style.left = 0+"px";
console.log("2:"+getStyle(oDiv, "left"));
});
</script>
</html>
想要的效果
这个例子想要的效果是:div缓冲运动到400px处在立刻回到0px处,自己封装的doAnimate函数的回掉函数应该没问题,但是就是回掉函数中的对left的设置完全没起作用。
如上图所示,div的left属性并没有变成"0px",问题就是这样,求大神帮忙看看
oDiv.style.left = 0+"px";
这一句是执行了的,div从左边开始,然后再次执行到下面这句时,start仍然是400,所以又跑到右边了
obj.style[attr] = start + "px";
改了一下楼主的代码,用requestAnimationFrame相对于settimeout方法可以提高动画效率,对于开始和结束可以在写的具体点,这里就简单的改成了以下代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Test</title>
<style>
*{
margin: 0;
padding: 0;
}
#div1{
width: 100px;
height: 100px;
position: absolute;
top: 100px;
left: 100px;
background: lightseagreen;
}
</style>
</head>
<body style="height:2000px;">
<div id="div1"></div>
</body>
<script language="JavaScript">
window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame
|| window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
var ele = document.getElementById("div1");
requestAnimationFrame(step);
function step(timestamp) {
start = parseInt(ele.style.left);
start += 1;
ele.style.left = start + "px";
if (start < 200) {
requestAnimationFrame(step);
}else{
ele.style.left = "100px";
requestAnimationFrame(step);
}
}
</script>
</html>
加个return;
if(destination == start){
clearInterval(timer);
callback && callback();
return;
}
当你跑到400位置的时候执行如下代码
if(destination == start){
clearInterval(timer);
callback && callback();
}
执行完回调后,你并没有返回,这个时候start=400,代码继续往下执行。
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+")";
}
能发现问题所在了么?