【JavaScript-动画原理】如何使用js进行动画效果的实现

简介: 【JavaScript-动画原理】如何使用js进行动画效果的实现

前言


动画对于我们来说都不陌生,css里面就有很多动画,2d,3d等各种动画,本篇主要是如何使用js实现动画效果,如果本篇文章对你有帮助,点赞支持一下吧!


1.动画原理


       1.获得盒子当前位置

       2.让盒子在当前位置加上1个移动距离

       3.利用定时器不断重复这个操作

       4.加一个结束定时器的条件        

       5.注意该元素需要添加定位,才能使用element.style.left

<body>
    <div>
    </div>
    <script>
        var div = document.querySelector('div');
        var timer = setInterval(function () {
            if (div.offsetLeft >= 500) {
                clearInterval(timer);
            }
            div.style.left = div.offsetLeft + 2 + 'px';
        }, 30)
    </script>
</body>


主要核心就是利用定时器进行动画的实现


2.动画函数的封装


<script>
        // 简单动画函数封装
        function animate(obj, rug) {
            var timer = setInterval(function () {
                if (obj.offsetLeft >= rug) {
                    clearInterval(timer);
                }
                obj.style.left = obj.offsetLeft + 2 + 'px';
            }, 30)
        }
        var div = document.querySelector('div');
    animate(div,300);
    </script>

把这个动画封装成一个函数,方便以后的使用,该封装函数里的obj是哪个元素要进行动画的实现rug是该元素要移动多少距离


3.给不同元素添加定时器


<body>
    <div>
    </div>
    <button>点击走</button>
    <script>
        // 简单动画函数封装
        // 给不同元素添加定时器
        function animate(obj, rug) {
            clearInterval(obj.timer);
            obj.timer = setInterval(function () {
                if (obj.offsetLeft >= rug) {
                    clearInterval(obj.timer);
                } else {
                    obj.style.left = obj.offsetLeft + 2 + 'px';
                }
            }, 30)
        }
        var div = document.querySelector('div');
        var but = document.querySelector('button');
        but.addEventListener('click', function () {
            animate(div, 200);
        })
    </script>


这样就能实现多个元素进行动画的使用了,并且每个元素都有属于自己的定时器


4.缓动动画原理


公式:目标值-现在的位置/10 ,作为每次的移动距离

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        div {
            position: absolute;
            left: 0;
            width: 100px;
            height: 100px;
            background-color: pink;
        }
    </style>
</head>
<body>
    <button>点击</button>
    <div></div>
    <script>
        function animate(obj, rug) {
            clearInterval(obj.timer);
            obj.timer = setInterval(function () {
                // 步长值
                var step = (rug - obj.offsetLeft) / 10;
                if (obj.offsetLeft == rug) {
                    clearInterval(obj.timer);
                } else {
                    obj.style.left = obj.offsetLeft + step + 'px';
                }
            }, 15)
        }
        var div = document.querySelector('div');
        var but = document.querySelector('button');
        but.addEventListener('click', function () {
            animate(div, 500);
        })
    </script>
</body>
</html>


5.给动画添加回调函数


回调函数原理:函数可以作为一个参数。将这个函数作为参数传到另一个函数里面 ,当那个函数执行完之后,再执行传进去的这个函数,这个过程就叫做回调。



当跑完800米后,会弹出一个框“hello”,这个就是在执行完800米这个动画后再次进行的函数,这就是回调函数



6.动画函数的使用


实现侧边栏滑动效果


当鼠标经过slider就会让con这 个盒子滑动到左侧


当鼠标离开slider就会让con这 个盒子滑动到右侧


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./js/animate.js"></script>
    <style>
        .silder {
            margin-left: 1600px;
            text-align: center;
            position: relative;
            line-height: 100px;
            width: 100px;
            height: 100px;
            background-color: aqua;
        }
        span {}
        .con {
            position: absolute;
            top: 0;
            left: 0;
            z-index: -1;
            width: 200px;
            height: 100px;
            background-color: rgb(132, 0, 255);
        }
    </style>
</head>
<body>
    <div class="silder">
        <span>←</span>
        <div class="con">问题反馈</div>
    </div>
    <script>
        var silder = document.querySelector('.silder');
        var con = document.querySelector('.con');
        var span = document.querySelector('span');
        silder.addEventListener('mouseenter', function () {
            animate(con, -200, function () {
                span.innerHTML = '→';
            });
        })
        silder.addEventListener('mouseleave', function () {
            animate(con, 0, function () {
                span.innerHTML = '←';
            });
        })
    </script>
</body>
</html>



function animate(obj, rug, callback) {
    clearInterval(obj.timer);
    obj.timer = setInterval(function () {
        // 步长值
        // var step = Math.ceil((rug - obj.offsetLeft) / 10);
        var step = (rug - obj.offsetLeft) / 10;
        step = step > 0 ? Math.ceil(step) : Math.floor(step);
        if (obj.offsetLeft == rug) {
            clearInterval(obj.timer);
            if (callback) {
                callback();
            }
        } else {
            obj.style.left = obj.offsetLeft + step + 'px';
        }
        // 回调函数写道计时器结束里
    }, 15)
}
目录
相关文章
|
8月前
|
机器学习/深度学习 JavaScript 前端开发
JS进阶教程:递归函数原理与篇例解析
通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
346 19
|
9月前
|
资源调度 JavaScript 前端开发
Day.js极简轻易快速2kB的JavaScript库-替代Moment.js
dayjs是一个极简快速2kB的JavaScript库,可以为浏览器处理解析、验证、操作和显示日期和时间,它的设计目标是提供一个简单、快速且功能强大的日期处理工具,同时保持极小的体积(仅 2KB 左右)。
574 24
|
11月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
11月前
|
JavaScript 前端开发 Java
深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解
Array.find() 是 JavaScript 数组方法中一个非常实用和强大的工具。它不仅提供了简洁的查找操作,还具有性能上的独特优势:返回的引用能够直接影响原数组的数据内容,使得数据更新更加高效。通过各种场景的展示,我们可以看到 Array.find() 在更新、条件查找和嵌套结构查找等场景中的广泛应用。 在实际开发中,掌握 Array.find() 的特性和使用技巧,可以让代码更加简洁高效,特别是在需要直接修改原数据内容的情形。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
|
11月前
|
监控 JavaScript 前端开发
MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver:原理与实战案例
MutationObserver 是一个非常强大的 API,提供了一种高效、灵活的方式来监听和响应 DOM 变化。它解决了传统 DOM 事件监听器的诸多局限性,通过异步、批量的方式处理 DOM 变化,大大提高了性能和效率。在实际开发中,合理使用 MutationObserver 可以帮助我们更好地控制 DOM 操作,提高代码的健壮性和可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver:原理与实战案例
|
11月前
|
JavaScript 前端开发 Java
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
柯里化是一种强大的函数式编程技术,它通过将函数分解为单参数形式,实现了灵活性与可复用性的统一。无论是参数复用、延迟执行,还是函数组合,柯里化都为现代编程提供了极大的便利。 从 Redux 的选择器优化到复杂的数据流处理,再到深度嵌套的函数优化,柯里化在实际开发中展现出了非凡的价值。如果你希望编写更简洁、更优雅的代码,柯里化无疑是一个值得深入学习和实践的工具。从简单的实现到复杂的应用,希望这篇博客能为你揭开柯里化的奥秘,助力你的开发之旅! 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
|
11月前
|
数据采集 JavaScript 前端开发
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
用array.filter()来实现数据筛选、数据清洗和链式调用,相对于for循环更加清晰,语义化强,能显著提升代码的可读性和可维护性。博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
自然语言处理 JavaScript 前端开发
学习javaScript必知必会(2)~js词法分析、介绍一下主流的浏览器的开发者工具(js调试和查看网络请求)
学习javaScript必知必会(2)~js词法分析、介绍一下主流的浏览器的开发者工具(js调试和查看网络请求)
237 0
学习javaScript必知必会(2)~js词法分析、介绍一下主流的浏览器的开发者工具(js调试和查看网络请求)