JavaScript自己写的缓冲动画问题
大家讲道理
大家讲道理 2017-04-10 15:48:12
[JavaScript讨论组]

源代码展示

<!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",问题就是这样,求大神帮忙看看

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(3)
PHP中文网

当你跑到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+")";
}

能发现问题所在了么?

大家讲道理

加个return;

if(destination == start){
    clearInterval(timer);
    callback && callback();
    return;
}
大家讲道理
op.style.left = 0+"px";

这一句是执行了的,p从左边开始,然后再次执行到下面这句时,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;
            }
            #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">
        window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame 
                              || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
        var ele = document.getElementById("p1");
        
        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>
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号