一:(仅可向右移动)
1.HTML
<button id="btn">点击按钮以后box1向右移动</button>
<br/><br/>
<div id="box"></div>
<div style="width: 0px;height: 1000px;position: absolute;left:800px;border-left: 1px black solid;top: 0;"> </div>
2.CSS
*{
margin: 0;
padding: 0;
}
#box{
height: 100px;
width: 100px;
position: absolute;
background-color: red;
left: 0;
}
3.JS
window.onload=function(){
var btn=document.getElementById("btn");
var box=document.getElementById("box");
//点击按钮以后,使box1向右移动(left值增大)
//定义一个变量,用来保存定时器标识
var timer;
btn.onclick=function(){
//关闭上一个定时器
clearInterval(timer);
//开启一个定时器,用来执行动画效果
timer=setInterval(function() {
//获取box1原来的left值
var oldV=parseInt(getStyle(box, "left"));
//在旧值基础上增加
var newV=oldV+1;
//判断newV是否大于800
if(newV>800){
newV=800;
}
//将新值设置给box1
box.style.left=newV+"px";
//当元素移动到800px时,使其停止
if(newV==800){
clearInterval(timer);
}
}, 30);
};
/*
定义一个函数,用来获取指定元素的当前的样式
参数:
obj要获取样式的元素
name要获取的样式名
*/
function getStyle(obj,name){
/*
没加window是变量在作用域中寻找,
加了window是属性
变量没找到会报错,而属性没找到返回undefined
*/
if(window.getComputedStyle){
//正常浏览器的方法
return getComputedStyle(obj,null)[name];
}
else{
//IE8的方法
return obj.currentStyle[name];
}
}
};
二:完善(可向右向左移动,且将移动功能封装成一个函数,且使用户不用考虑speed正负问题)
1.HTML
<button id="btn">点击按钮以后box1向右移动</button>
<br/><br/>
<button id="btn02">点击按钮以后box1向左移动</button>
<br/><br/>
<div id="box"></div>
<div style="width: 0px;height: 1000px;position: absolute;left:800px;border-left: 1px black solid;top: 0;"></div>
2.CSS
*{
margin: 0;
padding: 0;
}
#box{
height: 100px;
width: 100px;
position: absolute;
background-color: red;
left: 0;
}
3.JS
window.onload=function(){
var btn=document.getElementById("btn");
var box=document.getElementById("box");
var btn02=document.getElementById("btn02");
//定义一个变量,用来保存定时器标识
var timer;
btn02.onclick=function(){
move(box, 0, 10);
};
//点击按钮以后,使box1向右移动(left值增大)
btn.onclick=function(){
move(box, 800, 10);
};
//尝试创建一个简单动画的函数
/*
参数:
obj:要执行动画的对象
target:执行动画的目标位置
speed:移动的速度(整数向右移动,负数向左移动)
*/
function move(obj,target,speed){
//关闭上一个定时器
clearInterval(timer);
//判断speed正负值
//如果从0向800移动speed为正
//如果从800向0移动speed为负
//获取box1当前的位置
var current=parseInt(getStyle(obj, "left"));
if(current>target){
//此时speed应为负值
speed=-speed;
}
//开启一个定时器,用来执行动画效果
timer=setInterval(function() {
//获取box1原来的left值
var oldV=parseInt(getStyle(obj, "left"));
//在旧值基础上增加
var newV=oldV+speed;
//判断newV是否大于800
//当向左移动时,要考虑值是否小于target
//当向右移动时,要考虑值是否大于target
if( newV<target && speed<0 || newV>target && speed>0 ){
newV=target;
}
//将新值设置给box1
obj.style.left=newV+"px";
//当元素移动到800px时,使其停止
if(newV==target){
clearInterval(timer);
}
}, 30);
}
/*
定义一个函数,用来获取指定元素的当前的样式
参数:
obj要获取样式的元素
name要获取的样式名
*/
function getStyle(obj,name){
/*
没加window是变量在作用域中寻找,
加了window是属性
变量没找到会报错,而属性没找到返回undefined
*/
if(window.getComputedStyle){
//正常浏览器的方法
return getComputedStyle(obj,null)[name];
}
else{
//IE8的方法
return obj.currentStyle[name];
}
}
};
三:进一步完善(在简单动画函数里添加了attr和callback,把它写在一个外部js文件中)
1.HTML
<button id="btn">点击后box1右移</button>
<button id="btn02">点击后box1左移</button>
<button id="btn03">点击后box2右移</button>
<button id="btn04">测试按钮</button>
<div id="box"></div>
<div id="box2"></div>
<div style="width: 0px;height: 1000px;position: absolute;left:800px;border-left: 1px black solid;top: 0;"></div>
2.CSS
*{
margin: 0;
padding: 0;
}
#box{
height: 100px;
width: 100px;
position: absolute;
background-color: yellow;
left: 0;
}
#box2{
height: 100px;
width: 100px;
position: absolute;
background-color:greenyellow;
left: 0;
top:200px;
}
3.JS(内部)
window.onload=function(){
var btn=document.getElementById("btn");
var box=document.getElementById("box");
var btn02=document.getElementById("btn02");
var btn03=document.getElementById("btn03");
var btn04=document.getElementById("btn04");
//定义一个变量,用来保存定时器标识
/*
目前我们的定时器标识由我们全局变量timer保存
所有正在执行的定时器都在这个变量中保存
*/
//var timer;
//点击按钮以后,使box1向右移动(left值增大)
btn.onclick=function(){
move(box,"left", 800, 10);
};
//box向左移动
btn02.onclick=function(){
move(box,"left", 0, 10);
};
//box2向右移动
btn03.onclick=function(){
move(box2,"left", 800, 20);
};
//测试
btn04.onclick=function(){
//move(box2,"width", 800, 20);
//move(box2,"height", 800, 20);
//move(box2,"top", 800, 20);
move(box2, "width", 800, 10, function() {
move(box2, "height", 300, 10, function() {
move(box2, "top", 300, 100, function() {
})
})
})
};
};
4.JS(外部) tools.js
//尝试创建一个简单动画的函数
/*
参数:
obj:要执行动画的对象
attr:要执行动画的样式,比如:left,top width
target:执行动画的目标位置
speed:移动的速度(整数向右移动,负数向左移动)
callback:回调函数,这个函数将会在动画执行完成以后执行
*/
function move(obj,attr,target,speed,callback){
//关闭上一个定时器
clearInterval(obj.timer);
//判断speed正负值
//如果从0向800移动speed为正
//如果从800向0移动speed为负
//获取box1当前的位置
var current=parseInt(getStyle(obj,attr));
if(current>target){
//此时speed应为负值
speed=-speed;
}
//开启一个定时器,用来执行动画效果
//向执行动画的对象添加一个timer属性,用来保存自己的定时器标识
obj.timer=setInterval(function() {
//获取box1原来的left值
var oldV=parseInt(getStyle(obj, attr));
//在旧值基础上增加
var newV=oldV+speed;
//判断newV是否大于800
//当向左移动时,要考虑值是否小于target
//当向右移动时,要考虑值是否大于target
if( newV<target && speed<0 || newV>target && speed>0 ){
newV=target;
}
//将新值设置给box1
obj.style[attr]=newV+"px";
//当元素移动到800px时,使其停止
if(newV==target){
clearInterval(obj.timer);
//动画执行完毕,调用回调函数
//callback();
callback&&callback();//我尼玛 ,牛逼
}
}, 30);
}
/*
定义一个函数,用来获取指定元素的当前的样式
参数:
obj要获取样式的元素
name要获取的样式名
*/
function getStyle(obj,name){
/*
没加window是变量在作用域中寻找,
加了window是属性
变量没找到会报错,而属性没找到返回undefined
*/
if(window.getComputedStyle){
//正常浏览器的方法
return getComputedStyle(obj,null)[name];
}
else{
//IE8的方法
return obj.currentStyle[name];
}
}