原生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 相关文章推荐
关于可运行代码无法正常执行的使用说明
May 13 Javascript
浅析javascript闭包 实例分析
Dec 25 Javascript
jQuery实现切换页面布局使用介绍
Oct 09 Javascript
javascript仿php的print_r函数输出json数据
Sep 13 Javascript
jQuery实现瀑布流的取巧做法分享
Jan 12 Javascript
jQuery检测滚动条是否到达底部
Dec 15 Javascript
简单的JS时钟实例讲解
Jan 13 Javascript
node.js从数据库获取数据
May 08 Javascript
JS回调函数简单用法示例
Feb 09 Javascript
JavaScript实现左侧菜单效果
Dec 14 Javascript
mongoose更新对象的两种方法示例比较
Dec 19 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
Aug 28 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
全国FM电台频率大全 - 19 广东省
2020/03/11 无线电
使用sockets:从新闻组中获取文章(三)
2006/10/09 PHP
解析php中memcache的应用
2013/06/18 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
2015/11/30 PHP
CI框架集成Smarty的方法分析
2016/05/17 PHP
swoole和websocket简单聊天室开发
2017/11/18 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
javascript 面向对象,实现namespace,class,继承,重载
2009/10/29 Javascript
详细讲解JS节点知识
2010/01/31 Javascript
JS完整获取IE浏览器信息包括类型、版本、语言等等
2014/05/22 Javascript
javascript正则表达式之search()用法实例
2015/01/19 Javascript
nodejs中使用多线程编程的方法实例
2015/03/24 NodeJs
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
2016/04/16 Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
2016/05/12 Javascript
js实现页面a向页面b传参的方法
2016/05/29 Javascript
Vue.js对象转换实例
2017/06/07 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
Node层模拟实现multipart表单的文件上传示例
2018/01/02 Javascript
webpack+vue-cil 中proxyTable配置接口地址代理操作
2020/07/18 Javascript
[48:32]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[01:54]TI珍贵瞬间系列(五):压力
2020/08/29 DOTA
Python编程中的反模式实例分析
2014/12/08 Python
基于Python实现船舶的MMSI的获取(推荐)
2019/10/21 Python
python文字转语音的实例代码分析
2019/11/12 Python
使用opencv中匹配点对的坐标提取方式
2020/06/04 Python
Python如何实现感知器的逻辑电路
2020/12/25 Python
2014年国培研修感言
2014/03/09 职场文书
群众路线教育实践活动剖析材料
2014/09/30 职场文书
党员教师四风问题整改措施思想汇报
2014/10/08 职场文书
中小学生学籍证明
2014/10/25 职场文书
大学生自荐材料范文
2014/12/30 职场文书
作弊检讨书范文
2015/05/06 职场文书
Golang并发操作中常见的读写锁详析
2021/08/30 Golang
python实现简单的三子棋游戏
2022/04/28 Python