原生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 相关文章推荐
JQery jstree 大数据量问题解决方法
Mar 09 Javascript
面向对象继承实例(a如何继承b问题)(自写)
Jul 01 Javascript
AngularJS初始化过程分析(引导程序)
Dec 06 Javascript
常见JS验证脚本汇总
Dec 01 Javascript
网页挂马方式整理及详细介绍
Nov 03 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
Dec 18 Javascript
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
Nov 14 jQuery
js Element Traversal规范中的元素遍历方法
Apr 19 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
Jul 16 Javascript
微信小程序 搜索框组件代码实例
Sep 06 Javascript
uni-app使用微信小程序云函数的步骤示例
May 22 Javascript
js+css实现扇形导航效果
Aug 18 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文件服务实现虚拟挂载其他目录示例
2014/04/17 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
2016/03/22 PHP
PHP数组实例详解
2016/06/26 PHP
浅谈PHP各环境下的伪静态配置
2019/03/13 PHP
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
2011/07/27 Javascript
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
js 触发select onchange事件代码
2014/03/20 Javascript
jQuery scrollFix滚动定位插件
2015/04/01 Javascript
jQuery animate和CSS3相结合实现缓动追逐效果附源码下载
2016/04/18 Javascript
jQuery Mobile和HTML5开发App推广注册页
2016/11/07 Javascript
浅析BootStrap中Modal(模态框)使用心得
2016/12/24 Javascript
jQuery中 DOM节点操作方法大全
2017/10/12 jQuery
解决Angular4项目部署到服务器上刷新404的问题
2018/08/31 Javascript
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
Nuxt.js SSR与权限验证的实现
2018/11/21 Javascript
使用JavaScript解析URL的方法示例
2019/03/01 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
2019/04/28 Javascript
微信小程序 wx.getUserInfo引导用户授权问题实例分析
2020/03/09 Javascript
Python获取服务器信息的最简单实现方法
2015/03/05 Python
python中redis的安装和使用
2016/12/04 Python
Python中执行存储过程及获取存储过程返回值的方法
2017/10/07 Python
Python中使用支持向量机SVM实践
2017/12/27 Python
python ansible服务及剧本编写
2017/12/29 Python
pandas读取csv文件提示不存在的解决方法及原因分析
2020/04/21 Python
如何在scrapy中捕获并处理各种异常
2020/09/28 Python
Python中常用的os操作汇总
2020/11/05 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
2020/12/21 Python
python 高阶函数简单介绍
2021/02/19 Python
WoolOvers澳洲官方网站:英国针织服装公司
2018/05/13 全球购物
乌克兰时尚鞋子和衣服购物网站:Born2be
2018/05/24 全球购物
节能减排倡议书
2014/04/15 职场文书
体育馆的标语
2014/06/24 职场文书
离婚民事起诉状
2015/08/03 职场文书
祝福语集锦:给妹妹结婚的祝福语
2019/12/18 职场文书
用JS实现飞机大战小游戏
2021/06/09 Javascript
mysql通过group by分组取最大时间对应数据的两种有效方法
2022/09/23 MySQL