JS实现动画中的布局转换

作者:aiguangyuan 时间:2023-10-14 15:58:04 

在用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 li {
           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) {
           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));
                   }
                   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.布局转换
           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';
           }

// 必需要用两个循环
           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>

来源:https://blog.csdn.net/weixin_40629244/article/details/99684678

标签:js,布局转换
0
投稿

猜你喜欢

  • Go处理json数据方法详解(Marshal,UnMarshal)

    2024-02-06 11:47:24
  • PHP抓取及分析网页的方法详解

    2023-11-24 08:17:10
  • jsp中select的onchange事件用法实例

    2024-04-19 09:58:23
  • 数据库高并发情况下重复值写入的避免 字段组合约束

    2024-01-21 00:13:31
  • Python实现设置windows桌面壁纸代码分享

    2022-03-23 03:52:46
  • ES6入门教程之let和const命令详解

    2024-05-22 10:37:07
  • 使用curl命令行模拟登录WordPress的方法

    2022-02-23 17:15:06
  • Python简单遍历字典及删除元素的方法

    2021-12-31 08:57:51
  • Dreamweaver制作技巧四则

    2008-01-04 09:42:00
  • python实现猜单词游戏

    2023-01-22 22:32:43
  • 在 Pycharm 安装使用black的方法详解

    2023-11-29 12:44:59
  • Python实现绘制多角星实例

    2023-08-26 13:42:14
  • MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解

    2024-01-17 17:53:34
  • Python return语句如何实现结果返回调用

    2021-06-06 21:13:51
  • Python使用pyautocad+openpyxl处理cad文件示例

    2022-05-24 11:44:18
  • Perl5和Perl6对比使用Sigils的差别

    2022-03-04 16:34:17
  • mysql性能优化之索引优化

    2024-01-15 13:51:44
  • Git常用场景使用之分支操作

    2022-01-06 02:10:56
  • PHP webshell检查工具 python实现代码

    2024-05-03 15:06:00
  • css布局查看器

    2008-10-29 11:22:00
  • asp之家 网络编程 m.aspxhome.com