昨天咱們說了一下原生JS中經常使用的兼容性寫法,今天咱們來講一下運動框架.程序員
正常狀況下咱們要寫一個運動的效果會用到tween.js這麼一個插件,這個東西不是通常人寫出來的,由於裏面涉及的運動效果都是通過一堆數學的函數運算出來的,咱們日常人是寫不出來的,全部咱們就本身封裝一個運動框架,有什麼問題改起來也方便,下面咱們就開始封裝.json
首先,咱們先寫一個div,設置一些簡單的樣式,咱們就拿這個div舉例子,以下代碼:框架
#div{
width: 100px;
height: 100px;
background: gold;
position: absolute;
left:0;
top:0;
opacity: 1;
}函數
而後咱們就開始寫js代碼了,以下:學習
window.onload=function() {測試
var oDiv = document.getElementById("div");
var timer;插件
寫一個函數,方便之後用的時候直接調用就行了,首先先傳入幾個參(要運動的對象,變更的屬性,終點距離,運動總時間,回調函數)----今天的只是簡單的封裝一下,你也寫能夠傳入一個json
function move(obj,name, target, dur,fn) {
// 總步數=總時間÷計時器設定的時間
var count = parseInt(dur / 30);
// 起始位置
var start = parseFloat(setStyle(obj,name));
// 總距離=傳入的距離-起始距離
var dis = target - start;
// 每步運動的距離=總距離÷總步數
var spen = dis / count;
// 定義起始步數
var n = 0;
timer = setInterval(function () {
n++;
// 把當前運動的位置保存
var cur=start + n * spen;
// 判斷屬性是否是透明度,透明度不用加單位
if(name=='opacity'){
obj.style[name]=cur;
// 兼容IE低版本,IE的透明度是1到100
obj.style.filter='alpha('+cur*100+')';
}else {
obj.style[name] = start + n * spen + "px";
}
// 判斷運動是否完成
if (n == count) {
// 完成後清除定時器,中止運動
clearInterval(timer);
// 判斷用戶是否傳入回調函數
fn && fn();
};
}, 30);
};對象
而後本身隨便寫一些調用回調函數,測試一下:
oDiv.onclick=function(){
move(oDiv,"left",600,1000,function(){
move(oDiv,'top',400,1000,function(){
move(oDiv,"width",300,1000,function(){
move(oDiv,"opacity",0,1000);
});
});
});
};
// 獲取非行間樣式
function setStyle(obj,name){
// 考慮兼容性問題
if(obj.currentStyle){//不兼容火狐和谷歌
return obj.currentStyle[name];
}else{
return getComputedStyle(obj,false)[name];//不兼容IE
};
};
};ci
好了,今天就先封裝到這裏了,這只是簡單的封裝一下,明天咱們會改進一下,好比參數太多、參數順序不能亂的問題,還有屢次點擊計時器出現的Bug的問題,若是你有好的方法歡迎評論區留言,程序員之間就是要相互學習的,明天見,老鐵們!get