JavaScript運(yùn)動(dòng)函數(shù)實(shí)例詳解
運(yùn)動(dòng)函數(shù)是我們自己封裝的一個(gè)函數(shù)。
作用是將css樣式的改變不是一次性完成 是 逐步完成 執(zhí)行效果 看上去 像是 動(dòng)畫/運(yùn)動(dòng) 完成的css樣式改變。
實(shí)際項(xiàng)目中框架等都有自己的運(yùn)動(dòng)函數(shù)我們目前封裝一個(gè)簡(jiǎn)單的兼容多屬性的運(yùn)動(dòng)函數(shù)。
運(yùn)動(dòng)函數(shù)部分:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
div {
width: 100px;
height: 100px;
background: rgb(231, 12, 48);
margin: 0 auto;
opacity: 0.3;
/* transition: 3s; */
}
p {
width: 100px;
height: 100px;
background: black;
position: fixed;
top: 200px;
left: 50px;
}
</style>
</head>
<body>
<button>點(diǎn)擊</button>
<div></div>
<script>
var oDiv = document.querySelector('div');
var oBtn = document.querySelector('button');
var oP = document.querySelector('p')
oBtn.addEventListener('click',function(){
move(oDiv,{width:1800,height:900,opacity:1} , function(){ oDiv.style.background = 'black' } );
})
// 運(yùn)動(dòng)函數(shù)命名
// move 運(yùn)動(dòng)函數(shù)
// @param object element 要執(zhí)行運(yùn)動(dòng)函數(shù)的標(biāo)簽對(duì)象
// @param object object 要執(zhí)行運(yùn)動(dòng)的css屬性 和 最終數(shù)值
// @param function callback 運(yùn)動(dòng)結(jié)束執(zhí)行的回調(diào)函數(shù)
// 默認(rèn)值是空函數(shù)
function move(element, object, callback = function () { }) {
// 定義變量存儲(chǔ)定時(shí)器個(gè)數(shù)
let num = 0;
// 循環(huán)遍歷參數(shù)二(object)
// 使用 for...in 循環(huán) 使用 let 定義變量
for (let type in object){
// type 是 參數(shù)2對(duì)象的屬性 也就是 要運(yùn)動(dòng)的css樣式的屬性
// object[type] 是 參數(shù)2對(duì)象的屬性值 也就是 要運(yùn)動(dòng)的css樣式的 最終數(shù)值
// 定時(shí)器數(shù)量加一
num++;
// 開始數(shù)值,也就是獲取的原始數(shù)值,兼容透明度寫法
let startVal = (type === 'opacity') ? window.getComputedStyle(element)[type] * 100 : parseInt(window.getComputedStyle(element)[type]);
// 結(jié)束數(shù)值,也就是輸入的屬性對(duì)應(yīng)的屬性值,兼容透明度寫法
let endVal = (type === 'opacity') ? object[type] * 100 : object[type];
// 定時(shí)器開始,time記錄定時(shí)器編號(hào)
let time = setInterval( function () {
// 設(shè)定步長(zhǎng)值= 結(jié)束數(shù)值 - 開始數(shù)值 / 10
let step = (endVal - startVal) / 10;
// 如果步長(zhǎng)值大于0 就向上取整,反之則向下取整
step = step > 0 ? Math.ceil(step) : Math.floor(step);
// 將初始值 += 步長(zhǎng)值 再把新值賦值給初始值
startVal += step;
// 將新的步長(zhǎng)值 賦值給 標(biāo)簽對(duì)象的css樣式 兼容 透明度
element.style[type] = (type === 'opacity') ? startVal / 100 : startVal + 'px';
// 如果初始值等于最終值
if (startVal === endVal) {
// 清除定時(shí)器
clearInterval(time);
// 變量 累減1 也就是 少了一個(gè)執(zhí)行的定時(shí)器
// num--;
// 當(dāng)執(zhí)行的定時(shí)器為0 時(shí),所有定時(shí)器都清除了
if (num === 0) {
callback();
}
}
}, 20)
}
}
</script>
</body>
</html>運(yùn)行結(jié)果:

總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
原生JS控制多個(gè)滾動(dòng)條同步跟隨滾動(dòng)效果
本文要探討的是,當(dāng)這兩個(gè)容器元素的內(nèi)容都超出了容器高度,即都出現(xiàn)了滾動(dòng)框的時(shí)候,如何在其中一個(gè)容器元素滾動(dòng)時(shí),讓另外一個(gè)元素也隨之滾動(dòng)2017-12-12
JS格式化數(shù)字金額用逗號(hào)隔開保留兩位小數(shù)
JS格式化數(shù)字金額只留兩位小數(shù)。寫了個(gè)格式化函數(shù)??梢钥刂菩?shù)位數(shù),自動(dòng)四舍五入,感興趣的朋友可以了解下2013-10-10
一個(gè)JavaScript函數(shù)把URL參數(shù)解析成Json對(duì)象
一個(gè)JavaScript函數(shù)parseQueryString,它的用途是把URL參數(shù)解析為一個(gè)對(duì)象,很實(shí)用,大家可以看看2014-09-09
微信小程序結(jié)合Storage實(shí)現(xiàn)搜索歷史效果
這篇文章主要為大家詳細(xì)介紹了微信小程序結(jié)合Storage實(shí)現(xiàn)搜索歷史效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
javascript 緩沖運(yùn)動(dòng)框架的實(shí)現(xiàn)
這篇文章主要介紹了javascript 緩沖運(yùn)動(dòng)框架的實(shí)現(xiàn)的相關(guān)資料,希望通過(guò)本能幫助到大家,實(shí)現(xiàn)這樣類似的功能,需要的朋友可以參考下2017-09-09
javascript實(shí)現(xiàn)二分查找法實(shí)現(xiàn)代碼
javascript實(shí)現(xiàn)二分查找法實(shí)現(xiàn)代碼...2007-11-11
如何將一個(gè)String和多個(gè)String值進(jìn)行比較思路分析
開發(fā)中我們經(jīng)常需要將一個(gè)String和多個(gè)String值進(jìn)行比較。直覺反應(yīng)是使用||符號(hào)連接多個(gè)===完成,感興趣的朋友可以了解下哈2013-04-04

