国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

javascript勻速動畫和緩沖動畫詳解

2019-11-20 08:42:17
字體:
來源:轉載
供稿:網友

關于網頁中的動畫,在css3中我們已經可以使用一些屬性快速的做出來,但是有時候為了瀏覽器的兼容性我們還是需要使用js來制作網頁中的動畫。

使用js做動畫最重要的一個函數就是setInterval函數,這里不再贅述,不懂可以直接百度用法。本文主要講動畫的原理已經在制作過程中的要點。

老規矩,先上代碼,能直接看懂的可以節省時間。

html部分:

<!DOCTYPE html> <html lang="en"> <head>   <meta charset="UTF-8">   <title>move</title>   <link rel="stylesheet" href="move1.css"> </head> <body>   <input type="button" value="勻速移動" id="move1">   <input type="button" value="漸變移動" id="move2">   <div id="box1" class="box"></div>   <div id="box2" class="box"></div>   <script type="text/javascript" src="move1.js"></script> </body> </html> 

css部分:

*{   margin: 0px;   padding: 0px; } .box{   width: 100px;   height: 100px;   background-color: green;   position: relative;   margin-top: 10px; } 

js部分:

/**  * Created by siri on 2016/9/10.  */ window.onload=function () {   var btn1 = document.getElementById('move1');   var btn2 = document.getElementById('move2');   var box1 = document.getElementById('box1');   var box2 = document.getElementById('box2');   btn1.onclick = function () {     animate1(box1,500);   }   btn2.onclick = function () {     animate2(box2,500);   }   //勻速動畫   function animate1(ele,target){     //要用定時器,先清除定時器     //一個盒子只能有一個定時器,這樣兒的話,不會和其他盒子出現定時器沖突     //而定時器本身講成為盒子的一個屬性     clearInterval(ele.timer);     //我們要求盒子既能向前又能向后,那么我們的步長就得有正有負     //目標值如果大于當前值取正,目標值如果小于當前值取負     var speed = target>ele.offsetLeft?3:-3;     ele.timer = setInterval(function () {       //在執行之前就獲取當前值和目標值之差       var val = target - ele.offsetLeft;       ele.style.left = ele.offsetLeft + speed + "px";       //目標值和當前值只差如果小于步長,那么就不能再前進了       //因為步長有正有負,所有轉換成絕對值來比較       console.log(val);       if(Math.abs(val)<=Math.abs(speed)){         ele.style.left = target + "px";         clearInterval(ele.timer);        }     },30);   }    //緩動動畫封裝   function animate2(ele,target) {     clearInterval(ele.timer); //清楚歷史定時器     ele.timer = setInterval(function () {       //獲取步長 確定移動方向(正負值) 步長應該是越來越小的,緩動的算法。       var step = (target-ele.offsetLeft)/10;       //對步長進行二次加工(大于0向上取整,小于0項下取整)       step = step>0?Math.ceil(step):Math.floor(step);       //動畫原理: 目標位置 = 當前位置 + 步長       console.log(step);       ele.style.left = ele.offsetLeft + step + "px";       //檢測緩動動畫有沒有停止       if(Math.abs(target-ele.offsetLeft)<=Math.abs(step)){         ele.style.left = target + "px"; //直接移動指定位置         clearInterval(ele.timer);       }     },30);   }   } 

html和css基本就是為了我們的js部分搭框架,不講太多,要注意的是,一定要對全局的margin和padding清零,否則的話他在計算的時候初始的margin和padding會影響計算,從而導致有時候運動不停止的情況。

javascript部分代碼的解析在源碼中已經很詳細了,下面主要講解原理。

勻速運動:

通過setInterval函數我們控制每多少毫秒運動的距離,然后在快要到達指定位置的時候,判斷步長(每多少毫秒運動的距離)和此時和目標位置的距離,如果步長大于此時和目標位置的距離,則直接定位到目標位置,這樣做是為了避免步長和總距離不是整數倍關系而產生最后到達位置和目標位置有差值的錯誤。

緩沖運動:

緩沖運動的基本函數是和勻速運動一樣的,只是緩沖運動的步長我們是通過和目標位置的距離來確定的,這樣我們的步長是不斷變小的,從而實現緩沖運動的效果。在確定步長的時候我們使用Math.ceil和Math.floor對步長值進行取整是為了避免出現小數,因為如果出現小數后面最后到達的位置肯定是和目標位置有誤差的。

注意事項:在每次移動開始前一定要使用clearInterval清除定時器。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 厦门市| 新巴尔虎右旗| 安康市| 民县| 台东县| 台南县| 安泽县| 开江县| 离岛区| 朝阳市| 寿宁县| 河东区| 内丘县| 龙山县| 安康市| 马尔康县| 安西县| 罗源县| 三穗县| 明水县| 苗栗县| 漳平市| 黑水县| 瑞金市| 鄄城县| 襄城县| 遵义市| 奉化市| 垫江县| 甘德县| 军事| 阳新县| 桂林市| 安吉县| 视频| 沁水县| 水富县| 太谷县| 台中县| 会东县| 白银市|