JS實(shí)現(xiàn)勻速與減速緩慢運(yùn)動(dòng)的動(dòng)畫(huà)效果封裝示例
本文實(shí)例講述了JS實(shí)現(xiàn)勻速與減速緩慢運(yùn)動(dòng)的動(dòng)畫(huà)效果。分享給大家供大家參考,具體如下:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>www.dbjr.com.cn JS勻速/減速運(yùn)動(dòng)</title> <style> *{ margin: 0; padding: 0; } .box1 { width: 100px; height: 100px; background-color: pink; margin-top: 10px; position: relative; } .box2 { width: 100px; height: 100px; background-color: red; margin-top: 10px; position: relative; } </style> </head> <body> <button>勻速移動(dòng)</button> <button>減速移動(dòng)</button> <div class="box1" ></div> <div class="box2" ></div> <script> // 動(dòng)畫(huà)原理 = 盒子位置 + 步長(zhǎng)。 // 1.閃動(dòng)。 (瞬間到達(dá)) // 2.勻速。 (每次走一樣距離) // 3.緩動(dòng)。 (開(kāi)始特快越走越慢,步長(zhǎng)越來(lái)越?。? // (類(lèi)似剎車(chē),電梯停止,壓縮彈簧...) // 好處: // 1.有非常逼真的緩動(dòng)效果,實(shí)現(xiàn)的動(dòng)畫(huà)效果更細(xì)膩。 // 2.如果不清除定時(shí)器,物體永遠(yuǎn)跟著目標(biāo)在移動(dòng)。 var box1 = document.getElementsByClassName("box1")[0]; var box2 = document.getElementsByClassName("box2")[0]; var but1 = document.getElementsByTagName("button")[0]; var but2 = document.getElementsByTagName("button")[1]; console.log(box1.offsetLeft); but1.onclick = function () { animate1(box1,200); } but2.onclick = function () { animate2(box2,500); } //勻速動(dòng)畫(huà) function animate1(ele,target){ //要用定時(shí)器,先清除定時(shí)器 //一個(gè)盒子只能有一個(gè)定時(shí)器,這樣兒的話,不會(huì)和其他盒子出現(xiàn)定時(shí)器沖突 //而定時(shí)器本身講成為盒子的一個(gè)屬性 clearInterval(ele.timer); //我們要求盒子既能向前又能向后,那么我們的步長(zhǎng)就得有正有負(fù) //目標(biāo)值如果大于當(dāng)前值取正,目標(biāo)值如果小于當(dāng)前值取負(fù) var speed = target>ele.offsetLeft?3:-3; ele.timer = setInterval(function () { //在執(zhí)行之前就獲取當(dāng)前值和目標(biāo)值之差 var val = target - ele.offsetLeft; ele.style.left = ele.offsetLeft + speed + "px"; //目標(biāo)值和當(dāng)前值只差如果小于步長(zhǎng),那么就不能在前進(jìn)了 //因?yàn)椴介L(zhǎng)有正有負(fù),所有轉(zhuǎn)換成絕對(duì)值來(lái)比較 if(Math.abs(val)<=Math.abs(speed)){ ele.style.left = target + "px"; clearInterval(ele.timer); } },30) } //緩動(dòng)動(dòng)畫(huà)封裝 function animate2(ele,target) { clearInterval(ele.timer); //清楚歷史定時(shí)器 ele.timer = setInterval(function () { //獲取步長(zhǎng) 確定移動(dòng)方向(正負(fù)值) 步長(zhǎng)應(yīng)該是越來(lái)越小的,緩動(dòng)的算法。 var step = (target-ele.offsetLeft)/10; //對(duì)步長(zhǎng)進(jìn)行二次加工(大于0向上取整,小于0項(xiàng)下取整) step = step>0?Math.ceil(step):Math.floor(step); //動(dòng)畫(huà)原理: 目標(biāo)位置 = 當(dāng)前位置 + 步長(zhǎng) console.log(step); ele.style.left = ele.offsetLeft + step + "px"; //檢測(cè)緩動(dòng)動(dòng)畫(huà)有沒(méi)有停止 if(Math.abs(target-ele.offsetLeft)<=Math.abs(step)){ ele.style.left = target + "px"; //直接移動(dòng)指定位置 clearInterval(ele.timer); } },30); } </script> </body> </html>
這里使用在線HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun,可得到如下運(yùn)行效果:
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《JavaScript運(yùn)動(dòng)效果與技巧匯總》、《JavaScript切換特效與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》、《JavaScript動(dòng)畫(huà)特效與技巧匯總》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
javascript CSS畫(huà)圖之基礎(chǔ)篇
要在瀏覽器上動(dòng)態(tài)地畫(huà)圖(矢量圖),個(gè)人覺(jué)得矢量圖中最關(guān)鍵的兩點(diǎn).2009-07-07js string 轉(zhuǎn) int 注意的問(wèn)題小結(jié)
Javascript將string類(lèi)型轉(zhuǎn)換int類(lèi)型的過(guò)程中總會(huì)出現(xiàn)不如意的問(wèn)題,下面為大家介紹下js string轉(zhuǎn)int的一些注意的問(wèn)題,感興趣的朋友可以參考下2013-08-08javascript 三組文字間隙滾動(dòng)實(shí)例代碼
非常實(shí)用的文字間隙滾動(dòng)效果代碼2008-06-06JS刷新當(dāng)前頁(yè)面的幾種方法總結(jié)
本篇文章主要是對(duì)JS刷新當(dāng)前頁(yè)面的幾種方法進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12js核心基礎(chǔ)之構(gòu)造函數(shù)constructor用法實(shí)例分析
這篇文章主要介紹了js核心基礎(chǔ)之構(gòu)造函數(shù)constructor用法,結(jié)合具體實(shí)例形式分析了javascript構(gòu)造函數(shù)constructor概念、原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-05-05JavaScript中for...in、for...of和for await...of迭代方式
方法2023-04-04關(guān)于js中window.location.href,location.href,parent.location.href
關(guān)于js中window.location.href,location.href,parent.location.href,top.location.href的用法2010-10-10