原生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的js分页代码
Jun 10 Javascript
Prototype源码浅析 String部分(四)之补充
Jan 16 Javascript
setTimeout的延时为0时多个浏览器的区别
May 23 Javascript
jquery插件推荐 jquery.cookie
Nov 09 Javascript
JavaScript通过代码调用Flash显示的方法
Feb 02 Javascript
AngularJS实现controller控制器间共享数据的方法示例
Oct 30 Javascript
修改npm全局安装模式的路径方法
May 15 Javascript
详解Angular6 热加载配置方案
Aug 18 Javascript
详解Express笔记之动态渲染HTML(新手入坑)
Dec 13 Javascript
Vue核心概念Action的总结
Jan 18 Javascript
jquery操作select常见方法大全【7种情况】
May 28 jQuery
js+canvas实现图片格式webp/png/jpeg在线转换
Aug 22 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
一个很方便的 XML 类!!原创的噢
2006/10/09 PHP
用libTemplate实现静态网页的生成
2006/10/09 PHP
自动跳转中英文页面
2006/10/09 PHP
PHP使用mysqli操作MySQL数据库的简单方法
2017/02/04 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
2017/06/15 PHP
js判断IE6/IE7/FF的代码[XMLHttpRequest]
2011/02/16 Javascript
js前台判断开始时间是否小于结束时间
2012/02/23 Javascript
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
2014/01/31 Javascript
JavaScript实现班级随机点名小应用需求的具体分析
2014/05/12 Javascript
nodejs npm包管理的配置方法及常用命令介绍
2014/06/05 NodeJs
页面加载完后自动执行一个方法的js代码
2014/09/06 Javascript
jQuery获得指定元素坐标的方法
2015/04/14 Javascript
jQuery+jsp下拉框联动获取本地数据的方法(附源码)
2015/12/03 Javascript
JQuery Mobile实现导航栏和页脚
2016/03/09 Javascript
Javascript设计模式之观察者模式(推荐)
2016/03/29 Javascript
jQuery选择器中的特殊符号处理方法
2017/09/08 jQuery
简单的Vue异步组件实例Demo
2017/12/27 Javascript
使用mpvue搭建一个初始小程序及项目配置方法
2018/12/03 Javascript
微信小程序引入VANT组件的方法步骤
2019/09/19 Javascript
vue 使用 vue-pdf 实现pdf在线预览的示例代码
2020/04/26 Javascript
JS事件循环机制event loop宏任务微任务原理解析
2020/08/04 Javascript
详解用python实现简单的遗传算法
2018/01/02 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
2018/04/17 Python
对Python 2.7 pandas 中的read_excel详解
2018/05/04 Python
Python实现快速傅里叶变换的方法(FFT)
2018/07/21 Python
python+os根据文件名自动生成文本
2019/03/21 Python
使用python 的matplotlib 画轨道实例
2020/01/19 Python
如何基于python把文字图片写入word文档
2020/07/31 Python
AmazeUI 评论列表的实现示例
2020/08/13 HTML / CSS
Ted Baker美国官网:英国时尚品牌
2018/10/29 全球购物
系统管理员的职责包括那些?管理的对象是什么?
2013/01/18 面试题
母亲追悼会答谢词
2014/01/27 职场文书
雨中的树观后感
2015/06/03 职场文书
Python访问Redis的详细操作
2021/06/26 Python
OpenFeign实现远程调用
2022/08/14 Java/Android