1. 程式人生 > 程式設計 >JS實現動畫中的佈局轉換

JS實現動畫中的佈局轉換

在用編寫動畫的時候,經常用會到佈局轉換,即在運動前將相對定位轉為絕對定位,然後執行動畫函式。下面給大家分享一個運用原生JS實現的佈局轉換的Demo,效果如下:

JS實現動畫中的佈局轉換

以下是程式碼實現,歡迎大家複製貼上及吐槽。

<!DOCTYPE html>
<html>
 
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>原生JS實現動畫中的佈局轉換</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
 
        #ul1 {
            width: 366px;
            margin: 0 auto;
            position: relative;
        }
 
        #ul1 liwww.cppcns.com
{ list-style: none; width: 100px; height: 100px; background: #CCC; border: 1px solid black; float: left; margin: 10px; z-index: 1; } </style> <!-- 運動框架 --> <script> // 獲取指定樣式的值 function getStyle(obj,attr) { http://www.cppcns.com
if (obj.currentStyle) { return obj.currentStyle[attr]; } else { return getComputedStyle(obj,false)[attr]; } }; // 運動函式 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)); } http://www.cppcns.com
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; //www.cppcns.com 1.佈局轉換 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'; www.cppcns.com aLi[i].style.top = aLi[i].offsetTop + 'px'; } // 必需要用兩個迴圈 for (i = 0; i < aLi.length; i++) { aLi[i].style.position = 'absolute'; //第一次迴圈中offset值已經計算了原有的margin值,所以此處要清除 aLi[i].style.margin = '0'; } // 2.加事件 for (i = 0; i < aLi.length; i++) { aLi[i].onmouseover = function () { //讓當前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>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。