原生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 相关文章推荐
Firefox outerHTML实现代码
Jun 04 Javascript
js select常用操作控制代码
Mar 16 Javascript
Firefox下提示illegal character并出现乱码的原因
Mar 25 Javascript
jquery 实现窗口的最大化不论什么情况
Sep 03 Javascript
ajax级联菜单实现方法实例分析
Nov 28 Javascript
JavaScript使用正则表达式获取全部分组内容的方法示例
Jan 17 Javascript
js遮罩效果制作弹出注册界面效果
Jan 25 Javascript
vue-cli的webpack模板项目配置文件分析
Apr 01 Javascript
JS事件流与事件处理程序实例分析
Aug 16 Javascript
JavaScript实现简单贪吃蛇效果
Mar 09 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
Jul 14 jQuery
JS创建自定义对象的六种方法总结
Dec 15 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+oracle 分页类
2006/10/09 PHP
本地机apache配置基于域名的虚拟主机详解
2013/08/10 PHP
linux下编译安装memcached服务
2014/08/03 PHP
PHP关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
php批量删除超链接的实现方法
2015/10/19 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
JavaScript的面向对象(二)
2006/11/09 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
面向切面编程(AOP)的理解
2015/05/01 Javascript
基于JavaScript代码实现微信扫一扫下载APP
2015/12/30 Javascript
Vue.js每天必学之组件与组件间的通信
2016/09/08 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
微信小程序通过api接口将json数据展现到小程序示例
2017/01/20 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
浅谈angular4 ng-content 中隐藏的内容
2017/08/18 Javascript
vue动态路由:路由参数改变,视图不更新问题的解决
2019/11/05 Javascript
浅析vue-router实现原理及两种模式
2020/02/11 Javascript
vue 实现根据data中的属性值来设置不同的样式
2020/08/04 Javascript
Python导出DBF文件到Excel的方法
2015/07/25 Python
实现python版本的按任意键继续/退出
2016/09/26 Python
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
对numpy中布尔型数组的处理方法详解
2018/04/17 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
2018/07/18 Python
在pandas多重索引multiIndex中选定指定索引的行方法
2018/11/16 Python
python实现网页自动签到功能
2019/01/21 Python
python super的使用方法及实例详解
2019/09/25 Python
Python参数传递及收集机制原理解析
2020/06/05 Python
联想西班牙官网:Lenovo西班牙
2018/08/28 全球购物
Square Off美国/加拿大:世界上最聪明的国际象棋棋盘
2018/12/06 全球购物
试解释COMMIT操作和ROLLBACK操作的语义
2014/07/25 面试题
教师实习自我鉴定
2013/12/11 职场文书
秋季婚礼证婚词
2014/01/11 职场文书
员工入职担保书范文
2014/04/01 职场文书
如何写求职信
2014/05/24 职场文书
2015教师个人师德工作总结
2015/10/23 职场文书
Redis监控工具RedisInsight安装与使用
2022/03/21 Redis