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

/*
功能:完美运动框架,可以实现多物体,任意值,链式运动,多值运动
版本:V1.0
兼容性:Chrome,FF,IE8+ (opera没测)
备注:参考了智能社blur老师的代码
*/ /*--------------------------------------------------------
功能: 获取某个节点下的带有某个class的所有节点
输入: oParent:要获取的class元素的父级节点
sClass:要获取的元素的class名称
输出: 获取到的节点数组
--------------------------------------------------------*/
function getElementsByClassName(oParent, sClass){
var oEle = oParent.getElementsByTagName('*');
var result = [];
for (var i = 0; i < oEle.length; i++) {
if(oEle[i].className == sClass){
result.push(oEle[i]);
}
}
return result;
} /*--------------------------------------------------------
功能: 获取某个对象的属性的具体数值
输入: obj:对象
sName:属性
输出: 属性值,注意透明度输出最大为100,不是1
--------------------------------------------------------*/
function getStyle(obj, sName){
var opacityFactor = 1;//如果是透明度属性,值为100,其他属性,值为1
if(sName == 'opacity'){
opacityFactor = 100;
}
if(obj.currentStyle){//IE
return parseFloat(obj.currentStyle[sName]) * opacityFactor;
}else{//非IE
return parseFloat(getComputedStyle(obj, false)[sName]) * opacityFactor;
}
} /*--------------------------------------------------------
功能: 获取json对象的长度
输入: json:json对象
输出: json对象的长度
--------------------------------------------------------*/
function getJsonLength(json){
var jsonLength = 0;
for(var i in json){
jsonLength++;
}
return jsonLength;
} /*--------------------------------------------------------
功能: 多个属性值同时变化,可以变高,可以变低
输入: obj:要运动的对象
property:属性名,比如'height'
iTarget:运动结束之后的属性值,比如1000。如果是透明度,100代表全透明。
endFunc(可选):运动结束之后执行的函数
输出: 无
备注: 如果是多物体,那么每个物体都要添加一个全局的timer(定时器)属性
--------------------------------------------------------*/
function startMove(obj, json, endFunc){
clearInterval(obj.timer);//清除定时器,解决对同一个定时器调用startMove定时器叠加的问题
var thisStyle = 0;//此时的样式值
var speed = 0;//移动速度
var bStop = true;//假设,刚开始所有的属性都达到了所设置的属性值
var jsonLength = getJsonLength(json); obj.timer = setInterval(function(){
/*
每次循环的时候,如果一个属性的值达到设定的目标,则把i加1,
最后检测如果i与json的长度一样,说明每个属性值都达到的目标,
则开启定时器并执行endFunc
*/
var i = 0;
for(var attr in json){
thisStyle = parseFloat(getStyle(obj, attr));
speed = (json[attr] - thisStyle) / 5;
speed = speed>0 ? Math.ceil(speed) : Math.floor(speed); if(speed >= 0 && thisStyle >= json[attr]){//从小往大变化的停止条件
i++;
}else if(speed <= 0 && thisStyle <= json[attr]){//从大往小变化的停止条件
i++
}else{//没达到停止的条件,继续运动
if(attr != 'opacity'){//如果不是设置透明度
obj.style[attr] = thisStyle + speed + 'px';
}else{//如果设置透明度
obj.style[attr] = (thisStyle + speed) / 100 ;
obj.style.filter = 'alpha(opacity:' + (thisStyle + speed) + ')';
}
}
}
if(i == jsonLength){
clearInterval(obj.timer);
if(endFunc) {endFunc();}
}
},30);
}

可以看到在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. HDU 4283 You Are the One (12年天津 区间DP)

    题意:有一个队列,每个人有一个愤怒值a[i],如果他是第k个上场,不开心指数就为(k-1)*a[i].但是边上有一个小黑屋(其实就是个堆栈),可以一定程度上调整上场程序 思路:枚举区间和每个人第几个上 ...

  2. javascript设计模式5

    子类引用父类 function extend(subClass,superClass){ var F=function(){}; F.prototype=superClass.prototype; s ...

  3. Windows命令行使用FTP

    1.系统环境 FTP客户端:Windows7旗舰版,管理员权限命令行: FTP服务端:CentOS 6.5,VSFTP,端口 21(默认) 2.登陆FTP 在命令行下输入 ftp,出现 ftp> ...

  4. Ubuntu 固态硬盘 4K对齐及启用 Trim,及其验证方法

    因为之前一个移动硬盘因为坏道蔓延导致没办法继续使用,我略冲动地跑去买了一块 120GB 的三星840 固态硬盘回来.为了使用起来更方便,还去弄了个光驱位硬盘托架,把固态硬盘接在了光驱位与原本的笔记本硬 ...

  5. jad的用法(反编译某目录下所有class)

    jad -s java -d E:\scm\MonitorServerEx\src2 -o -ff -r E:\scm\MonitorServerEx\classes-recomp\**\*.clas ...

  6. Java文件合并

    文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并.很多高大上的分布式文件系统(比如:google的GFS.taobao的TFS)里,也是按block为单位, ...

  7. Android问题-DelphiXE5编义时提示找不到“连接器(arm-linux-androideabi-ld.exe)"

    问题现象:DelphiXE5编义时提示找不到“连接器(arm-linux-androideabi-ld.exe)" 问题提示:Checking project dependencies... ...

  8. ACCESS-delphi向中插入一条记录报错,但ACCESS不会

    问题:在DELPHI中向ACCESS中插入一条记录时,提示“插入错误”,但是取出SQL直接放在ACCESS中插入成功?答:原因是插入语句中的字段名是DELPHI的内部标示符.

  9. hdoj 2682 Tree

    Tree Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  10. 自定义实现MPVolumeView音量控件

    http://blog.csdn.net/theonezh/article/details/8158420 http://www.cnblogs.com/cate/ios/ http://www.cn ...