變速動畫函數 ...
//獲取任意一個元素的任意一個屬性的當前的值---當前屬性的位置值 function getStyle(element, attr) { return window.getComputedStyle ? window.getComputedStyle(element, null)[attr] : element.currentStyle[attr] || 0; }
//變速動畫函數封裝增加任意多個屬性和回調函數及層級還有透明度 //element元素 json對象 存儲屬性與值 fn為回調函數 function animate(element, json, fn) { //清理定時器 clearInterval(element.timeid); //設置定時器 element.timeid = setInterval(function () { //假設全部到達目標 var f = true; //迴圈去獲取傳入的數據 for (var i in json) { //判斷傳入的值 是不是opacity if (i == 'opacity') { //獲取當前opacity的值 並且放大100倍 var current = getStyle(element, i) * 100; //把目標值也放大100倍 var target = json[i] * 100; //移動的步數 var step = (target - current) / 10; //判斷是不是為0 step = step > 0 ? Math.ceil(step) : Math.floor(step); //移動後的位置 current += step; //移動元素屬性 element.style[i] = current / 100; //判斷屬性是不是zIndex } else if (i == 'zIndex') { //直接設置zIndex element.style[i] = json[i]; } else { //普通屬性獲取(轉化成數字) var current = parseInt(getStyle(element, i)); //目標屬性值 var target = json[i] //移動的步驟(漸變) var step = (target - current) / 10; //判斷移動的值取整 step = step > 0 ? Math.ceil(step) : Math.floor(step); //移動後的位置 current += step; //移動元素 element.style[i] = current + 'px'; } //只要有一個沒達到目標就設置F為false if (current != target) { f = false; } //目標到達 清理定時器 判斷有沒有回調函數 if (f) { clearInterval(element.timeid); if (fn) { fn(); } } } console.log("目標:" + target + ",當前:" + current + ",每次的移動步數:" + step); }, 20) }