我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JavaScript动画函数封装的示例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JavaScript动画函数封装的示例分析

小编给大家分享一下JavaScript动画函数封装的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

一、动画函数原理

核心原理:通过定时器setInterval() 不断移动盒子位置。

实现步骤:

  1. 获得盒子当前位置

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

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

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

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

如下所示:

给定一个盒子,让其慢慢移动到300px的位置。

代码如下:

<style>   div{        position: absolute;        left: 0;        top: 0;        width: 100px;        height: 100px;        background-color: cyan;    }</style></head><body>    <div></div>    <script>        var div = document.querySelector('div');        var timer = setInterval(function(){            if(div.offsetLeft >= 300){                clearInterval(timer);            }            div.style.left = div.offsetLeft + 1 +'px';        },30);     </script></body>

运行结果为:

JavaScript动画函数封装的示例分析

运行成功。

但是如果同时有好几个元素都需要添加动画呢?我们就可以考虑将其封装成一个简单的动画函数。

二、动画函数简单封装

函数需要传递2个参数,动画对象和移动到的距离。如下所示:

 function animate(obj,target){            var timer = setInterval(function(){            if(obj.offsetLeft >= target){                clearInterval(timer);            }            obj.style.left = obj.offsetLeft + 1 +'px';        },30);        }

我们就可以通过调用上述封装的函数来实现动画效果。例如,给定两个不同的盒子,分别调用动画函数:

 <style>       .box1{            position: absolute;            left: 0;            top: 50px;            width: 100px;            height: 100px;            background-color: cyan;        }        .box2{            position: absolute;            left: 0;            top: 155px;            width: 150px;            height: 150px;            background-color: deepskyblue;        }    </style><body>   <div class="box1"></div>   <div class="box2"></div>    <script>        function animate(obj,target){            var timer = setInterval(function(){            if(obj.offsetLeft >= target){                clearInterval(timer);            }            obj.style.left = obj.offsetLeft + 1 +'px';        },30);        }        var box1 = document.querySelector('.box1');        var box2 = document.querySelector('.box2');        animate(box1,300);        animate(box2,400);    </script></body>

效果为:

JavaScript动画函数封装的示例分析

成功实现了动画的效果。

但是上面封装的动画函数还是有问题的,每当我们调用一次动画函数,就会给我们开辟一块内存空间,会造成浪费内存资源的问题,而且我们每次调用的动画函数都是以同一个名字命名的,很容易引起歧义,所以我们就可以给不同的元素使用不同的定时器(自己专门用自己的定时器)。

三、 动画函数给不同元素记录不同定时器

核心原理:利用 JS 是一门动态语言,可以很方便的给当前对象添加属性。

通过给对象添加属性的方法给给不同的元素添加定时器,我们可以将其进行如下的封装:

function animate(obj,target){  obj.timer = setInterval(function(){     if(obj.offsetLeft >= target){         clearInterval(obj.timer);     }     obj.style.left = obj.offsetLeft + 1 +'px'; },30);}

当然,如果我们想要让某个元素在我们进行一系列操作后才实现动画效果的话,我们就可以给其添加特定事件,然后将函数调用写在事件中,

以第一个例子为例,给它添加点击事件,当点击按钮后,才让这个盒子发生移动:

 var box1 = document.querySelector('.box1');        var btn = document.querySelector('button')       btn.addEventListener('click',function(){            animate(box1,300);        })

效果为:

JavaScript动画函数封装的示例分析

效果实现,但是如果我们一直点击按钮,会出现什么情况呢?

JavaScript动画函数封装的示例分析

我们会发现,当我们不断点击按钮时,盒子运行的速度会越来越快,这是因为我们同时开启了太多定时器。该如何解决呢?方案就是让我们的元素先清除以前的定时器,只保留一个定时器执行,所以,我们就可以在函数的最上面添加一个清除定时器的操作。代码为:

  function animate(obj,target){            clearInterval(obj.timer);            obj.timer = setInterval(function(){            if(obj.offsetLeft >= target){                clearInterval(obj.timer);            }            obj.style.left = obj.offsetLeft + 1 +'px';        },30);        }        var box1 = document.querySelector('.box1');        var btn = document.querySelector('button');       btn.addEventListener('click',function(){            animate(box1,300);        })

此时的运行效果为

成功实现。

通过上述一系列操作,我们可以发现,我们所实现的动画都是匀速的,为了让效果更加好看,我们可以让我们的动画以缓动的速度运行。

JavaScript动画函数封装的示例分析

四、缓动效果原理

缓动动画就是让元素运动速度有所变化,最常见的是让速度慢慢停下来。

  • 思路:让盒子每次移动的距离慢慢变小,速度就会慢慢落下来。

  • 核心算法: (目标值 - 现在的位置 ) / 10 做为每次移动的距离 步长

  • 停止的条件: 让当前盒子位置等于目标位置就停止定时器

注意步长值需要取整

以上个例子为例,当我们点击按钮时,让元素以缓动的速度移动,我们可以将封装的动画函数改为:

function animate(obj,target){            clearInterval(obj.timer)            obj.timer = setInterval(function(){                var step = (target - obj.offsetLeft)/10;            if(obj.offsetLeft == target){                clearInterval(obj.timer);            }            obj.style.left = obj.offsetLeft + step +'px';        },30);        }

实现效果为:

JavaScript动画函数封装的示例分析

这样的效果是不是更好看了呢?但是我们来检查一下我们的元素具体移动了多大距离,是不是刚好到目标值300px的位置呢?

JavaScript动画函数封装的示例分析

通过检查我们发现,我们的元素并没有到指定位置,这是因为我们的步长公式是有问题的,进行除法运算时,可能会有小数,从而导致位置的偏差,所以我们就需要对步长公式进行取整操作,由于元素是向前运动(正方向),所以我们采用的策略是向上取整:

 var step = Math.ceil((target - obj.offsetLeft)/10);

此时我们在来看看最终到达的目标位置是:

JavaScript动画函数封装的示例分析

此时就刚好到达了目标位置。

五、 动画函数在多个目标值之间移动

但是如果我们的步长为负呢?

举个例子,现在有一个盒子,给其添加两个按钮,一个让元素移动到400px的位置,一个让元素移动到700px:

function animate(obj,target){    clearInterval(obj.timer)     obj.timer = setInterval(function(){         var step = Math.ceil((target - obj.offsetLeft)/10);     if(obj.offsetLeft >= target){         clearInterval(obj.timer);     }     obj.style.left = obj.offsetLeft + step +'px'; },30);} var box1 = document.querySelector('.box1'); var btn = document.querySelectorAll('button') btn[0].addEventListener('click',function(){     animate(box1,400); })  btn[1].addEventListener('click',function(){     animate(box1,700); })

实现效果为:

JavaScript动画函数封装的示例分析

此时发现,当我们正向运动的时候,元素可以精确的到达目标位置,且元素也能实现在两个像素间移动的效果,但是向后退时达到的位置却并不是目标位置,这是因为我们的元素在倒退的时候,是属于反向运动的,这时我们也应该让步长向反向长的位置取整,即向下取整。

这时,我们应该对步长条件进行判断,如果步长大于零,则向上取整,如果步长小于零,则向下取整,调整后的步长公式为:

 var step =(target - obj.offsetLeft)/10; step > 0 ? Math.ceil(step) : Math.floor(step);

此时再来看看效果:

JavaScript动画函数封装的示例分析

问题就解决了。

但是我们此时只是简单的实现了一个元素在两个位置的移动,如果我们想要在它移动后改变颜色,该如何操作呢?我们就可以通过给动画函数添加回调函数 来实现。

六、动画函数添加回调函数

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

回调函数写的位置:定时器结束的位置。

具体实现代码为:

 function animate(obj,target,callback){            clearInterval(obj.timer)            obj.timer = setInterval(function(){                var step =(target - obj.offsetLeft)/10;                step = step > 0 ? Math.ceil(step) : Math.floor(step);            if(obj.offsetLeft == target){                clearInterval(obj.timer);                if(callback){                    callback();                }             }            obj.style.left = obj.offsetLeft + step +'px';            },30);        }        var box1 = document.querySelector('.box1');        var btn = document.querySelectorAll('button');       btn[0].addEventListener('click',function(){            animate(box1,400,function(){                box1.style.backgroundColor = 'pink';            });        })        btn[1].addEventListener('click',function(){            animate(box1,700,function(){                box1.style.backgroundColor = 'red';            });        })

实现效果为:

JavaScript动画函数封装的示例分析

看完了这篇文章,相信你对“JavaScript动画函数封装的示例分析”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JavaScript动画函数封装的示例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JavaScript动画函数封装的示例分析

小编给大家分享一下JavaScript动画函数封装的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、动画函数原理核心原理:通过定时器setInterval() 不断移动盒子位置。实现步骤:获得盒子当前位置让盒子在
2023-06-22

Angular路由动画及高阶动画函数的示例分析

小编给大家分享一下Angular路由动画及高阶动画函数的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、路由动画路由动画需要在host元数据中指定触发器。动画注意不要过多,否则适得其反。内容优先,引导用户去注意到
2023-06-15

web前端:JS---案例:移动元素,封装动画函数

编程学习网:函数是指一段在一起的、可以做某一件事儿的程序。也叫做子程序、(OOP中)方法。
web前端:JS---案例:移动元素,封装动画函数
2024-04-23

Vue接口封装的示例分析

这篇文章主要介绍了Vue接口封装的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。首先根据接口写好对应页面的请求内容如图尽量保证js文件名称与页面文件名称相同(易于查找
2023-06-15

Android网络封装的示例分析

这篇文章给大家分享的是有关Android网络封装的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言:模拟用户登录,从安卓发送请求到服务端校验,再从服务端返回给安卓校验结果1.在AndroidManife
2023-06-22

JavaScript函数柯里化的示例分析

这篇文章将为大家详细讲解有关JavaScript函数柯里化的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。函数柯里化使用方法:柯里化是函数式编程的一个重要技巧,将使用多个参数的一个函数转换成一系列
2023-06-27

JavaScript函数式编程示例分析

函数式编程是一种编程范式,将整个程序都由函数调用以及函数组合构成。可以看成一条流水线,数据可以不断地从一个函数的输出流入另一个函数的输入,最后输出结果
2022-11-13

Vue3过渡动画的示例分析

这期内容当中小编将会给大家带来有关Vue3过渡动画的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。背景在我的 《Vue 3 开发企业级音乐 App》课程问答区,有个同学提了个问题,在歌手列表到歌手
2023-06-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录