JavaScript实现缓慢动画的封装

简介: JavaScript实现缓慢动画的封装

实现小球不匀速运动

 
<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
 
        #ball {
            width: 100px;
            height: 100px;
            background-color: red;
            border-radius: 50%;
            position: absolute;
            left: 100px;
            top: 200px
        }
 
        #wall_l {
            width: 1px;
            height: 300px;
            background-color: black;
            position: absolute;
            left: 99px;
            top: 150px;
        }
 
        #wall_r {
            width: 1px;
            height: 300px;
            background-color: black;
            position: absolute;
            left: 1200px;
            top: 150px;
        }
    </style>
</head>
 
<body>
    <div id="ball"></div>
    <div id="wall_l"></div>
    <div id="wall_r"></div>
 
    <button>向右</button><button>向左</button> <button>开始</button>
    <script>
        //1.查
        var ball = document.querySelector('#ball');
        var wall_l = document.querySelector('#wall_l')
        var wall_r = document.querySelector('#wall_r')
 
        var btns = document.querySelectorAll('button');
 
        //向右
        btns[0].onclick = function () {
            moveR()
 
        }
        btns[1].onclick = function () {
            moveL()
        }
        btns[2].onclick = function () {
            animate(ball,1100,function(){
                animate(ball,100)
            })
 
        }
 
        //缓慢动画   (由快到慢)   
        //速度公式   speed= (end-start)/10
        var timer;
        function moveR() {
            clearInterval(timer);
         timer=  setInterval(function () {
                // 获得小球当前的位置
                var l=ball.offsetLeft;
                var target=1100;//目标位置  结束位置
                var speed=(target-l)/10;
                 speed=  Math.ceil(speed)
                console.log(speed);//0.4~~~0
                if(ball.offsetLeft==target){
                    clearInterval(timer)
                }
                //让小球 改变位置
                ball.style.left=l+speed+'px'
            }, 25)
 
 
        }
 
        function moveL() {
            clearInterval(timer);
         timer=  setInterval(function () {
                // 获得小球当前的位置
                var l=ball.offsetLeft;
                var target=100;//目标位置  结束位置
                var speed=(target-l)/10;
                 speed=  Math.floor(speed)
                console.log(speed);//-0.5~~~0
                if(ball.offsetLeft==target){
                    clearInterval(timer)
                }
                //让小球 改变位置
                ball.style.left=l+speed+'px'
            }, 25)
 
 
        }
 
 
    </script>
    <script>
        //封装一下
        // obj 对象  target 目标位置  callback回调函数 -可选
        function animate(obj,target,callback){
 
            clearInterval(obj.timer);//防止定时器累加  或来回拉扯的过程
            obj.timer=  setInterval(function () {
                // 获得小球当前的位置
                var l=obj.offsetLeft;
                var speed=(target-l)/10;
                 speed= speed>0? Math.ceil(speed):Math.floor(speed)
                if(obj.offsetLeft==target){
                    clearInterval(obj.timer);
                    callback&&callback();
                }
                //让小球 改变位置
                obj.style.left=l+speed+'px'
            }, 25)
 
        }
    </script>
 
</body>
 
</html>
相关文章
|
9天前
|
JavaScript 前端开发 数据可视化
js 实现动画的两种方案对比:setTimeout vs RAF (requestAnimationFrame)
js 实现动画的两种方案对比:setTimeout vs RAF (requestAnimationFrame)
17 2
|
12天前
|
JavaScript 前端开发 容器
vue组件封装——固定宽高比的容器(2种方法:纯CSS实现 + JS实现)
vue组件封装——固定宽高比的容器(2种方法:纯CSS实现 + JS实现)
15 2
|
12天前
|
JavaScript
js函数封装 —— 金额添加千分位分隔符
js函数封装 —— 金额添加千分位分隔符
12 2
|
11天前
|
JavaScript
js 高频实用函数封装汇总(持续更新)
js 高频实用函数封装汇总(持续更新)
10 0
|
11天前
|
JavaScript
js 数组移除指定元素【函数封装】(含对象数组移除指定元素)
js 数组移除指定元素【函数封装】(含对象数组移除指定元素)
9 0
|
12天前
|
前端开发 JavaScript API
只会用插件可不行,这些前端动画技术同样值得收藏-JavaScript篇(下)
只会用插件可不行,这些前端动画技术同样值得收藏-JavaScript篇(下)
14 0
|
12天前
|
监控 JavaScript 前端开发
只会用插件可不行,这些前端动画技术同样值得收藏-JavaScript篇(上)
只会用插件可不行,这些前端动画技术同样值得收藏-JavaScript篇(上)
16 0
|
12天前
|
前端开发 JavaScript
前端 JS 经典:数字变化动画
前端 JS 经典:数字变化动画
14 0
|
12天前
|
前端开发 JavaScript 开发者
前端 JS 经典:通用性函数封装思路
前端 JS 经典:通用性函数封装思路
14 0
|
13天前
|
前端开发 JavaScript
前端 JS 经典:封装全屏功能
前端 JS 经典:封装全屏功能
7 0