根据上一个实例,做到灵活应用和代码复用,把参数大部分改为形参形式传进来。
代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
#box1{
width: 100px;
height: 100px;
background: red;
/*因为在IE浏览器中如果没有指定的值,就默认auto,所以我们需要先指定一个值*/
position: absolute;
left: 0;
}
#box2{
width: 100px;
height: 100px;
background: red;
/*因为在IE浏览器中如果没有指定的值,就默认auto,所以我们需要先指定一个值*/
position: absolute;
left: 0;
top: 200px;
}
</style>
<script type="text/javascript" src="../js/tools.js"></script>
<script type="text/javascript">
window.onload = function(){
/*
* 假如我们创建多个按钮来同时控制多个div移动的话,但是每次都是点击后,就关闭上一个定时器标识
* 所以点击第一个div移动后再点击第二个div移动的时候,第一个div就会停下来了,因为关闭了上一个定时器的标识了。
* 目前我们的定时器的标识由全局变量timer保存。
* 所有的执行正在执行的定时器都在这个变量中保存。
* 那么所要操作的就是把timer变成对象自己的就可以了,给timer添加一个这样子的属性就好了。
* 就不需要定义一个全局的timer了。
*/
// var timer;
box1 = document.getElementById("box1");
box2 = document.getElementById("box2");
btn = document.getElementById("btn");
btn01 = document.getElementById("btn1");
btn02 = document.getElementById("btn2");
test = document.getElementById("test");
btn.onclick = function(){
move(box1,800,10,'left');
}
btn01.onclick = function(){
move(box1,0,10,'left');
}
btn02.onclick = function(){
move(box2,800,10,'left');
};
test.onclick = function(){
// move(box2,800,10,'width');
// move(box2,800,10,'top');
move(box2,800,10,'height',function(){
move(box2,800,10,'width');
});
}
//获取元素的值
function getStyle(obj,name){
if(window.getComputedStyle){
return getComputedStyle(obj,null)[name]
}
else{
return obj.currentStyle[name]
}
}
//需求是点击button,div就一直往左移动
/*
* 如果存在多个按钮的话,不能直接复制太多重复的代码,希望可以复用代码,
* 所以需要写一个移动的函数来操作
* 参数:
* obj:哪个按钮
* attr:要执行动画的样式,比如:left top width,height
* target:移动停止的阈值
* speed :移动的速度,如果为正则向右移动,为负则向左移动
* 但是每次move都要传正负,不太好,希望程序自己可以判断
* 判断速度的正负值
* 如果从0向800移动,则speed为正
* 如果从800向0移动,则speed为负
*
* attr width top hegiht left
*
* 回调函数 callback 动画执行完毕后执行。比如说执行向左还想执行向右,那就需要根据回调函数执行
*/
function move(obj,target,speed,attr,callback){
//清除上一个定时器
clearInterval(obj.timer);
//开启一个定时器,用来执行动画效果
//向执行动画的对象中添加一个timer属性,用来半寸它自己的定时器的标识。
obj.timer = setInterval(function(){
//获取box1原来的left值,通过复用的函数去获取,parseInt是把字符串的数字部分转换为number
var oldlvalue = parseInt(getStyle(obj,attr));
//判断是向左还是向右
if(oldlvalue>target){
speed = -speed;
}
newvalue = oldlvalue + speed;
/*
* 判断newvalue是否大于800
* 从800向0移动
* 向左移动时,需要判断newvalue是否小于target
* 向右移动时,需要判断newvalue是否大于target
*/
if((speed>0&&newvalue>target) || (speed<0&&newvalue<target)){
newvalue = target;
}
obj.style[attr] = newvalue + "px";
/*
* 控制移动的位置,当800px时,就停止移动
*/
if(newvalue === target){
clearInterval(obj.timer);
callback && callback()
}
},300)
}
}
</script>
</head>
<body>
<button id="btn">点击div向右移动</button>
<button id="btn1">点击div向左移动</button>
<button id="btn2">点击div2向右移动</button>
<button id="test">测试按钮</button>
<br /><br />
<div id="box1"></div>
<div id="box2"></div>
<br />
</body>
</html>
这里的js是一个内部的js,做到多人应用,需要提取到外部js
新建一个tools.js
//需求是点击button,div就一直往左移动
/*
* 如果存在多个按钮的话,不能直接复制太多重复的代码,希望可以复用代码,
* 所以需要写一个移动的函数来操作
* 参数:
* obj:哪个按钮
* attr:要执行动画的样式,比如:left top width,height
* target:移动停止的阈值
* speed :移动的速度,如果为正则向右移动,为负则向左移动
* 但是每次move都要传正负,不太好,希望程序自己可以判断
* 判断速度的正负值
* 如果从0向800移动,则speed为正
* 如果从800向0移动,则speed为负
*
* attr width top hegiht left
*
* 回调函数 callback 动画执行完毕后执行。比如说执行向左还想执行向右,那就需要根据回调函数执行
*/
function move(obj,target,speed,attr,callback){
//清除上一个定时器
clearInterval(obj.timer);
//开启一个定时器,用来执行动画效果
//向执行动画的对象中添加一个timer属性,用来半寸它自己的定时器的标识。
obj.timer = setInterval(function(){
//获取box1原来的left值,通过复用的函数去获取,parseInt是把字符串的数字部分转换为number
var oldlvalue = parseInt(getStyle(obj,attr));
//判断是向左还是向右
if(oldlvalue>target){
speed = -speed;
}
newvalue = oldlvalue + speed;
/*
* 判断newvalue是否大于800
* 从800向0移动
* 向左移动时,需要判断newvalue是否小于target
* 向右移动时,需要判断newvalue是否大于target
*/
if((speed>0&&newvalue>target) || (speed<0&&newvalue<target)){
newvalue = target;
}
obj.style[attr] = newvalue + "px";
/*
* 控制移动的位置,当800px时,就停止移动
*/
if(newvalue === target){
clearInterval(obj.timer);
callback && callback()
}
},300)
}
//获取元素的值
function getStyle(obj,name){
if(window.getComputedStyle){
return getComputedStyle(obj,null)[name]
}
else{
return obj.currentStyle[name]
}
}
应用的时候只要引入就可以了
<script type="text/javascript" src="../js/tools.js"></script>