JavaScript運動框架 鏈?zhǔn)竭\動到完美運動(五)
基于前幾篇的運動框架基礎(chǔ),本文主要講解一下鏈?zhǔn)竭\動,就是運動完后接著再運動,比如很多網(wǎng)站中,一個方框的出現(xiàn)和退出:出現(xiàn)時先變寬再變高,退出時先變矮再變窄退出!
之前的模型是:
startMove(obj, json);
現(xiàn)在改為:
startMove(obj, json, fn);
也就是在第一次運動結(jié)束的時候執(zhí)行fn(); fn是傳過來的一個參數(shù),這個參數(shù)是個函數(shù),定時器清理之后手動運行fn();如果想采用鏈?zhǔn)竭\動,那就是在fn中再調(diào)用startMove(obj, json, fn),再在里面的fn中調(diào)用startMove(obj, json, fn),可以一直玩下去
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>運動框架(五):鏈?zhǔn)竭\動到完美運動</title>
<style type="text/css">
div {
width: 100px;
height: 100px;
background: orange;
margin: 10px;
float: left;
}
</style>
</head>
<body>
<div id="div1"></div>
<script type="text/javascript">
var oDiv = document.getElementById('div1');
oDiv.onmouseover = function() {
startMove(oDiv, {width:300,opacity:30}, function() {
startMove(oDiv, {height:500});
});
};
oDiv.onmouseout = function() {
startMove(oDiv, {height:100}, function() {
startMove(oDiv, {width:100,opacity:100});
})
};
function getStyle(obj, attr) {
if (obj.currentStyle) {
return obj.currentStyle[attr];
} else {
return getComputedStyle(obj, null)[attr];
}
}
function startMove(obj, json, fn) {
clearInterval(obj.timer);
obj.timer = setInterval(function() {
var bStop = true;
for (var attr in json) {
var cur = 0;
if (attr === 'opacity') {
cur = Math.round(parseFloat(getStyle(obj, attr)) * 100);
} else {
cur = parseInt(getStyle(obj, attr));
}
if (cur != json[attr]) {
bStop = false;
}
var speed = (json[attr] - cur)/10;
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
cur += speed;
if (attr === 'opacity') {
obj.style.filter = 'alpha(opacity:' + cur + ')';
obj.style.opacity = cur/100;
} else {
obj.style[attr] = cur + 'px';
}
}
if (bStop) {
clearInterval(obj.timer);
if (fn) fn();
}
}, 30);
}
</script>
</body>
</html>
最后提取出來的完美運動框架如下,motionFrame.js:
function getStyle(obj, attr) {
if (obj.currentStyle) {
return obj.currentStyle[attr];
} else {
return getComputedStyle(obj, null)[attr];
}
}
function startMove(obj, json, fn) {
clearInterval(obj.timer);
obj.timer = setInterval(function() {
var bStop = true;
for (var attr in json) {
var cur = 0;
if (attr === 'opacity') {
cur = Math.round(parseFloat(getStyle(obj, attr)) * 100);
} else {
cur = parseInt(getStyle(obj, attr));
}
if (cur != json[attr]) {
bStop = false;
}
var speed = (json[attr] - cur)/10;
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
cur += speed;
if (attr === 'opacity') {
obj.style.filter = 'alpha(opacity:' + cur + ')';
obj.style.opacity = cur/100;
} else {
obj.style[attr] = cur + 'px';
}
}
if (bStop) {
clearInterval(obj.timer);
if (fn) fn();
}
}, 30);
}以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- JS多物體 任意值 鏈?zhǔn)?緩沖運動
- Js實現(xiàn)簡單的小球運動特效
- js運動動畫的八個知識點
- javascript實現(xiàn)10個球隨機(jī)運動、碰撞實例詳解
- JS實現(xiàn)勻速運動的代碼實例
- 使用JavaScript 實現(xiàn)對象 勻速/變速運動的方法
- js實現(xiàn)緩沖運動效果的方法
- JavaScript中的勻速運動和變速(緩沖)運動詳細(xì)介紹
- Javascript實現(xiàn)重力彈跳拖拽運動效果示例
- javascript動畫之圓形運動,環(huán)繞鼠標(biāo)運動作小球
- Javascript模擬加速運動與減速運動代碼分享
- JS運動特效之鏈?zhǔn)竭\動分析
相關(guān)文章
npm?install報錯Error:EPERM:operation?not?permitted,rename解決
這篇文章主要給大家介紹了關(guān)于npm?install報錯Error:EPERM:operation?not?permitted,rename的解決辦法,文中介紹了可能遇到的多種原因以及解決辦法,需要的朋友可以參考下2024-01-01
Javascript面試經(jīng)典套路reduce函數(shù)查重
reduce函數(shù),是ECMAScript5規(guī)范中出現(xiàn)的數(shù)組方法.下面通過本文給大家分享Javascript面試經(jīng)典套路reduce函數(shù)查重,需要的朋友參考下吧2017-03-03
創(chuàng)建echart多個聯(lián)動的示例代碼
這篇文章主要介紹了創(chuàng)建echart多個聯(lián)動的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11

