html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
list-style: none;
}
div{
width: 100px;
height: 100px;
background-color: skyblue;
position: absolute;
top: 0;
left: 0;
}
</style>
</head>
<body>
<div></div>
</body>
</html>
JS代码
// 获取标签
var box = document.querySelector('div')
// 点击事件
box.onclick = function() {
// 调用运动函数
move(this, {left:500, top:500, opacity:0.2},() => {
this.style.backgroundColor = 'tomato'
})
}
// 创建运动函数
function move(ele,obj,cb) {
// 将传入的透明度值*100进行运算
obj.opacity *= 100
// 定义空对象存放每个属性的定时器
var times = {}
// 遍历对象创建定时器
for(let key in obj) {
// 给times对象中添加定时器
times[key] = setInterval(() => {
// 获取起始值,判断key值是否opacity,将获取到的偏移量取整,去除px
var start = key=='opacity' ? getCss(ele,key)*100 : parseInt(getCss(ele,key))
// 设置步长
var speed = (obj[key]-start)/10
speed = speed>0 ? Math.ceil(speed) : Math.floor(speed)
// 判断剩余运动量是否小于步长
if(Math.abs(obj[key]-start)<=Math.abs(speed)) {
// 运动结束后停止定时器
clearInterval(times[key])
// 剩余运动量小于步长直接赋结束值
key=='opacity' ? ele.style[key]=obj[key]/100 : ele.style[key]=obj[key]+'px'
// 运动完成后删除times中的这个键值对
delete times[key]
// 判断这个函数的返回值为0
if(!over(times)) {
// 判断cb中是否有内容,防止不传参报错
cb ? cb() : ''
}
}else {
// 大于则开始值+步长进行运动
key=='opacity' ? ele.style[key]=(start+speed)/100 : ele.style[key]=start+speed+'px'
}
}, 30);
}
}
// 获取样式属性函数
function getCss(ele,key) {
// 需要获取的值是一个变量时候使用[]
return getComputedStyle(ele)[key]
}
// 统计times对象中的键值对
function over(time) {
var num=0
for(var key in time) {
num++
}
return num
}