js原生实现链式动画效果
2024-08-28 13:49:55
// 1. css样式 div {
width: 100px;
height: 100px;
background: olivedrab;
position: absolute;
left: 0px;
opacity: 1;
} .top {
top: 100px;
} .bottom {
top: 300px;
}
// html和JavaScript代码 <div class="top"></div>
<div class="bottom" style="background-color: coral;"></div> <script>
// 多物体多值链式运动框架 // 获取对象样式相对应属性的值
var targetObj = {
width: 400,
height: 400,
opacity: 50,
left: 300,
top: 200
}
// 获取对应的HTML元素
oDivArray = document.getElementsByTagName('div');
// 调用函数
oDivArray[0].onclick = function() {
startMove(this, targetObj, function() {
startMove(oDivArray[1], targetObj);
});
}
// 获取元素样式对应的属性值
function getStyle(obj, attr) {
if (obj.currentStyle) {
return obj.currentStyle[attr];
} else {
return window.getComputedStyle(obj, false)[attr];
}
} // 封装动画函数
function startMove(obj, json, callback) {
// 清除目标对象的定时器,而非全局
clearInterval(obj, timer);
// iSpeed:动画速度,iCur:当前样式属性的值,timer:定时器对象
var iSpeed, iCur, timer;
obj.timer = setInterval(function() {
var bStop = true; // 标志位,上一个对象的动画是否完成
for (var attr in json) {
if (attr === 'opacity') { // 如果获取的是opacity,则乘100倍,否则正常获取值
iCur = parseFloat(getStyle(obj, attr)) * 100;
} else {
iCur = parseInt(getStyle(obj, attr));
}
iSpeed = (json[attr] - iCur) / 7;
iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed); //设置动画速度
if (attr == 'opacity') {
obj.style.opacity = (iCur + iSpeed) / 100; // 乘100的值还原回去
} else {
obj.style[attr] = iCur + iSpeed + 'px';
}
if (iCur != json[attr]) { // 如果当前属性的值不等于用户穿进来的对象里的属性对应的值,则继续执行动画
bStop = false;
} else { // 达到期待的目标,设置标志位为真,即可以停止
bStop = true;
}
}
if (bStop) {
clearInterval(obj.timer); //如果标志位为真,则达到用户期待的动画效果
typeof callback == 'function' ? callback() : '';// 判断用户是否有传入回调函数,有则执行,无则结束。链式动画执行框架
}
}, 30)
}
</script>
end
最新文章
- http2协议翻译(转)
- kafka设计原理介绍
- Android Content Provider基础
- ubuntu安装skype
- IOS- 02 零碎知识总结
- php使用p3p实现cookies跨域设置 实现单点登录,全站登录
- 【kd-tree】bzoj2648 SJY摆棋子
- MySQL Show命令的使用
- Xshell远程连接Linux时无法使用小键盘的解决方式
- 62. Unique Paths
- 如何在Android应用中加入广告
- BZOJ 1090: [SCOI2003]字符串折叠 区间DP
- 关于使用Element.getNodeValue()返回NULL的问题
- How to execute tons of tasks parallelly with TPL method?
- Hadoop学习笔记1:伪分布式环境搭建
- dubbo知识体系
- Day3:html和css
- RTP/RTCP 和 SRTP/SRTCP协议(转)
- 2019.01.26 codeforces 632E. Thief in a Shop(生成函数)
- Linux - ssh 连接慢解决
热门文章
- Head First设计模式——命令模式
- shell中tar加密打包
- Mirantis 收购 Docker | 云原生生态周报 Vol. 28
- python:模块0
- Oracle数据库 获取CLOB字段存储的xml格式字符串指定节点的值
- [FPGA]Verilog实现可自定义的倒计时器(24秒为例)
- 2019-9-26:渗透测试,基础学习,js正则以及什么是目录扫描,笔记
- 【Luogu P2563】【集训Day 4 动态规划】质数和分解
- Java并发之synchronized关键字和Lock接口
- phpstorm2019激活码