JS實(shí)現(xiàn)勻速與減速緩慢運(yùn)動(dòng)的動(dòng)畫效果封裝示例
本文實(shí)例講述了JS實(shí)現(xiàn)勻速與減速緩慢運(yùn)動(dòng)的動(dòng)畫效果。分享給大家供大家參考,具體如下:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>m.fzitv.net 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)畫原理 = 盒子位置 + 步長。
// 1.閃動(dòng)。 (瞬間到達(dá))
// 2.勻速。 (每次走一樣距離)
// 3.緩動(dòng)。 (開始特快越走越慢,步長越來越?。?
// (類似剎車,電梯停止,壓縮彈簧...)
// 好處:
// 1.有非常逼真的緩動(dòng)效果,實(shí)現(xiàn)的動(dòng)畫效果更細(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)畫
function animate1(ele,target){
//要用定時(shí)器,先清除定時(shí)器
//一個(gè)盒子只能有一個(gè)定時(shí)器,這樣兒的話,不會(huì)和其他盒子出現(xiàn)定時(shí)器沖突
//而定時(shí)器本身講成為盒子的一個(gè)屬性
clearInterval(ele.timer);
//我們要求盒子既能向前又能向后,那么我們的步長就得有正有負(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)前值只差如果小于步長,那么就不能在前進(jìn)了
//因?yàn)椴介L有正有負(fù),所有轉(zhuǎn)換成絕對(duì)值來比較
if(Math.abs(val)<=Math.abs(speed)){
ele.style.left = target + "px";
clearInterval(ele.timer);
}
},30)
}
//緩動(dòng)動(dòng)畫封裝
function animate2(ele,target) {
clearInterval(ele.timer); //清楚歷史定時(shí)器
ele.timer = setInterval(function () {
//獲取步長 確定移動(dòng)方向(正負(fù)值) 步長應(yīng)該是越來越小的,緩動(dòng)的算法。
var step = (target-ele.offsetLeft)/10;
//對(duì)步長進(jìn)行二次加工(大于0向上取整,小于0項(xiàng)下取整)
step = step>0?Math.ceil(step):Math.floor(step);
//動(dòng)畫原理: 目標(biāo)位置 = 當(dāng)前位置 + 步長
console.log(step);
ele.style.left = ele.offsetLeft + step + "px";
//檢測緩動(dòng)動(dòng)畫有沒有停止
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)容感興趣的讀者可查看本站專題:《JavaScript運(yùn)動(dòng)效果與技巧匯總》、《JavaScript切換特效與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》、《JavaScript動(dòng)畫特效與技巧匯總》、《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)文章
使用有限狀態(tài)機(jī)實(shí)現(xiàn)簡版的html解析器
FSM(Finite State Machines) 有限狀態(tài)機(jī),也叫有限狀態(tài)自動(dòng)機(jī),是為研究有限內(nèi)存的計(jì)算過程和某些語言類而抽象出的一種計(jì)算模型,本文將使用有限狀態(tài)機(jī)實(shí)現(xiàn)一個(gè)簡版的html解析器,有需要的小伙伴可以參考下2023-11-11
JS實(shí)現(xiàn)瀏覽器打印、打印預(yù)覽示例
本篇文章主要介紹了JS實(shí)現(xiàn)瀏覽器打印、打印預(yù)覽示例。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02
關(guān)于arguments,callee,caller等的測試
關(guān)于arguments,callee,caller等的測試...2006-12-12
JavaScript箭頭函數(shù)與普通函數(shù)的區(qū)別示例詳解
這篇文章主要為大家介紹了JavaScript箭頭函數(shù)與普通函數(shù)的區(qū)別示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Javascript實(shí)現(xiàn)簡單二級(jí)下拉菜單實(shí)例
這篇文章主要介紹Javascript實(shí)現(xiàn)二級(jí)下拉菜單的具體過程,需要的朋友可以參考下2014-06-06
在JavaScript中查找字符串中最長單詞的三種方法(推薦)
這篇文章主要介紹了在JavaScript中查找字符串中最長單詞的三種方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
javaScript中定義類或?qū)ο蟮奈宸N方式總結(jié)
下面小編就為大家?guī)硪黄猨avaScript中定義類或?qū)ο蟮奈宸N方式總結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12

