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发布订阅模式封装(纯手工)
发布订阅模式是JS常用的设计模式,在面试中也会经常遇到,以下是我的手写实现方式,经测试效果不错,小伙伴们们可以直接拷贝使用。
|
21天前
|
JavaScript 前端开发 UED
Vue.js动画魔法:解锁流畅过渡,让每一次交互都成为用户心中的小确幸!
【8月更文挑战第30天】在Vue.js中,动画与过渡效果不仅是视觉点缀,更是提升用户体验的关键。通过流畅的动态效果,应用的互动性和吸引力得以增强,从而提高用户满意度和参与度。`&lt;transition&gt;`和`&lt;transition-group&gt;`组件结合CSS过渡,可轻松实现元素的进入、离开及列表变化动画。合理的性能优化,如使用硬件加速,能避免页面卡顿,确保动画既美观又高效。下面是一个简单的淡入淡出效果示例,展示了如何利用Vue.js实现平滑的动画过渡。总之,恰当的动画设计能显著提升应用的用户体验。
32 0
Vue.js动画魔法:解锁流畅过渡,让每一次交互都成为用户心中的小确幸!
|
29天前
|
JavaScript 前端开发
动态背景,视觉盛宴:JavaScript动画让网页活起来!
动态背景,视觉盛宴:JavaScript动画让网页活起来!
|
1月前
|
移动开发 JavaScript 前端开发
基于CSS3、原生JS、Vue3.0技术各自实现序列帧动画效果
这篇文章展示了如何使用纯CSS3、原生JavaScript以及Vue 3.0技术来实现序列帧动画效果,并通过代码示例和动画效果展示了每种方法的实现过程和最终效果。
49 0
|
2月前
|
开发框架 前端开发 JavaScript
循序渐进BootstrapVue,开发公司门户网站(2)--- 使用wow.js动画组件以及自定义的CSS样式处理动态效果
循序渐进BootstrapVue,开发公司门户网站(2)--- 使用wow.js动画组件以及自定义的CSS样式处理动态效果
|
2月前
|
JavaScript 前端开发 数据可视化
js 实现动画的两种方案对比:setTimeout vs RAF (requestAnimationFrame)
js 实现动画的两种方案对比:setTimeout vs RAF (requestAnimationFrame)
45 2
|
2月前
|
JavaScript 前端开发 容器
vue组件封装——固定宽高比的容器(2种方法:纯CSS实现 + JS实现)
vue组件封装——固定宽高比的容器(2种方法:纯CSS实现 + JS实现)
90 2
|
2月前
|
JavaScript
js函数封装 —— 金额添加千分位分隔符
js函数封装 —— 金额添加千分位分隔符
28 2
|
2月前
|
JavaScript
js 高频实用函数封装汇总(持续更新)
js 高频实用函数封装汇总(持续更新)
27 0
|
2月前
|
JavaScript
js 数组移除指定元素【函数封装】(含对象数组移除指定元素)
js 数组移除指定元素【函数封装】(含对象数组移除指定元素)
33 0