原生js实现jquery函数animate()动画效果的简单实例


Posted in Javascript onAugust 21, 2016

通过在公司一个月的实习,慢慢的对css跟html算是比较熟悉了,这几天开始研究js,今天用js写了一个jquery的animate函数,测试了下,性能还可以。个人觉得jquery并不是万能的,因为是个框架,所以有些东西写的比较死,就像animate函数一样,可选的参数不多有时候可能并不能实现我们想要的效果。


注释的部分是用来测试用的,写代码的过程并不是十分顺利,因为用js平时用的不是很细,都是大体知道方法,也用过,但等到真正要实现动画函数的时候,细枝末节写错了就可能把人难住了。

函数里面有几个参数解释一下,

•obj, 函数的对象

•json, 数值对,形式{attr:”value”, attr: “value”},在这里是指要动画对象的运动属性

•interval, 每执行一次改变的间隔,这里改变的是对象是属性值

•sp, 值变换的速度,使动画具有缓冲效果,而不只是匀速不变(sp为1)的

•fn, 回调函数,执行完动画之后的行为

代码比较简单,只是有几个细节需要注意,在这里提醒一下:

•对象的属性不必直接声明,所以函数的第一句clearInterval(obj.timer);并不会报错。

•必须为每一个对象分别添加一个定时器,否则互相会影响,一个定时器公用的结果是定时器的多个对象运动出现卡顿。

•son数据格式了解一下,当遍历对象的动画属性的时候,需要icur != json[arr]判断是否每一个属性已经达到目标值。flag的作用是防止当其中某个属性第一个达到目标值后,clearInterval(obj.timer)清除了定时器,结果其他动画属性并没有达到目标值。所以在每次遍历的时候初始化flag值为true,只要遇到一个没有达到目标属性的对象,就将flag置为false,直至对象的所有属性达到目标值,清除定时器。

•speed = speed > 0 ? Math.ceil(speed): Math.floor(speed);

这一句的作用是将属性值取整,因为属性值除了opacity没有小数。

•最后调用的时候注意动画的对象,在使用for循环的时候不能随意使用arr[i]形式,尤其是嵌套循环的时候i的值已经变成了最大值。

js

function animate(obj, json, interval, sp, fn) {
  clearInterval(obj.timer);
  //var k = 0;
  //var j = 0;
  function getStyle(obj, arr) {
    if(obj.currentStyle){
      return obj.currentStyle[arr];  //针对ie
    } else {
      return document.defaultView.getComputedStyle(obj, null)[arr]; 
    }
  }
  obj.timer = setInterval(function(){
    //j ++;
    var flag = true;
    for(var arr in json) {
      var icur = 0;
      //k++;
      if(arr == "opacity") {
        icur = Math.round(parseFloat(getStyle(obj, arr))*100);
      } else {
        icur = parseInt(getStyle(obj, arr));
      }
      var speed = (json[arr] - icur) * sp;
      speed = speed > 0 ? Math.ceil(speed): Math.floor(speed);
      if(icur != json[arr]){
        flag = false;
      } 
      if(arr == "opacity"){
        obj.style.filter = "alpha(opacity : '+(icur + speed)+' )";
        obj.style.opacity = (icur + speed)/100;
      }else {
        obj.style[arr] = icur + speed + "px";
      }
      //console.log(j + "," + arr +":"+ flag);
    }

    if(flag){
      clearInterval(obj.timer);
      //console.log(j + ":" + flag); 
      //console.log("k = " + k);
      //console.log("j = " + j);
      //console.log("DONE");
      if(fn){
        fn();
      }
    }
  },interval);
}

调用方式:

<script>
  var move = document.getElementById("move").getElementsByTagName("li");
  for(var i = 0; i < move.length; i ++){
    move[i].onmouseover = function(){
      var _this = this;
      animate(_this, {width: 500, height: 200},10, 0.01, function(){
        animate(_this, {width: 300, height: 200},10, 0.01);
      });

    }
  }

</script>

以上这篇原生js实现jquery函数animate()动画效果的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
读jQuery之十 事件模块概述
Jun 27 Javascript
JS函数实现动态添加CSS样式表文件
Dec 15 Javascript
js中的push和join方法使用介绍
Oct 08 Javascript
JavaScript简单实现网页回到顶部功能
Nov 12 Javascript
js生成的验证码的实现与技术分析
Sep 17 Javascript
javascript实现的图片切割多块效果实例
May 07 Javascript
JavaScript操作HTML元素和样式的方法详解
Oct 21 Javascript
基于JavaScript实现一定时间后去执行一个函数
Dec 14 Javascript
对js中回调函数的一些看法
Aug 29 Javascript
jsTree事件和交互以及插件plugins详解
Aug 29 Javascript
vue实现axios图片上传功能
Aug 20 Javascript
解决layer.confirm快速点击会重复触发事件的问题
Sep 23 Javascript
原生JS实现图片轮播与淡入效果的简单实例
Aug 21 #Javascript
JavaScript实战(原生range和自定义特效)简单实例
Aug 21 #Javascript
原生JS实现-星级评分系统的简单实例
Aug 21 #Javascript
JSONP和批量操作功能的实现方法
Aug 21 #Javascript
全面解析标签页的切换方式
Aug 21 #Javascript
JavaScript第一篇之实现按钮全选、功能
Aug 21 #Javascript
JS实现图片局部放大或缩小的方法
Aug 20 #Javascript
You might like
php中批量修改文件后缀名的函数代码
2011/10/23 PHP
PHP中返回引用类型的方法
2015/04/03 PHP
PHPMAILER实现PHP发邮件功能
2018/04/18 PHP
js+FSO遍历文件夹下文件并显示
2007/03/07 Javascript
jQuery布局插件UI Layout简介及使用方法
2013/04/03 Javascript
js/jquery判断浏览器类型的方法小结
2015/05/12 Javascript
js实现带按钮的上下滚动效果
2015/05/12 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
2015/11/22 Javascript
js实现字符串和数组之间相互转换操作
2016/01/12 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
原生JS实现网络彩票投注效果
2016/09/25 Javascript
详解angularJs指令的3种绑定策略
2017/04/13 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
详解用vue编写弹出框组件
2017/07/04 Javascript
vue component组件使用方法详解
2017/07/14 Javascript
浅谈Vue响应式(数组变异方法)
2018/05/07 Javascript
使用vue.js在页面内组件监听scroll事件的方法
2018/09/11 Javascript
JavaScript动态创建二维数组的方法示例
2019/02/01 Javascript
vue项目添加多页面配置的步骤详解
2019/05/22 Javascript
vue scroll滚动判断的实现(是否滚动到底部、滚动方向、滚动节流、获取滚动区域dom元素)
2020/06/11 Javascript
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
2020/08/20 NodeJs
vue element和nuxt的使用技巧分享
2021/01/14 Vue.js
Python的净值数据接口调用示例分享
2016/03/15 Python
微信跳一跳自动运行python脚本
2018/01/08 Python
python字典快速保存于读取的方法
2018/03/23 Python
Django框架实现逆向解析url的方法
2018/07/04 Python
关于Python作用域自学总结
2019/06/10 Python
Jupyter Notebook折叠输出的内容实例
2020/04/22 Python
Django celery异步任务实现代码示例
2020/11/26 Python
用CSS3实现Win8风格的方格导航菜单效果
2013/04/10 HTML / CSS
巴西购物网站:Onofre Agora
2020/06/08 全球购物
会计学个人自荐信模板
2013/12/13 职场文书
《小山羊和小灰兔》教学反思
2014/02/19 职场文书
服务承诺书怎么写
2014/05/24 职场文书
幸福来敲门观后感
2015/06/04 职场文书
详解 TypeScript 枚举类型
2021/11/02 Javascript