web前端javascript笔记——(15)定时器

定时器简介

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script>
            window.onload=function(){
             //获取count
             var count=document.getElementById("count");
             //使得count中的内容,自动切换
             /*JS的程序的执行速度是非常非常快的
              如果希望一段程序,可以每隔一段时间执行一次,可以使用定时调用*/
        /*     for(var i=0;i<10;i++){
                 count.innerHTML=i;
             }
             
             */
            /*setInterval()
             定时调用
             可以将一个函数,每隔一段时间执行一次
             参数:
             1.回调函数。该函数会每隔一段时间被调用一次,可以传一个匿名函数
             2.每次调用间隔的时间,单位是毫秒
             
             * 返回值
             * 返回一个Number类型的数据
             * 这个数字用来作为定时器的唯一标识*/
            var num=1;
            //它的作用相当于一个放慢速度的for循环
            var timer=setInterval(function(){
                count.innerHTML=num++;
                if(num==11){
                    //关闭定时器
                    clearInterval(timer);
                }
            },1000);
            //
            //console.log(timer);    //1
            /*clearInterval()可以用来关闭一个定时器
             这个方法需要一个定时器的标识作为参数,这样将关闭标识对应的定时器*/
            
            };
        </script>
    </head>
    <body>
        <h1 id="count">1</h1>
    </body>
</html>

切换图片练习

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style>
			img{
				width:600;
				height:450px;
			}
		</style>
		<script>
			window.onload=function(){
			var btn01=document.getElementById("btn01");
			
			var btn02=document.getElementById("btn02");
			 /*让图片自动切换*/
			var img1=document.getElementById("img1");
			//创建一个变量,用来保存当前图片的路径
		    var index=0;
		    var speed=1000;
		    //创建一个数组来保存图片的路径
		    var imgArr=["img/011b915f101bf8a801206621f7be55.jpg@3000w_1l_0o_100sh.jpg","img/1.jpg","img/2.jpg","img/5.jpg","img/0vfvn55rfey0vfvn55rfey.jpg"];
			
			var timer;
			btn01.onclick=function(){
				/*目前,我们每点击一次按钮,就会开启一个定时器
				 点击多次就会开启多个定时器,这就导致图片的切换速度过快
				 并且我们只能关闭最后一次开启的定时器*/
				
				//在开启定时器之前,需要将当前元素上的其他定时器关闭
			clearInterval(timer);
		    //而不是写成var timer=setInterval;
			timer=setInterval(function(){
				//使索引自增
				index+=1;
				//判断索引是否超过最大索引
				if(index==imgArr.length){
					index=0;
				}
				//index=index%imgArr.length;    //也可以这样写
				img1.src=imgArr[index];
			},speed);
			};
			
			btn02.onclick=function(){
				//点击按钮之后,停止图片的自动切换
				/*clearInterval()可以接收任意参数
				 如果参数是一个有效的定时器,则停止对应的定时器
				 如果参数不是一个有效的标识,则什么也不做*/
				clearInterval(timer);
			};
			};
		</script>
	</head>
	<body>
		<img src="img/011b915f101bf8a801206621f7be55.jpg@3000w_1l_0o_100sh.jpg" id="img1"> 
		<br/>
		<br/>
		<button id="btn01">开始</button>
		<button id="btn02">停止</button>
	</body>
</html>

修改div移动练习

<!DOCTYPE html>

<head>
    <meta charset="UTF-8">
    <title>

    </title>
    <style>
        #box1 {
            width: 100px;
            height: 100px;
            background-color:red;
            position: absolute;
        }
    </style>
    <script type="text/javascript">
        window.onload = function() {
        	//思路,把方向和速度分开用两个东西控制
        	
            /*使div可以根据不同的方向键向不同的方向移动
             按左键,div向左移,   37
             按右键,div向右移        39
             按上键,div向上移,   38
             按下键,div向下移        40*/
             //创建一个变量表示方向
                
            var dir=0;
            //定义一个变量,来表示移动的速度
                var speed=10;
                
                //开启一个定时器,来控制div的移动
                setInterval(function(){
                	switch(dir){
                    case 37:
                    //offsetLeft为原来的值
                        box1.style.left=box1.offsetLeft-speed+"px";  
                        break;
                    case 38:
                        box1.style.top=box1.offsetTop-speed+"px"; 
                        break;
                    case 39:
                        box1.style.left=box1.offsetLeft+speed+"px"; 
                        break;
                    case 40:
                        box1.style.top=box1.offsetTop+speed+"px"; 
                        break;
                }},30);
            document.onkeydown=function(event){
            	//处理兼容性问题
            	
                event=event||window.event;
                //使dir等于按键的值
                dir=event.keyCode;
                //当用户按了Ctrl之后,速度加快
                if(event.ctrlKey){
                    speed=50;  
                }else{
                	speed=10;
                }
                
            };
            //当按键松开时,div不再移动
            document.onkeyup=function(){
            	//设置dir=0;
            	dir=0;
            };
  
        };
    </script>

</head>

<body>
    <div id="box1"></div>
</body>

</html>

延时调用

<!DOCTYPE html>

<head>
    <meta charset="UTF-8">
    <title>

    </title>
    <style>
        #box1 {
            width: 100px;
            height: 100px;
            background-color:red;
            position: absolute;
        }
    </style>
    <script type="text/javascript">
        window.onload = function() {
        var num=1;
        //开启一个定时器
  /*      setInterval(function(){
        	console.log(num++);
        },3000);
   */     
        /*延时调用
        	 延时调用
         	延时调用一个函数不马上执行,而是隔一段时间以后再执行,
         	而且只会执行一次,
         	延时调用和定时调用的区别
         	延时调用只会执行一次,定时调用会执行好多次
         	
         	延时调用和定时调用实际上是可以互相代替的,再开发中可以根据自己的需要去选择
         	* */
        var timer=setTimeout(function(){
        	console.log(num++);
        },3000);
        //使用clearTimeout()来关闭延时调用
        clearTimeout(timer);
        };
    </script>

</head>

<body>
    
</body>

</html>

定时器的调用

<!DOCTYPE html>

<head>
    <meta charset="UTF-8">
    <title>

    </title>
    <style>
        *{
        	margin:0;
        	padding:0;
        }
        #box1{
        	width:100px;
        	height:100px;
        	background-color: red;
        	position:absolute;
        	left:0;  /*在IE浏览器中,如果没有指定值,获取到的可能就是auto*/
        	
        }
        #box2{
        	width:100px;
        	height:100px;
        	background-color: yellow;
        	position:absolute;
        	left:0;  /*在IE浏览器中,如果没有指定值,获取到的可能就是auto*/
        	top:300px;  /*不写top的话两个会盖在一起*/
        }
    </style>
    <script type="text/javascript">
        window.onload = function() {
        	/*
        	 1.提取共同的方法
        	 2.分开设置定时器
        	 3.回调函数
        	 4.设置修改不同样式
        	 * */
        	//获取box1
        	var box1=document.getElementById("box1");
        	var box2=document.getElementById("box2");
        	var btn01=document.getElementById("btn01");
        	var btn02=document.getElementById("btn02");
        	//获取btn03
        	var btn03=document.getElementById("btn03");
        	var btn04=document.getElementById("btn04");
        	btn03.onclick=function(){
        		move(box2,"top",100,10);
        	};
        	//点击按钮以后box1向右移动(left值增大)
        	//定义一个变量,用来保存定时器的标识
        	/*目前我们的定时器的标识由全局变量timer保存
        	 所有的正在执行的定时器都在这个变量中保存*/
        //	var timer;  //如果开一个共同的定时器,一个就会在执行的时候把另外一个定时器关掉,使其不能执行
        	btn01.onclick=function(){
        	   move(box1,"left",800,20);
        	};
        	
        	//点击btn02,向左移动
        	btn02.onclick=function(){
        	    move(box1,"right",200,10);
        	};
        	btn04.onclick=function(){
        	    move(box2,"height",500,10,function(){
        	    	 move(box2,"width",500,10,function(){
        	    		move(box2,"top",100,10,function(){
        	    	
        	    });
        	    });
        	    });
        	};
        	/*定义一个函数,用来获取指定元素的当前的样式
        	 * 参数:
        	 * obj 要获取样式的元素
        	 * name 要获取的样式名
        	*/
        	function getStyle(obj,name){
        		if(window.getComputedStyle){
        			//正常浏览器的方式,具有getComputedStyle()方法
        			return getComputedStyle(obj,null)[name];
        		}else{
        			//IE 8的方式,没有getComputedStyle()方法
        			return obj.currentStyle[name];
        		}
        	};
        	
        	//尝试创建一个可以执行简单动画的函数
        	function move(obj,attr,target,speed,callback){
        		/*参数:
        		 obj  要执行动画的对象
        		 attr 要执行动画的样式,比如left right top right
        		 target  执行的结果目标
        		 speed :移动的速度
        		 正负不由调用者来考虑,在函数内部进行考虑
        		 callback:回调函数,这个函数会在动画执行完毕以后执行*/
        			//关闭上一个定时器,避免定时器叠加,速度过快
        	    clearInterval(obj.timer);	
        	    //判断速度的正负值
        	    /*如果从0向800移动,则speed为正,反之,为负*/
        	    //获取元素目前的位置
        	    var current=parseInt(getStyle(obj,attr));
        	    if(current>target){
        	    	speed=-speed;
        	    }
        	    
        		//开启一个定时器,用来执行动画效果
        		//向执行动画的对象中添加一个timer属性,用来保存它自己的定时器的标识
        	   obj.timer=setInterval(function(){
        			//获取box1的原来的left值
        			var oldValue=parseInt(getStyle(obj,attr));
        			//在旧值的基础上减少
        			var newValue=oldValue+speed;
        			//向左移动
        			if(speed<0&&newValue<target||speed>0&&newValue>target){
        				
        				newValue=target;
        			   
        			}
        			//这行代码写在判断是否<=0的上面,结果会完全不同
        			obj.style[attr]=newValue+"px";//因为attr是变量,所以需要放在中括号里面
        	//错误的写法		obj.style.attr=newValue+"px";
        			//当元素执行到0px的时候,使其停止执行动画
        			if(newValue===target){
        				clearInterval(obj.timer);
        				//动画执行完毕之后,调用回调函数
        				//如果传回调函数了,再执行
        				callback&&callback();
        			}
        		},30);	
        		
        	}
        	
        };
    </script>

</head>

<body>
    <button id="btn01">点击按钮以后box1向右移动</button>
    <button id="btn02">点击按钮以后box1向左移动</button>
    <button id="btn03">点击按钮以后box2移动</button>
    <button id="btn04">测试按钮</button>
    <br/></br>
    <div id="box1"></div>
    <div id="box2"></div>
</body>

</html>

轮播图(自动播放和点击操作)

<!DOCTYPE html>

<head>
    <meta charset="UTF-8">
    <title>

    </title>
    <style>
    	*{
    		/*清除默认格式*/
    		margin:0;
    		padding:0;
    	}
    	#outer{
    	width:420px;
       	height:300px;
       	margin:50px auto;
       	background-color: greenyellow;
       	padding:10px 0;
       	overflow: hidden;
       	/*给子元素开启绝对定位了,就给父元素开启相对定位*/
       	position: relative;
    	}
       img{
       	width:400px;
       	height:300px;
       	
       }
       ul{
       
       /*给父元素设置宽度,才能横过来,否则父容器宽度不够,设置float:left也没办法横过来*/
       /*开启绝对定位*/
      position: absolute;
       }
       li{
       float:left;
      margin:0 10px;
       list-style: none;
      }
      /*设置导航按钮*/
     #navDiv{
     	/*开启绝对定位*/
     	position:absolute;
     	bottom:10px;
     	margin-left:50%;
     	transform: translateX(-50%);
     }
     #navDiv a{
     	width:15px;
     	height:15px;
     	background-color: #FFFFFF;
     	/*设置浮动以后会横着排列,内联样式会变成块样式
     	 设置超链接浮动*/
     	float:left;
     	/*设置左右外边距*/
     	margin:0 10px;
     	/*设置透明度*/
     	opacity:0.5;
     	/*兼容IE8的透明度*/
     	filter:alpha(opacity=50);
     }
     /*设置鼠标移入的样式*/
       #navDiv>a:hover{
       	
       	background-color:black;
       }  
    </style>
    <script type="text/javascript" src="js/tools.js"></script>
    <script type="text/javascript" >
        window.onload = function() {
        	var imgList=document.getElementById("imgList");
        	var imgArr=document.getElementsByTagName("img");
        	imgList.style.width=imgArr.length*420+"px";
        	//获取所有的a
        	var allA=document.getElementsByTagName("a");
        	//默认显示图片的索引
        	var index=0;
        	//设置默认选中的效果
        	//因为一开始是默认显示第一个图片,所以就这样设置第一个<a>
        	allA[index].style.backgroundColor="black";   //需要加双引号
        	/*点击超链接切换到指定的图片
        	 点击第一个超链接,显示第一个图片
        	 点击第二个超链接,显示第二个图片*/
        	//为所有的超链接都绑定单击响应函数
        	for(var i=0;i<allA.length;i++){
        		//为每个超链接都添加一个num属性,来保存它自己的索引
        		allA[i].num=i;
        		allA[i].onclick=function(){
        			//点击的时候关闭自动切换的定时器
        			clearInterval(timer);
        	//    alert(this); //javascript:;
        	//获取点击超链接的索引
     //   	alert(i);//先执行for循环,再执行单击响应函数,所以获取到的i都是5
                    //获取点击超链接的索引,并将其设置为index
                    index=this.num;
                    //切换图片
                    /*
                     第一张   索引 0   left  0
                     第二张   索引 1   left  -420
                     第三张   索引2    left  -420*2*/
             //       imgList.style.left=(-420)*index+"px";
                    //修改正在选中的a
                    setA();
                    //使用move函数来切换图片
                    move(imgList,"left",-420*index,20,function(){
                    	//点击的时候关闭了自动切换图片的功能
                    	//当动画执行完毕之后,开启自动切换
                    	autoChange();
                    });
        		
        	};
        	}
        	//开启自动切换图片
        	autoChange();
        	//创建一个方法用来设置选中的a
        	function setA(){
        		//判断当前索引是否是最后一张图片
        		if(index>=imgArr.length-1){
        			//则将index设置为0
        			index=0;
        			/*此时显示的是最后一张图片,而最后一张图片和第一张是一模一样的
        			 通过CSS将最后一张切换为第一张*/
        			imgList.style.left=0;
        			
        		}
        		for(var i=0;i<allA.length;i++){
        			//去掉内联样式,样式表里的样式就会生效
        			allA[i].style.backgroundColor="";
        		}
        		//将选中的a设置为黑色
        		allA[index].style.backgroundColor="black";
        	};
        	var timer;
        	//创建一个函数,用来开启自动切换图片
        	function autoChange(){
        		//开启一个定时器,用来定时去切换图片
        		timer=setInterval(function(){
        			//使索引自增
        			index++;
        			index%=imgArr.length;
        			//执行动画,切换图片
        			move(imgList,"left",-420*index,20,function(){
        				//修改导航点
        				setA();
        			});
        		},3000);
        	};
        	
        };
    </script>

</head>

<body>
	<!--创建一个外部的div,来作为大的容器-->
	<div id="outer">
		<!--创建一个ul,用来放置图片-->
		<ul id="imgList">
   	<li><img src="img/011b915f101bf8a801206621f7be55.jpg@3000w_1l_0o_100sh.jpg"></li>
    <li><img src="img/0vfvn55rfey0vfvn55rfey.jpg"></li>
    <li><img src="img/1.jpg"</li>
    <li><img src="img/2.jpg"</li>
    <li><img src="img/5.jpg"></li>
    <!--因为第一张和最后一张的图片一样,所以才看不出切换-->
    <li><img src="img/011b915f101bf8a801206621f7be55.jpg@3000w_1l_0o_100sh.jpg"></li>

   </ul>
   <!--创建导航按钮-->
   <div id="navDiv">
   	<a href="javascript:;"></a>
   	<a href="javascript:;"></a>
   	<a href="javascript:;"></a>
   	<a href="javascript:;"></a>
   	<a href="javascript:;"></a>
   </div>
	</div>
   
</body>

</html>

tools.js文件

 	function getStyle(obj,name){
        		if(window.getComputedStyle){
        			//正常浏览器的方式,具有getComputedStyle()方法
        			return getComputedStyle(obj,null)[name];
        		}else{
        			//IE 8的方式,没有getComputedStyle()方法
        			return obj.currentStyle[name];
        		}
        	};
        	
        	//尝试创建一个可以执行简单动画的函数
        	function move(obj,attr,target,speed,callback){
        		/*参数:
        		 obj  要执行动画的对象
        		 attr 要执行动画的样式,比如left right top right
        		 target  执行的结果目标
        		 speed :移动的速度
        		 正负不由调用者来考虑,在函数内部进行考虑
        		 callback:回调函数,这个函数会在动画执行完毕以后执行*/
        			//关闭上一个定时器,避免定时器叠加,速度过快
        	    clearInterval(obj.timer);	
        	    //判断速度的正负值
        	    /*如果从0向800移动,则speed为正,反之,为负*/
        	    //获取元素目前的位置
        	    var current=parseInt(getStyle(obj,attr));
        	    if(current>target){
        	    	speed=-speed;
        	    }
        	    
        		//开启一个定时器,用来执行动画效果
        		//向执行动画的对象中添加一个timer属性,用来保存它自己的定时器的标识
        	   obj.timer=setInterval(function(){
        			//获取box1的原来的left值
        			var oldValue=parseInt(getStyle(obj,attr));
        			//在旧值的基础上减少
        			var newValue=oldValue+speed;
        			//向左移动
        			if(speed<0&&newValue<target||speed>0&&newValue>target){
        				
        				newValue=target;
        			   
        			}
        			//这行代码写在判断是否<=0的上面,结果会完全不同
        			obj.style[attr]=newValue+"px";//因为attr是变量,所以需要放在中括号里面
        	//错误的写法		obj.style.attr=newValue+"px";
        			//当元素执行到0px的时候,使其停止执行动画
        			if(newValue===target){
        				clearInterval(obj.timer);
        				//动画执行完毕之后,调用回调函数
        				//如果传回调函数了,再执行
        				callback&&callback();
        			}
        		},30);	
        		
        	}

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Komorebi_9999

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值