JavaScript 詳解緩動動畫的封裝與使用
實現(xiàn)過程分析
(1)如何重復調(diào)用?
答:封裝一個函數(shù),用一次調(diào)用一次
代碼分析:
function animate(obj, target, callback) { //詳細實現(xiàn)步驟 };
animate :(動畫函數(shù))
obj(動畫對象):給誰添加動畫效果
target(目標值):移動到什么距離
callback(回調(diào)函數(shù)):同時要執(zhí)行什么功能
(2)如何實現(xiàn)緩動效果?(緩動動畫核心算法)
答:移動距離 =(目標值 - 現(xiàn)在盒子位置)/ 10,移動距離會慢慢變小,直至停下,就實現(xiàn)了緩動原理
代碼分析:
var step = (target - obj.offsetLeft) / 10;
step(移動距離): 元素要移動的距離
target(目標值):移動到什么距離
obj.offsetLeft(盒子現(xiàn)在的位置):盒子現(xiàn)在距離左側(cè)的距離
(3)為什么移動不到指定位置?(給的目標距離是500px,移動到496.4就停下了)
答:因為需要取整,正數(shù)往上取整,負數(shù)向下取整

代碼分析:
step = step > 0 ? Math.ceil(step) : Math.floor(step);
如果setp要移動的距離是正數(shù),就向上取整,如果是負數(shù),就向下取整,采取三元表達式以優(yōu)化代碼,提升整體質(zhì)量
(4)如何讓目標元素真正移動起來?
答:添加定時器,并將實時移動距離(步長)賦值給元素
代碼分析:
var timer = setInterval(function () { //詳細實現(xiàn)代碼 }, 15); //添加定時器
obj.style.left = obj.offsetLeft + step + 'px'; //步長
1.給定時器添加名字是為了好清除定時器,時間設置為15(實際開發(fā)常用15)
2.元素的左側(cè)的值 = 元素離左側(cè)的距離 + 移動距離 + 'px' (記得一定要加px單位),實現(xiàn)原理就是不斷將最新的值賦值給元素,實現(xiàn)動起來的效果
(5)為什么會鬼畜或者越點越快?
答:因為定時器重復添加,需要每次調(diào)用時清除定時器
代碼分析:
clearInterval(timer);
兩個地方需要清除,第一是剛調(diào)用緩動動畫函數(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>
.sliderbar {
/* width: 240px; */
/* height: 40px; */
/* 父盒子定位根據(jù)實際要求來 */
position: absolute;
right: 0;
top: 100px;
text-align: center;
line-height: 40px;
/* display: block; */
width: 40px;
height: 40px;
cursor: pointer;
}
.sp {
position: relative;
color: #fff;
}
.con {
/* 設置了絕對定位就在父盒子里飄起來 */
position: absolute;
left: 0;
top: 0;
width: 200px;
height: 40px;
background-color: pink;
z-index: -1;
color: #fff;
}
</style>
<script src="./animate.js"></script>
</head>
<body>
<div class="sliderbar">
<span class="sp">←</span>
<div class="con">問題反饋</div>
</div>
<script>
var sliderbar = document.querySelector('.sliderbar');
// var sp = document.querySelector('.sp');
var con = document.querySelector('.con');
sliderbar.addEventListener('mouseenter', function() {
//animate(obj, target, callback);
animate(con, -160, function() {
sliderbar.children[0].innerHTML = '→';
});
})
sliderbar.addEventListener('mouseleave', function() {
//animate(obj, target, callback);
animate(con, 0, function() {
sliderbar.children[0].innerHTML = '←';
});
})
</script>
</body>
</html>
整體思路:通過給盒子添加鼠標事件來調(diào)用動畫函數(shù),最終實現(xiàn)效果
運行效果:


緩動動畫函數(shù)最終封裝代碼(animate.js):
function animate(obj, target, callback) {
//調(diào)用函數(shù)就清除一次定時器,避免問題發(fā)生
clearInterval(obj.timer)
//添加定時器
obj.timer = setInterval(function () {
//步長值寫到計時器里面 改為整數(shù)(往上取整)
var step = (target - obj.offsetLeft) / 10;
//整數(shù)往大了取,負數(shù)往小了取
step = step > 0 ? Math.ceil(step) : Math.floor(step);
if (obj.offsetLeft == target) {
//如果已經(jīng)到達指定位置就停止定時器
clearInterval(obj.timer);
//回調(diào)函數(shù)寫到定時器結(jié)束之后
callback && callback();
}
//把每次加一步長值改變?yōu)槁冃〉闹?/p>
obj.style.left = obj.offsetLeft + step + 'px';
}, 15);
}
生命不息,學習不止,鍵盤敲爛,月薪過萬 !加油,代碼人
到此這篇關于JavaScript 詳解緩動動畫的封裝與使用的文章就介紹到這了,更多相關JavaScript 緩動動畫 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JavaScript中各種引用類型的常用操作方法小結(jié)
這篇文章主要介紹了JavaScript中各種引用類型的常用操作方法小結(jié),基本上都用實際代碼進行展示,是整理得比較全面的學習筆記,需要的朋友可以參考下2016-05-05
JavaScript 創(chuàng)建運動框架的實現(xiàn)代碼
本篇文章是對,在JavaScript中創(chuàng)建運動框架的實現(xiàn)方法進行了介紹。需要的朋友參考下2013-05-05
深入理解JavaScript系列(33):設計模式之策略模式詳解
這篇文章主要介紹了深入理解JavaScript系列(33):設計模式之策略模式詳解,策略模式定義了算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化不會影響到使用算法的客戶,需要的朋友可以參考下2015-03-03

