原生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 相关文章推荐
javascript Ext JS 状态默认存储时间
Feb 15 Javascript
jquery获得页面元素的坐标值实现思路及代码
Apr 15 Javascript
jquery可定制的在线UEditor编辑器
Nov 17 Javascript
jQuery插件Validate实现自定义校验结果样式
Jan 18 Javascript
jQuery Timelinr实现垂直水平时间轴插件(附源码下载)
Feb 16 Javascript
JavaScript中style.left与offsetLeft的使用及区别详解
Jun 08 Javascript
超简单的Vue.js环境搭建教程
Mar 17 Javascript
vue编译打包本地查看index文件的方法
Feb 23 Javascript
jquery 实现拖动文件上传加载进度条功能
Mar 18 jQuery
js实现移动端图片滑块验证功能
Sep 29 Javascript
Vue3配置axios跨域实现过程解析
Nov 25 Vue.js
详解CocosCreator消息分发机制
Apr 16 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
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
2015/10/01 PHP
CI框架数据库查询之join用法分析
2016/05/18 PHP
PHP正则表达式匹配替换与分割功能实例浅析
2017/02/04 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
php利用ZipArchive类操作文件的实例
2020/01/21 PHP
jscript之List Excel Color Values
2007/06/13 Javascript
Javascript模块模式分析
2008/05/16 Javascript
深入了解javascript中的prototype与继承
2013/04/14 Javascript
js仿百度贴吧验证码特效实例代码
2014/01/16 Javascript
js实现图片漂浮效果的方法
2015/03/02 Javascript
jquery插件ajaxupload实现文件上传操作
2015/12/09 Javascript
jQuery中的ready函数与window.onload谁先执行
2016/06/21 Javascript
ECMAScript6快速入手攻略
2016/07/18 Javascript
AngularJs  Creating Services详解及示例代码
2016/09/02 Javascript
使用angular帮你实现拖拽的示例
2017/07/05 Javascript
vue axios登录请求拦截器
2018/04/02 Javascript
15分钟上手vue3.0(小结)
2020/05/20 Javascript
[40:10]2015国际邀请赛全明星表演赛
2015/08/07 DOTA
python提取字典key列表的方法
2015/07/11 Python
Python抓取电影天堂电影信息的代码
2016/04/07 Python
python修改FTP服务器上的文件名
2019/09/11 Python
python3.8与pyinstaller冲突问题的快速解决方法
2020/01/16 Python
pycharm实现在子类中添加一个父类没有的属性
2020/03/12 Python
浅析Python 责任链设计模式
2020/09/11 Python
彪马西班牙官网:PUMA西班牙
2019/06/18 全球购物
法学院方阵解说词
2014/01/29 职场文书
四个太阳教学反思
2014/02/01 职场文书
科长竞争上岗演讲稿
2014/05/12 职场文书
一份文言文检讨书
2014/09/13 职场文书
幼师中班个人总结
2015/02/12 职场文书
2014年终个人总结报告
2015/03/09 职场文书
公司仓管员岗位职责
2015/04/01 职场文书
pytorch实现手写数字图片识别
2021/05/20 Python
javascript进阶篇深拷贝实现的四种方式
2022/07/07 Javascript
win7配置本地ftp服务器的图文教程
2022/08/05 Servers