//獲取非行間樣式的封裝 function setStyle(obj,name){ // 考慮相容性問題 if(obj.currentStyle){//不相容火狐和谷歌 return obj.currentStyle[name]; }else{ return getComputedStyle(obj ...
//獲取非行間樣式的封裝
function setStyle(obj,name){
// 考慮相容性問題
if(obj.currentStyle){//不相容火狐和谷歌
return obj.currentStyle[name];
}else{
return getComputedStyle(obj,false)[name];//不相容IE
}
}
function move(obj,json,complete) {
// 用計時器前先清除,防止多次點擊
clearInterval(obj.timer);
// 設置complete的預設值
var complete=complete||{};//如果有就是用戶傳入的值,否則就是一個空對象
complete.dur=complete.dur||2000;//時間:如果有就是用戶傳入的值,否則預設2000
complete.easing=complete.easing||"linear";//運動方式:如果有就是用戶傳入的值,否則預設勻速
//總步數=總時間÷計時器設定的時間
var count = parseInt(complete.dur / 30);
//起始位置,先定義一個json
var start={};
//總距離=傳入的距離-起始距離
var dis={};
// 因為傳入了多個起始目標和多個終點目標,所以先迴圈
for(name in json){
start[name]=parseFloat(setStyle(obj,name));
dis[name]=json[name]-start[name];
}
// 每步運動的距離=總距離÷總步數
// var spen = dis[name] / count;
// 定義起始步數
var n = 0;
obj.timer = setInterval(function () {
n++;
for(name in json){
var a=n/count;
switch(complete.easing){//判斷
case "linear":
var cur=start[name] + a * dis[name];//起始位置+當前運動的距離*總距離÷總步數,數學中先乘後除或先除後乘結果都一樣
break;
case "ease-in":
var cur=start[name] + Math.pow(a,3) * dis[name];
break;
case "ease-out":
var a=1-n/count;
var cur=start[name] +(1-Math.pow(a,3)) * dis[name];
break;
}
// 把當前運動的位置保存
// 判斷屬性是不是透明度,透明度不用加單位
if(name=='opacity'){
obj.style[name]=cur;
// 相容IE低版本,IE的透明度是1到100
obj.style.filter='alpha('+cur*100+')';
}else {
obj.style[name] = cur + "px";
}
}
// 判斷運動是否完成
if (n == count) {
// 完成後清除定時器,停止運動
clearInterval(obj.timer);
// 判斷用戶是否傳入回調函數
complete.fn && complete.fn();
}
}, 30);
}