JS实现动画中的布局转换
作者:aiguangyuan 时间:2023-10-14 15:58:04
在用JS编写动画的时候,经常用会到布局转换,即在运动前将相对定位转为绝对定位,然后执行动画函数。下面给大家分享一个运用原生JS实现的布局转换的Demo,效果如下:
以下是代码实现,欢迎大家复制粘贴及吐槽。
<!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