定时器与函数封装

本文介绍了JavaScript中的定时器,包括setTimeout和setInterval的使用,以及如何清除定时器。详细讲解了定时器在广告展示和轮播图场景中的应用,并展示了如何封装一个运动框架,实现点击按钮让div移动的功能。此外,还详细阐述了轮播图的实现,包括html布局、css样式以及自动循环播放、鼠标交互和圆圈切换图片等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定时器与函数封装

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值