JS實(shí)現(xiàn)動(dòng)畫中的布局轉(zhuǎn)換
在用JS編寫動(dòng)畫的時(shí)候,經(jīng)常用會(huì)到布局轉(zhuǎn)換,即在運(yùn)動(dòng)前將相對(duì)定位轉(zhuǎn)為絕對(duì)定位,然后執(zhí)行動(dòng)畫函數(shù)。下面給大家分享一個(gè)運(yùn)用原生JS實(shí)現(xiàn)的布局轉(zhuǎn)換的Demo,效果如下:

以下是代碼實(shí)現(xiàn),歡迎大家復(fù)制粘貼及吐槽。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>原生JS實(shí)現(xiàn)動(dòng)畫中的布局轉(zhuǎn)換</title>
<style>
* {
margin: 0;
padding: 0;
}
#ul1 {
width: 366px;
margin: 0 auto;
position: relative;
}
#ul1 li {
list-style: none;
width: 100px;
height: 100px;
background: #CCC;
border: 1px solid black;
float: left;
margin: 10px;
z-index: 1;
}
</style>
<!-- 運(yùn)動(dòng)框架 -->
<script>
// 獲取指定樣式的值
function getStyle(obj, attr) {
if (obj.currentStyle) {
return obj.currentStyle[attr];
} else {
return getComputedStyle(obj, false)[attr];
}
};
// 運(yùn)動(dòng)函數(shù)
function startMove(obj, json, fn) {
clearInterval(obj.timer);
obj.timer = setInterval(function () {
var bStop = true;
for (var attr in json) {
var iCur = 0;
if (attr == 'opacity') {
iCur = parseInt(parseFloat(getStyle(obj, attr)) * 100);
} else {
iCur = parseInt(getStyle(obj, attr));
}
var iSpeed = (json[attr] - iCur) / 8;
iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);
if (iCur != json[attr]) {
bStop = false;
}
if (attr == 'opacity') {
obj.style.filter = 'alpha(opacity:' + (iCur + iSpeed) + ')';
obj.style.opacity = (iCur + iSpeed) / 100;
} else {
obj.style[attr] = iCur + iSpeed + 'px';
}
}
if (bStop) {
clearInterval(obj.timer);
if (fn) {
fn();
}
}
}, 30)
}
</script>
<!-- 添加事件 -->
<script>
window.onload = function () {
var oUl = document.getElementById('ul1');
var aLi = oUl.getElementsByTagName('li');
var iMinZindex = 2;
var i = 0;
// 1.布局轉(zhuǎn)換
for (i = 0; i < aLi.length; i++) {
//aLi[i].innerHTML='left:'+aLi[i].offsetLeft+', top:'+aLi[i].offsetTop;
aLi[i].style.left = aLi[i].offsetLeft + 'px';
aLi[i].style.top = aLi[i].offsetTop + 'px';
}
// 必需要用兩個(gè)循環(huán)
for (i = 0; i < aLi.length; i++) {
aLi[i].style.position = 'absolute';
//第一次循環(huán)中offset值已經(jīng)計(jì)算了原有的margin值,所以此處要清除
aLi[i].style.margin = '0';
}
// 2.加事件
for (i = 0; i < aLi.length; i++) {
aLi[i].onmouseover = function () {
//讓當(dāng)前zIndex不斷的增加,防止堆疊
this.style.zIndex = iMinZindex++;
startMove(this, {
width: 200,
height: 200,
marginLeft: -50,
marginTop: -50
});
};
aLi[i].onmouseout = function () {
startMove(this, {
width: 100,
height: 100,
marginLeft: 0,
marginTop: 0
});
};
}
};
</script>
</head>
<body>
<ul id="ul1">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
</body>
</html>
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
javascript實(shí)現(xiàn)下班倒計(jì)時(shí)效果的方法(可桌面通知)
這篇文章主要介紹了javascript實(shí)現(xiàn)下班倒計(jì)時(shí)效果的方法,涉及javascript倒計(jì)時(shí)效果及桌面提示效果的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值2015-07-07
基于javascript實(shí)現(xiàn)全屏漂浮廣告
這篇文章主要介紹了基于javascript實(shí)現(xiàn)全屏漂浮廣告,光標(biāo)懸浮廣告停止移動(dòng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-03-03
javascript 節(jié)點(diǎn)排序?qū)崿F(xiàn)代碼
為了讓自定義選擇選擇出的節(jié)點(diǎn)集合盡可能接近原生API選出的結(jié)果,我們往往要對(duì)結(jié)果集進(jìn)行排序,此順序當(dāng)然是從上到下,從左到右的DOM樹順序。2011-01-01

