定时器与函数封装
1.定时器的分类
(1)setTimeout延迟执行:延迟某个特定的时间开始执行,只执行一次。
语法:setTimeout(函数,间隔时间(ms))
场景:一般用于广告
(2)setInterval间歇执行(或重复执行):隔某个时间就执行一次,执行无数次。
语法:setInterval(函数,间隔时间(ms))
场景:一般用于轮播图和倒计时。
2.定时器的简单使用
setTimeout:延迟执行一次
setTimeout(function(){},3000); 隔3秒函数一次
//广告 图片显示5s,自动消失
var oImg = document.getElementsByTagName("img")[0];
setTimeout(function () {
oImg.style.display = "none";
},5000);
setInterval:间歇执行
setInterval(function(){},3000); 每隔3秒执行一次函数
var oImg = document.getElementsByTagName("img")[0];
var arr = ["img/1.jpg","img/2.jpg","img/3.jpg","img/4.jpg"];
var n = 0;
setInterval(function () {
n++;
if(n == 4)n=0;
oImg.src = arr[n];//0 1 2 3
},1000);
3.定时器的清除
定时器一旦开启,就不会自动停止,停止定时器我们需要使用clear,不同的定时器有不同的清除方式。
语法:clearInterval(intervalId);
clearTimeout(intervalId);(基本上用不上)
注意:停止的是定时器下一次的执行
intervalId:它是一个number数值,开启定时器的时候,会返回唯一一个能标识当前定时器的id,一般是从1开始 1 2 3 4。
var n = 10;
var timer = setInterval(function () {//定义一个变量,接受定时器的id
n--;
if(n <= 0){
n = 0;
//停止定时器
clearInterval(timer);
}
document.body.innerHTML = n;
},1000);
定时器的应用
//setTimeout的应用----讨厌的广告,点击一次按钮关闭一次广告
<style>
.box{
position:relative;
width:400px;
}
button{
position:absolute;
right:0;
}
</style>
<div class="box" style="display:none;">
<button>X</button>
<img src="img/tan.png" alt="#" >
</div>
<script>
var oBox=document.getElementsByTagName("div")[0];
var oBtn=document.getElementsByTagName("button")[0];
var oImg=document.getElementsByTagName("img")[0];
var xianshi=function(){
oBox.style.display="block";
};
//广告2秒出现一次
setTimeout(xianshi,2000);
//点击按钮关闭广告,隔两秒广告再出来
oBtn.onclick=function(){
oBox.style.display="none";
setTimeout(xianshi,2000);
}
</script>
//setInterval的应用----倒计时
<style>
.box{
width:300px;
height:300px;
margin:100px auto;
font:bold 40px/300px "微软雅黑";
}
</style>
<div class="box">
<span>10</span>
</div>
<script>
var oDiv=document.getElementsByTagName("div")[0];
var oSpan=document.getElementsByTagName("span")[0];
//点击倒计时开始
oDiv.onclick = function(){
var n=11;
var timeOver= setInterval(function change(){
n--;
//当n=0时,关闭定时器
if(n==0){
clearInterval(timeOver);
}
oSpan.innerHTML=n;
},1000);
}
</script>
4.封装运动框架
a.点击按钮可以让div来回移动
//div盒子的样式
<style>
div {
position:absolute;
left:0;
width: 100px;
height: 100px;
background-color: pink;
}
</style>
<button>向前</button>
<button>向后</button>
<div></div>
<script src="js/ujiuye.js"></script>
<script>
var oBtn=document.getElementsByTagName("button");
var oDiv=document.getElementsByTagName("div")[0];
var timer;
//点击按钮向前运动
oBtn[0].onclick = function(){
clearInterval(timer);//在开启定时器时,先清除之前的定时器,以防叠加
timer=setInterval(function(){
var n=parseInt(getStyle(oDiv,"left"))+10;//获取left的当前值,并且每次加10,使用的是之前封装好的getstyle()函数
if(n>=1000){
n=1000;
clearInterval(timer);//到达1000时,清除定时器
}
oDiv.style.left=n+"px";
}, 30);
}
//点击按钮向后运动
oBtn[1].onclick = function(){
clearInterval(timer);
timer=setInterval(function(){
var n=parseInt(getStyle(oDiv,"left"))-10;
if(n<=0){
n=0;
clearInterval(timer);
}
oDiv.style.left=n+"px";
}, 30);
}
</script>
b.两个按钮有重复的代码,要进行函数封装
//对于这种只有某个值有变化的函数来说,我们可以将两个函数封装成一个,把不一样的数值作为参数传入,封装思路:
1.声明一个函数,
2.把主要代码放入函数中
3.找可变的值做参数
4.调用,调试
/*
* 运动函数
* @param {object}:elem 标签
* @param {string}:attr 属性名
* @param {number}:step 步长(每次的运动距离)
* @param {number}:target 目标值
*/
function move(elem,attr,step,target){
step = parseInt(getStyle(elem,attr))< target ? step :-step;
clearInterval(elem.timer);//自定义属性
elem.timer = setInterval(function(){
//获取当前值 + 10
var cur = parseInt(getStyle(elem,attr)) + step;
if(cur >= target && step > 0 || cur <= target && step < 0){ //下
cur = target;
//停止定时器
clearInterval(elem.timer);
}
elem.style[attr] = cur + "px";
},30);
}
5.轮播图
a.html布局
<div class="view" id="view">
<ul id="lunbo">
<li><img src="img/1.jpg" alt="#"></li>
<li><img src="img/2.jpg" alt="#"></li>
<li><img src="img/3.jpg" alt="#"></li>
<li><img src="img/4.jpg" alt="#"></li>
<li><img src="img/1.jpg" alt="#"></li>
</ul>
<div>
<span class="active"></span>
<span></span>
<span></span>
<span></span>
</div>
</div>
b.css样式
<style>
*{
margin:0;
padding:0;
list-style:none;
}
.view{
position:relative;
width:500px;
height:380px;
border:2px solid black;
margin:50px auto;
overflow: hidden;
}
.view ul{
position:absolute;
top:0;
left:0;
width:2500px;
}
.view ul::after{
content:"";
display:block;
clear:both;
}
.view ul li{
float:left;
}
.view ul li img{
width:500px;
height:380px;
}
.view div{
position:absolute;
bottom:10px;
width:100%;
text-align: center;
}
.view div span{
display:inline-block;
width:16px;
height:16px;
background-color:white;
border-radius:50%;
margin-right:5px;
}
.view div .active{background-color:orangered;}
</style>
c.自动循环播放轮播图
<script src="js/ujiuye.js"></script>
<script>
var view=document.getElementById("view");
var oUl=document.getElementById("lunbo");
var oSpan=document.getElementsByTagName("span");
var n=0;
//轮播图播放函数
var change =function () {
n++;
if(n==5){
n=1;
oUl.style.left=0+"px";
}
move(oUl, "left", 30, -500 * n);//调用之前封装好的运动函数
for(var i=0;i<oSpan.length;i++){
oSpan[i].className="";
}
oSpan[n==4?0:n].className="active";
}
//定时器调用轮播图
var timer = setInterval(change, 2000);
d.点击圆圈切换图片
//鼠标移入清除定时器
view.onmouseover = function () {
clearInterval(timer);
}
//鼠标移出恢复定时器
view.onmouseout = function () {
timer = setInterval(change, 2000);
}
var fun = function (n) {
oUl.style.left = -500 * n + "px";
for (var i = 0; i < oSpan.length; i++) {
oSpan[i].className = "";
}
oSpan[n].className = "active";
}
//通过小圆圈控制图片
for(var i=0;i<oSpan.length;i++){
oSpan[i].index=i;
oSpan[i].onclick = function(){
fun(this.index);
}
}
轮播图的应用:
功能:
1.自动切换图片
2.鼠标移入自动切换停止,鼠标移出自动切换恢复
3.点击左右按钮可以切换图片
4.点击小圆点可以切换图片
//html布局
<div class="box" id="box">
<ul id="lunbo">
<li><img src="img/one.jpg" alt="#"></li>
<li><img src="img/two.jpg" alt="#"></li>
<li><img src="img/three.jpg" alt="#"></li>
<li><img src="img/four.jpg" alt="#"></li>
<li><img src="img/one.jpg" alt="#"></li>
</ul>
<div class="circle">
<span class="active"></span><span></span><span></span><span></span>
</div>
<div id="leftButton"></div>
<div id="rightButton"></div>
</div>
//css样式
<style>
*{
margin:0;
padding:0;
list-style:none;
}
.box{
position:relative;
width:960px;
height:320px;
border:1px solid red;
margin:20px auto;
overflow: hidden;
}
.box #lunbo::after{
content:"";
display:block;
clear:both;
}
.box #lunbo{
position:absolute;
left:0;
width:4800px;
height:320px;
}
.box #lunbo li{float:left;}
.box .circle{
position:absolute;
bottom:10px;
width:100%;
text-align: center;
}
.box .circle span{
display:inline-block;
width:14px;
height:14px;
border-radius:50%;
background-color:white;
margin-right:5px;
}
.box .circle .active{background-color:orange;}
#leftButton,#rightButton{
position:absolute;
top:120px;
width:60px;
height:80px;
background-image: url(img/btn_show.png);
background-repeat: no-repeat;
}
#leftButton{
left:0;
background-position:0 -80px;
}
#rightButton{
right:0;
background-position:0 0;
}
</style>
<script src="js/function.js"></script> //引入一个js文件,里面有封装好的函数
<script>
var oBox = document.getElementById("box");
var lunboUl = document.getElementById("lunbo");
var oSpan = document.getElementsByTagName("span");
var leftBtn = document.getElementById("leftButton");
var rightBtn = document.getElementById("rightButton");
var n = 0;
//轮播图滑动
var change = function () {
n++;
if (n == 5) {
n = 1;
lunboUl.style.left = 0;
}
move(lunboUl, "left", 50, -960 * n);
for (var i = 0; i < oSpan.length; i++) {
oSpan[i].className = "";
}
oSpan[n == 4 ? 0 : n].className = "active";
}
//定时器调用
var timer = setInterval(change, 3000);
//鼠标移入清除定时器
oBox.onmouseover = function () {
clearInterval(timer);
}
//鼠标移出恢复定时器
oBox.onmouseout = function () {
timer = setInterval(change, 3000);
}
//点击右按钮,图片下一张
rightBtn.onclick = function () {
n++;
if (n == 4) { n = 0; }
fun(n);
}
//点击左按钮,图片上一张
leftBtn.onclick = function () {
n--;
if (n < 0) { n = 3; }
fun(n);
}
//封装点击的函数
var fun = function (n) {
lunboUl.style.left = -960 * n + "px";
for (var i = 0; i < oSpan.length; i++) {
oSpan[i].className = "";
}
oSpan[n].className = "active";
}
//通过小圆圈控制图片
for(var i=0;i<oSpan.length;i++){
oSpan[i].index=i;
oSpan[i].onclick = function(){
fun(this.index);
}
}
</script>
//封装好的函数
/*
* 获取元素样式
* @param {object}:elem 标签
* @param {string}:attr 属性名
*/
function getStyle(elem,attr){
if(elem.currentStyle){
var w = elem.currentStyle[attr];
}else{
var w = getComputedStyle(elem)[attr];
}
return w;
}
/*
* 运动函数
* @param {object}:elem 标签
* @param {string}:attr 属性名
* @param {number}:step 步长(每次的运动距离)
* @param {number}:target 目标值
*/
function move(elem,attr,step,target){
step = parseInt(getStyle(elem,attr))< target ? step :-step;
clearInterval(elem.timer);//自定义属性
elem.timer = setInterval(function(){
//获取当前值 + 10
var cur = parseInt(getStyle(elem,attr)) + step;
if(cur >= target && step > 0 || cur <= target && step < 0){ //下
cur = target;
//停止定时器
clearInterval(elem.timer);
}
elem.style[attr] = cur + "px";
},30);
}