[Js]高级运动
2014-04-16 09:49
309 查看
一、链式运动框架
1.他需要一个回调函数,在运动停止时,开始下一次运动(执行函数)
多物体运动框架改为如下:
function startMove(obj,attr,iTarget,fn){
...
if(iCur==iTarget){
clearInterval(obj.timer);
fn();
}...
};
然后就可以用它,比如先变宽再变高最后变透明度
startMove(this,'width',300,function(){
startMove(this,'height',300,function(){
startMove(this,'opacity',100);
});
});
二、完美运动框架
1.原本多物体运动框架的缺陷
比如要让他宽度高度同时变300,这样写:
startMove(this,'width',300);
startMove(this,'height',300);
问题:只有高度变300了(因为宽度准备运动时会开一个定时器,这个定时器还没开始运动前,执行高度变化的运动,就把之前的定时器关了)
2.for in
for(i=0;i<=arr.length;i++)和for(i in arr)效果一样
①什么时候用for什么时候用for...in呢?
数组:两个都可以用 Json:只能用for...in(因为Json下标没有规律,没有length可言)
对数组而言for...in循环不灵活,因为for循环可以从1可以从2等等任意数字开始,而for...in一循环就全部
②for in小应用
function setStyle(obj,attr,value){
obj.style[attr]=value;
};
setStyle(oDiv,'width','300px');
setStyle(oDiv,'height','300px');
setStyle(oDiv,'background','green');
=====>
function setStyle(obj,json){
var attr='';
for(attr in json){
obj.style[attr]=json[attr];
}
};
setStyle(oDiv,{width:'300px',height:'300px',background:'green'});
③多物体运动框架改进
function startMove(obj,json,fn){
clearInterval(obj.timer);
obj.timer=setInterval(function(){
for(var attr in json){
if(attr=='opacity'){
var iCur=parseInt(parseFloat(getStyle(obj,attr))*100);
}
else{
var iCur=parseInt(getStyle(obj,attr));
}
var iSpeed=(json[attr]-iCur)/8;
iSpeed=iSpeed>0?Math.ceil(iSpeed):Math.floor(iSpeed);
if(iCur==json[attr]){
clearInterval(obj.timer);
if(fn){
fn(); //有传函数这个参数才执行,不然会出错
}
}
else{
if(attr=='opacity'){
obj.style.filter='alpha(opacity:'+(iCur+iSpeed)+')';
obj.style.opacity=(iCur+iSpeed)/100;
}
else{
obj.style[attr]=iCur+iSpeed+'px'
}
}
}
},30);
};
这样还有个问题
if(iCur==json[attr]){
clearInterval(obj.timer);
}
只要json里有任一值到达目标,计时器就停止
比如我让宽度变到103,高度变到300,那高度到不了300就停止了
解决方案
function startMove(obj,json,fn){
clearInterval(obj.timer);
obj.timer=setInterval(function(){
var bStop=true; //先定义一个值,假设所有值都到了
for(var attr in json){
if(attr=='opacity'){
var iCur=parseInt(parseFloat(getStyle(obj,attr))*100);
}
else{
var iCur=parseInt(getStyle(obj,attr));
}
var iSpeed=(json[attr]-iCur)/8;
iSpeed=iSpeed>0?Math.ceil(iSpeed):Math.floor(iSpeed);
if(iCur!=json[attr]){
bStop=false; //并不是所有值都到了,就把bStop设成 false
}
if(attr=='opacity'){
obj.style.filter='alpha(opacity:'+(iCur+iSpeed)+')';
obj.style.opacity=(iCur+iSpeed)/100;
}
else{
obj.style[attr]=iCur+iSpeed+'px'
}
}
if(bStop){ //所有值都到了,关闭定时器
clearInterval(obj.timer);
if(fn){
fn(); //有传函数这个参数才执行,不然会出错
}
}
},30);
};
1.他需要一个回调函数,在运动停止时,开始下一次运动(执行函数)
多物体运动框架改为如下:
function startMove(obj,attr,iTarget,fn){
...
if(iCur==iTarget){
clearInterval(obj.timer);
fn();
}...
};
然后就可以用它,比如先变宽再变高最后变透明度
startMove(this,'width',300,function(){
startMove(this,'height',300,function(){
startMove(this,'opacity',100);
});
});
二、完美运动框架
1.原本多物体运动框架的缺陷
比如要让他宽度高度同时变300,这样写:
startMove(this,'width',300);
startMove(this,'height',300);
问题:只有高度变300了(因为宽度准备运动时会开一个定时器,这个定时器还没开始运动前,执行高度变化的运动,就把之前的定时器关了)
2.for in
for(i=0;i<=arr.length;i++)和for(i in arr)效果一样
①什么时候用for什么时候用for...in呢?
数组:两个都可以用 Json:只能用for...in(因为Json下标没有规律,没有length可言)
对数组而言for...in循环不灵活,因为for循环可以从1可以从2等等任意数字开始,而for...in一循环就全部
②for in小应用
function setStyle(obj,attr,value){
obj.style[attr]=value;
};
setStyle(oDiv,'width','300px');
setStyle(oDiv,'height','300px');
setStyle(oDiv,'background','green');
=====>
function setStyle(obj,json){
var attr='';
for(attr in json){
obj.style[attr]=json[attr];
}
};
setStyle(oDiv,{width:'300px',height:'300px',background:'green'});
③多物体运动框架改进
function startMove(obj,json,fn){
clearInterval(obj.timer);
obj.timer=setInterval(function(){
for(var attr in json){
if(attr=='opacity'){
var iCur=parseInt(parseFloat(getStyle(obj,attr))*100);
}
else{
var iCur=parseInt(getStyle(obj,attr));
}
var iSpeed=(json[attr]-iCur)/8;
iSpeed=iSpeed>0?Math.ceil(iSpeed):Math.floor(iSpeed);
if(iCur==json[attr]){
clearInterval(obj.timer);
if(fn){
fn(); //有传函数这个参数才执行,不然会出错
}
}
else{
if(attr=='opacity'){
obj.style.filter='alpha(opacity:'+(iCur+iSpeed)+')';
obj.style.opacity=(iCur+iSpeed)/100;
}
else{
obj.style[attr]=iCur+iSpeed+'px'
}
}
}
},30);
};
这样还有个问题
if(iCur==json[attr]){
clearInterval(obj.timer);
}
只要json里有任一值到达目标,计时器就停止
比如我让宽度变到103,高度变到300,那高度到不了300就停止了
解决方案
function startMove(obj,json,fn){
clearInterval(obj.timer);
obj.timer=setInterval(function(){
var bStop=true; //先定义一个值,假设所有值都到了
for(var attr in json){
if(attr=='opacity'){
var iCur=parseInt(parseFloat(getStyle(obj,attr))*100);
}
else{
var iCur=parseInt(getStyle(obj,attr));
}
var iSpeed=(json[attr]-iCur)/8;
iSpeed=iSpeed>0?Math.ceil(iSpeed):Math.floor(iSpeed);
if(iCur!=json[attr]){
bStop=false; //并不是所有值都到了,就把bStop设成 false
}
if(attr=='opacity'){
obj.style.filter='alpha(opacity:'+(iCur+iSpeed)+')';
obj.style.opacity=(iCur+iSpeed)/100;
}
else{
obj.style[attr]=iCur+iSpeed+'px'
}
}
if(bStop){ //所有值都到了,关闭定时器
clearInterval(obj.timer);
if(fn){
fn(); //有传函数这个参数才执行,不然会出错
}
}
},30);
};
相关文章推荐
- JS高级运动实例分析
- JS高级运动实例分析
- [JS思路]运动框架思路
- js自学笔记--高级技巧
- js 数组操作(高级)
- JS高级技巧学习小结
- JS链式运动框架
- JS高级程序设计5-引用类型
- js实现运动logo图片效果及运动元素对象sportBox使用方法
- JS高级笔记
- 完美运动框架【js】
- 超级实用且不花哨的js代码大全 (二) -----高级应用(一)
- js运动框架_包括图片的淡入淡出效果
- Tween.js各类原生动画运动缓动算法
- 转别人的js(二)高级运用--b
- js中的运动
- JS高级拖动技术 setCapture,releaseCapture
- 每日一个js实例5--通过面向对象实现运动
- js高级程序设计
- JS高级程序设计——BOM