这套框架实现了多物体,任意值,链式运动,多值运动,基本满足常见的需求。

  1. /*
  2. 功能:完美运动框架,可以实现多物体,任意值,链式运动,多值运动
  3. 版本:V1.0
  4. 兼容性:Chrome,FF,IE8+ (opera没测)
  5. 备注:参考了智能社blur老师的代码
  6. */
  7.  
  8. /*--------------------------------------------------------
  9. 功能: 获取某个节点下的带有某个class的所有节点
  10. 输入: oParent:要获取的class元素的父级节点
  11. sClass:要获取的元素的class名称
  12. 输出: 获取到的节点数组
  13. --------------------------------------------------------*/
  14. function getElementsByClassName(oParent, sClass){
  15. var oEle = oParent.getElementsByTagName('*');
  16. var result = [];
  17. for (var i = 0; i < oEle.length; i++) {
  18. if(oEle[i].className == sClass){
  19. result.push(oEle[i]);
  20. }
  21. }
  22. return result;
  23. }
  24.  
  25. /*--------------------------------------------------------
  26. 功能: 获取某个对象的属性的具体数值
  27. 输入: obj:对象
  28. sName:属性
  29. 输出: 属性值,注意透明度输出最大为100,不是1
  30. --------------------------------------------------------*/
  31. function getStyle(obj, sName){
  32. var opacityFactor = 1;//如果是透明度属性,值为100,其他属性,值为1
  33. if(sName == 'opacity'){
  34. opacityFactor = 100;
  35. }
  36. if(obj.currentStyle){//IE
  37. return parseFloat(obj.currentStyle[sName]) * opacityFactor;
  38. }else{//非IE
  39. return parseFloat(getComputedStyle(obj, false)[sName]) * opacityFactor;
  40. }
  41. }
  42.  
  43. /*--------------------------------------------------------
  44. 功能: 获取json对象的长度
  45. 输入: json:json对象
  46. 输出: json对象的长度
  47. --------------------------------------------------------*/
  48. function getJsonLength(json){
  49. var jsonLength = 0;
  50. for(var i in json){
  51. jsonLength++;
  52. }
  53. return jsonLength;
  54. }
  55.  
  56. /*--------------------------------------------------------
  57. 功能: 多个属性值同时变化,可以变高,可以变低
  58. 输入: obj:要运动的对象
  59. property:属性名,比如'height'
  60. iTarget:运动结束之后的属性值,比如1000。如果是透明度,100代表全透明。
  61. endFunc(可选):运动结束之后执行的函数
  62. 输出: 无
  63. 备注: 如果是多物体,那么每个物体都要添加一个全局的timer(定时器)属性
  64. --------------------------------------------------------*/
  65. function startMove(obj, json, endFunc){
  66. clearInterval(obj.timer);//清除定时器,解决对同一个定时器调用startMove定时器叠加的问题
  67. var thisStyle = 0;//此时的样式值
  68. var speed = 0;//移动速度
  69. var bStop = true;//假设,刚开始所有的属性都达到了所设置的属性值
  70. var jsonLength = getJsonLength(json);
  71.  
  72. obj.timer = setInterval(function(){
  73. /*
  74. 每次循环的时候,如果一个属性的值达到设定的目标,则把i加1,
  75. 最后检测如果i与json的长度一样,说明每个属性值都达到的目标,
  76. 则开启定时器并执行endFunc
  77. */
  78. var i = 0;
  79. for(var attr in json){
  80. thisStyle = parseFloat(getStyle(obj, attr));
  81. speed = (json[attr] - thisStyle) / 5;
  82. speed = speed>0 ? Math.ceil(speed) : Math.floor(speed);
  83.  
  84. if(speed >= 0 && thisStyle >= json[attr]){//从小往大变化的停止条件
  85. i++;
  86. }else if(speed <= 0 && thisStyle <= json[attr]){//从大往小变化的停止条件
  87. i++
  88. }else{//没达到停止的条件,继续运动
  89. if(attr != 'opacity'){//如果不是设置透明度
  90. obj.style[attr] = thisStyle + speed + 'px';
  91. }else{//如果设置透明度
  92. obj.style[attr] = (thisStyle + speed) / 100 ;
  93. obj.style.filter = 'alpha(opacity:' + (thisStyle + speed) + ')';
  94. }
  95. }
  96. }
  97. if(i == jsonLength){
  98. clearInterval(obj.timer);
  99. if(endFunc) {endFunc();}
  100. }
  101. },30);
  102. }

可以看到在Chrome,FF,IE8+下可以完美运行。

我是JS新手,如果有更好,更方便的实现方案,欢迎各位留言交流。

另外:前端求职ing

JS完美运动框架的更多相关文章

  1. JS完美运动框架【利用了Json】

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  2. js 完美运动框架

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 完美运动框架(js)

    一.前言 学习js运动时,由于在实现多种不同运动效果过程中很多代码是重复的,故将其封装达到代码重用. 二.代码封装重用 function startMove(obj, json, fnEnd){ cl ...

  4. JS 之完美运动框架

    完美运动框架是对原来的任意值运动框架的改善和效率的提升,即利用了json对属性进行封装,从而提高效率: window.onload=function(){ var oDiv=document.getE ...

  5. 【repost】JavaScript完美运动框架的进阶之旅

    运动框架的实现思路 运动,其实就是在一段时间内改变left.right.width.height.opactiy的值,到达目的地之后停止. 现在按照以下步骤来进行我们的运动框架的封装: 匀速运动. 缓 ...

  6. JavaScript “完美运动框架”

    /* “完美运动框架”,所谓“完美”,就是可以实现多个参数,多个物体运动互不影响的一个运动函数move(). * 大致结构如下:运动框架 EXP: move(obj,{width:200,height ...

  7. 2015.8.2js-19(完美运动框架)

    /*完美运动框架*/ //1.先清除定时期,2,获取样式,如果是opacity则单独解决,3,定义速度,4,定义当前值是否到达目的地,5,判断当前值是否到达目的地,6运动基本,如果是opacity f ...

  8. Javascript 完美运动框架——逐行分析代码,让你轻松了解运动的原理

    大家一听这名字就知道,有了这套框架 网上的效果基本都是可以实现的.实际上之前的运动框架还是有局限性的,就是不能让好几个值一块运动. 那这个问题怎么解决呢? 我们先来看看之前的运动框架 function ...

  9. 纯js写“运动”框架

    所谓“运动”不一定真的是运动,在连续的一段时间内改变某一样式都可以成为“运动”. 先写几个会用到的函数 //获取某一元素的指定样式 function getstyle (element, target ...

随机推荐

  1. Go语言 字符串

    在所有编程语言中都涉及到大量的字符串操作,可见熟悉对字符串的操作是何等重要. Go中的字符串和C#中的一样(java也是),字符串内容在初始化后不可修改. 需要注意的是在Go中字符串是有UTF-8编码 ...

  2. A Tour of Go Methods

    Go does not have classes. However, you can define methods on struct types. The method receiver appea ...

  3. hdoj 2203 亲和串

    亲和串 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  4. hdoj 1859 最小长方形

    最小长方形 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  5. [Objective-c 基础 - 1.3] OC带返回值的类方法

    /* 计算器类 1>返回π 2>计算两个整数的平方 3>计算两个整数的和 */ #import <Foundation/Foundation.h> @interface ...

  6. PTA 5-14 电话聊天狂人 (25分)

    给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数NN(\le 10^5≤10​5​​),为通话记录条数.随后NN行,每行给出一条通话记录.简单起见,这里只列出 ...

  7. 1098. Insertion or Heap Sort (25)

    According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...

  8. iOS7 人机界面设计指南

    iOS7 人机界面设计指南     苹果在WWDC 2013大会上发布了iOS 7,新系统一改5年来的拟物路线,在乔纳森•艾维的主导下,加入了更多的“扁平化”和“极简”现代设计元素. iOS7系统界面 ...

  9. java基础理论知识的一些总结

    在学习Java初期,由于我们是刚开始接触Java,我们不仅需要牢牢掌握Java的基础理论知识,来为我们后面对Java更深层次的学习打好基础,而且我们需要养成编程人的思想习惯.来我们一起来探索Java基 ...

  10. NSTimer、 NSTask、 NSThread 和 NSRunloop 之间的区别

    NSTimer是一个计时器对象,方法调用在对未来的选择对象. NSThread是一个线程类. 也就是创建一个线程. NSTask类是一个过程,一种方式运行程序从您的其他程序. NSOperation是 ...