<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
*{
margin:0;
padding:0;
}
.box{
position:absolute;
top:100px;
left:0;
width:100px;
height:100px;
background-color:green;
}
input{
height: 50px;
}
</style>
</head>
<body>
<br>
<input type="button" value="开始将下面的元素向右移动" id="start">
<input type="button" value="点击停止元素的移动" id="ttt">
<div class="box" id="box">
</div>
<script>
var start = document.getElementById("start");
var box = document.getElementById("box");
//补充 获取计算后样式的方法
console.dir(window.getComputedStyle(box).width);
console.dir(window.getComputedStyle(box).height);
console.dir(window.getComputedStyle(box).backgroundColor);
console.dir(window.getComputedStyle(box)["opacity"]);
//box 是需要运动的元素
//多属性运动
//共同点:总时间,时间间隔是相同的,自定义
//不同的:起始位置(通过程序方法自动获取当前页面最终显示效果)和结束位置(自定义指定的)
//函数参数
//参数1:元素对象,它要进行运动
//参数2:结束位置,以对象数据方式传递
//参数3:总时间
//调用函数
animate(box,{left: 400,width: 300,height: 200,opacity: 1},2000);
//自定义动画函数
function animate(ele,end,time){
//已知结束位置,总时间,时间间隔 50,缺少起始位置
//起始位置要根据结束位置提供的属性进行获取
//起始位置的对象,需要先定义一个空对象
var now = {};
//var start = {};
//start.left = 100;
//end 对象遍历,获取属性名
for(var k in end){
now[k] = parseFloat(window.getComputedStyle(ele)[k]);
}
//console.log(start);
//自定义时间间隔
var interval = 50;
//计算总次数
var maxCount = time / interval;
//次数累加器
var count = 0;
//对象中的每个属性都有自己的步长,也可以放到一个步长对象中
var step = {};
//遍历结束对象,计算每个属性的步长
for(var k in end){
step[k] = (end[k] - now[k]) / maxCount;
}
//console.log(step);
//==========================准备工作结束,开启定时器=======================================
var timer;
timer = setInterval(function(){
//让每个属性发生变化,赋值给now对象中的一项
for (var k in end){
now[k] += step[k];
};
//累计运动次数
count++;
//判断定时器是否结束
if(count >= maxCount){
//拉终停表
for(var k in end){
now[k] = end[k];
};
clearInterval(timer);
};
//赋值给对应元素对象属性
for (var k in now){
//判断如果是 不透明度属性,不要加px属性
if(k === "opacity"){
ele.style[k] = now[k];
}else{
ele.style[k] = now[k] + "px";
}
}
},interval);
};
</script>
</body>
</html>