定时器简介
<!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);
}