原生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 相关文章推荐
不用MOUSEMOVE也能滑动啊
May 23 Javascript
网易JS面试题与Javascript词法作用域说明
Nov 09 Javascript
用jQuery实现一些导航条切换,显示隐藏的实例代码
Jun 08 Javascript
jquery实现输入框动态增减的实例代码
Jul 14 Javascript
浅谈JS闭包中的循环绑定处理程序
Nov 09 Javascript
Javascript中神奇的this
Jan 20 Javascript
微信小程序 wx:key详细介绍
Oct 28 Javascript
利用VUE框架,实现列表分页功能示例代码
Jan 12 Javascript
js中删除数组中的某一元素实例(无下标时)
Feb 28 Javascript
使用jQuery实现购物车结算功能
Aug 15 jQuery
vue elementUI table 自定义表头和行合并的实例代码
May 22 Javascript
js中值引用和地址引用实例分析
Jun 21 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 levenshtein()函数用法讲解
2019/03/08 PHP
PHP各种常见经典算法总结【排序、查找、翻转等】
2019/08/05 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
2019/09/30 PHP
innerHTML,outerHTML,innerText,outerText的用法及区别解析
2013/12/16 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
JavaScript中定义函数的三种方法
2015/03/12 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
2015/11/15 Javascript
解析javascript瀑布流原理实现图片滚动加载
2016/03/10 Javascript
URL中“#” “?” &amp;“”号的作用浅析
2017/02/04 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
2017/02/13 Javascript
微信小程序-获得用户输入内容
2017/02/13 Javascript
原生JS实现垂直手风琴效果
2017/02/19 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
2019/05/10 Javascript
vue-test-utils初使用详解
2019/05/23 Javascript
在vue中使用vuex,修改state的值示例
2019/11/08 Javascript
vue项目中自定义video视频控制条的实现代码
2020/04/26 Javascript
将Vue组件库更换为按需加载的方法步骤
2020/05/06 Javascript
js校验开始时间和结束时间
2020/05/26 Javascript
Vue利用localStorage本地缓存使页面刷新验证码不清零功能的实现
2020/09/04 Javascript
使用vue3重构拼图游戏的实现示例
2021/01/25 Vue.js
python BeautifulSoup使用方法详解
2013/11/21 Python
pandas筛选某列出现编码错误的解决方法
2018/11/07 Python
Python制作运行进度条的实现效果(代码运行不无聊)
2021/02/24 Python
佳能法国商店:Canon法国
2019/02/14 全球购物
英国奢侈品牌时尚购物平台:Farfetch(支持中文)
2020/02/18 全球购物
sealed修饰符是干什么的
2012/10/23 面试题
音乐专业应届生教师求职信
2013/11/04 职场文书
户外拓展活动方案
2014/02/11 职场文书
安踏广告词改编版
2014/03/21 职场文书
领导干部群众路线对照检查材料
2014/11/05 职场文书
2014年驾驶员工作总结
2014/11/18 职场文书
申报优秀教师材料
2014/12/16 职场文书
预备党员半年考察意见
2015/06/01 职场文书
接触艺术对孩子学习思维有益
2019/08/06 职场文书
python四种出行路线规划的实现
2021/06/23 Python