【小案例】定时器的应用

一:(仅可向右移动)

在这里插入图片描述
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];
			 	}
			 } 	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值