定时器与运动函数封装

1.定时器

1.1 定时器的基本概念

  • 定时器的分类

    • 延迟定时器:

      • 语法: ms 延迟一段时间执行函数一次

      • 作用:等待一定的时间后执行一次

      • 使用场景:广告弹窗

    • 间歇定时器:

      • 语法:setInterval(函数,时间) 隔一段时间执行函数一次

      • 作用: 隔一段时间执行函数一次

      • 使用场景:轮播图,倒计时,抽奖

1.2 setTimeout

  • setTimeout(函数,时间) :等待一定的时间后执行一次,一般用于广告弹窗

    /* 
      语法:setTimeout(函数,时间) ms:等一定的时间执行函数一次
           1s = 1000ms
    */
    setTimeout(function(){
        console.log("setTimeout(函数,时间) ms:等一定的时间执行函数一次");
    },2000); 
    ​
    //函数可以直接写到setTimeout中,也可以提前定义好
    setTimeout(delay,3000);
    function delay(){
        console.log("哈哈哈哈哈");
    }

1.3 setInterval

  • setInterval(函数,时间) 隔一段时间执行函数一次,一般用于轮播图,倒计时,抽奖

    //语法:setInterval(函数,时间) ms:间隔一段是执行函数一次
    document.body.innerHTML = 1;
    var n = 1;
    ​
    setInterval(function(){
        n++;
        document.body.innerHTML = n;
    },1000);
  • 同步异步

    • 同步:在做某一个事件的时候,其他操作只能等待 独木桥

      //同步:在做某一个事件的时候,其他操作只能等待   独木桥
      alert("fd");
      console.log("开始");
      for(var i = 0;i<1000;i++){
          console.log("i");
      }
      console.log("结束");
    • 异步:在做某一个事情的时候,可以去做其他操作 定时器

      // 异步:在做某一个事情的时候,可以去做其他操作   定时器
      console.log(1);
      setTimeout(function(){
          console.log("定时器");
      },1000);
      console.log(2);

1.4 停止定时器

  • 停止定时器

    停止定时器:定时器只要一开始就不会主动停止,可以强制停止
    为什么停止:占用空间,影响性能
    语法:clearInterval(intervalId)
          clearTimeout(intervalId)
    intervalId:每一个定时器在开启的时候,都会返回一个能唯一标识当前定时器的id
  • 例1: 定时器停止的是下一次的执行

    //2.点击按钮,开始倒计时
    oBtn.onclick = function(){
        var n = 5;
        oBtn.innerHTML = "5s后重新获取验证码";
        var timer = setInterval(function(){
            n--;
            if(n <= 0) {
                n = 0;
                //停止定时器
                clearInterval(timer);
            }
            oBtn.innerHTML = n + "s后重新获取验证码";
        },1000);
    }
  • 移入停止离开开启:定时器只要一清除,就没有了

    //1.获取元素
    var oImg = document.getElementsByTagName("img")[0];
    var n = 1;
    ​
    //2.自动切换
    var timer = setInterval(auto, 1000);  //1
    function auto() {
        n++;
        if (n > 4) { n = 1 }
        oImg.src = "./img/" + n + ".jpg";
    }
    ​
    ​
    //3.鼠标移入停止定时器
    oImg.onmouseover = function () {
        clearInterval(timer);
    }
    ​
    //4.鼠标移出重新开始定时器
    oImg.onmouseout = function () {
        //每一次开启的定时器的id都不一样,一定要更新timer的id值
        timer = setInterval(auto,1000); //2  3
    }

2.运动函数封装

2.1 起飞(从左往右)

  • 实现思路:

    • 点击设置img的left值

    • left值 = 当前元素的位置 + 10;

      oBtn.onclick = function () {
              //2.当前的位置的基础上 + 10
              var cur = parseInt(getStyle(oImg, "left")) + 10;
          
              //1.改变元素的位置
              oImg.style.left = cur + "px";
          }, 50);
      }
    • 问题1:一直飞,飞出界,限制范围1000的位置停止

      oBtn.onclick = function () {
          setInterval(function () {
              //2.当前的位置的基础上 + 10
              var cur = parseInt(getStyle(oImg, "left")) + 10;
              
              //3.如果到1000的位置,停止定时器
              if(cur >= 1000){
                  cur = 1000;
                  clearInterval(timer);
              }
              
              //1.改变元素的位置
              oImg.style.left = cur + "px";
          }, 50);
      }
    • 问题2:越点越快

      oBtn.onclick = function () {
          //问题:越点越快
          //原因:定时器会叠加,点击一次添加一个
          //解决:在开启定时器之前,把之前开的定时器停掉
          //4
          clearInterval(timer);
          timer = setInterval(function () {
              //2.当前的位置的基础上 + 10
              var cur = parseInt(getStyle(oImg, "left")) + 10;
      
              //3.如果到1000的位置,停止定时器
              if(cur >= 1000){
                  cur = 1000;
                  clearInterval(timer);
              }
      
              //1.改变元素的位置
              oImg.style.left = cur + "px";
          }, 50);
      }

2.2 返航

  • 实现返航(从右到左,-10,条件为<=)

    oBtn.onclick = function () {
        clearInterval(timer);
        timer = setInterval(function () {
            //2.当前的位置的基础上 + 10
            var cur = parseInt(getStyle(oImg, "left")) - 10;
    
            //3.如果到1000的位置,停止定时器
            if(cur <= 0){
                cur = 0;
                clearInterval(timer);
            }
            
            //1.改变元素的位置
            oImg.style.left = cur + "px";
        }, 50);
    }

2.3 封装

  • 声明一个函数,把主要代码放入函数中

  • 找函数中可变的值,做参数

  • 调用调试

    function fly(elem,attr,step,target) {//元素,属性,步长,目标值
        clearInterval(timer);
        timer = setInterval(function () {
            //4.获取现有位置 +10
            var cur = parseInt(getStyle(elem, attr)) + step;
            //5.如果到目标值的位置,停止
            if (cur >= target) {
                cur = target;
                clearInterval(timer);
            }
            //3.设置图片的位置
            elem.style[attr] = cur + "px";
        }, 30)
    }

2.4 条件判断问题

  • 问题:只有一个方向有作用,另一个方向直接闪现

  • 解决:判断加并且条件

    function move(elem,attr,step,target) {
        clearInterval(timer);
        timer = setInterval(function () {
            //4.获取现有位置 +10
            var cur = parseInt(getStyle(elem, attr)) + step;
    
            //5.到达目标点停止定时器
            if ((cur >= target && step > 0) || (cur <= target && step < 0)) { //起飞
                cur = target;
                clearInterval(timer);
            }
    
            //3.设置图片的位置
            elem.style[attr] = cur + "px";
        }, 30)
    }

2.5 步长问题

  • 问题:需要用户考虑步长正负,用户体验不好

  • 解决:只给步长值,正负在函数中确定

    function move(elem,attr,step,target) {
        //判断步长正负   当前值0    目标值1000   +   
        step = parseInt(getStyle(elem, attr)) < target ? step : -step;
        clearInterval(timer);
        timer = setInterval(function () {
            //4.获取现有位置 +10
            var cur = parseInt(getStyle(elem, attr)) + step;
    
            //5.到达目标点停止定时器
            if ((cur >= target && step > 0) || (cur <= target && step < 0)) { //起飞
                cur = target;
                clearInterval(timer);
            }
    
            //3.设置图片的位置
            elem.style[attr] = cur + "px";
        }, 30)
    }

3.轮播图

3.1 轮播图布局

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值