一个块的运动前提是让他脱离文档流,在给他定位了之后,手动修改它的top和left值,他就会运动,就是相对他原来的位置而变到你想让他去的地方,这是一个简单的运动,工作中需要封装成一个框架,能够让你随时调用;
下面来自己封装一个框架
一个框架需要参数,那咱自己封装的运动框架需要什么参数呢?
1.目标元素,这个是必须的;
2.对象的哪些属性需要改变呢,咱就需要给他传个对象json,里面外加一个回掉函数,让你告诉他运动完了后还需要做些什么;
3.就是运动的参数,时间之类,也需要一个对象;
function move(obj,json,option){
clearInterval(obj.timer); //清楚定时器,每次开定时器前先清定时器,这是好习惯
option = option || {}; //参数初始化,有些参数不是必须传的,不传的时候让他有个默认值,不至于报错
option.duration = option.duration || 1000; //默认运动时间1s
option.easing = option.easing || 'linear'; //默认匀速运动
var start = {};
var dis = {};
for(var name in json){
if(name == 'opacity'){
start[name] = Math.round(parseFloat(getStyle(obj,name))*100);
}else{
start[name] = parseInt(getStyle(obj,name));
}
dis[name] = json[name] - start[name];
}
var count = Math.floor(option.duration/30);
var n = 0;
obj.timer = setInterval(function(){
n++;
var current = 0;
for(var name in json){
switch(option.easing.toLowerCase()){
case 'linear': //匀速运动
var a = n/count;
current = start[name] + dis[name]*a;
break;
case 'ease-in': //加速运动
var a = n/count;
current = start[name] + dis[name]*Math.pow(a,3);
break;
case 'ease-out': //减速运动
var a = 1 - n/count;
current = start[name] + dis[name]*(1 - Math.pow(a,3));
break;
}
if(name == 'opacity'){ //透明度需要兼容,切不带单位
obj.style.opacity = current/100;
obj.style.filter = 'alpha(opacity:'+current+')';
}else{
obj.style[name] =current + 'px';
}
}
if(n == count){
clearInterval(obj.timer);
option.complete && option.complete(); //运动结束回掉函数
}
},30);
}
网友评论