JavaScript中setTimeout()和setInterval()的执行

问题描述:

在做百度前端技术学院的一个问题时,需要使用js实现一个div盒子的淡入淡出效果,这里可以使用setInterval函数没隔一段时间将div的opacity从0递增到1或者从1递增到0。第二个效果是在进行淡入或者淡出时,按钮不能被点击,可以通过设置按钮的disabled属性来实现。

遇到问题:
  1. 在对opacity进行增加或者减少时,刚开始写的是div.style.opacity += 0.05;后来发现无法实现opacity的增加和减少,原因是opacity的数据类型是string,所以这样增加一个Number是不对的。我们可以设一个num,让num递增和递减,并每次都使用改变的num为opacity赋值,实现相同的效果(为opacity赋值时可以使用Number类型而不是String类型,好像是这样)。
  2. 在进行第二个效果时,刚开始是在setInterval函数之前和之后分别使用button.disabled = true; button.disabled = false;,实际运行发现无法得到应有效果,原来是在setInterval()之后,后面的语句会直接执行,不能等着setInterval()执行结束再执行,setTimeout()也是如此。这个问题之前是知道的,当时忘了。所以我们只需要在setInterval()函数内部停止函数时将按钮恢复。
代码如下:
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">    
    <title>IFE ECMAScript</title>
</head>
<body>            
    <div id="fade-obj" style="width:300px;height:300px;background:#000"></div>
    <button id="fade-btn">淡出</button>

    <script>
    let fadeObj = document.querySelector("#fade-obj");
    let fadeBtn = document.querySelector("#fade-btn");

    function fadeProcess(mode) {
        let btn = document.querySelector("#fade-btn");
        fadeBtn.disabled = true;
        //淡入
        if (mode == 0) {    
            let num = 0;
            fadeId = setInterval(() => {
                num += 5;
                fadeObj.style.opacity = num/100;
                if (fadeObj.style.opacity == 1) {
                    clearInterval(fadeId);
                    fadeBtn.disabled = false;
                    fadeBtn.innerHTML = "淡出";
                }
            }, 50);
        }
        //淡出
        else {
            let num = 100;
            fadeId = setInterval(() => {
                num -= 5;
                fadeObj.style.opacity = num/100;
                if (fadeObj.style.opacity == 0) {
                    clearInterval(fadeId);
                    fadeBtn.disabled = false;
                    fadeBtn.innerHTML = "淡入";
                }
            }, 50);
        }
    }
    fadeBtn.onclick = function() {
        if (this.innerHTML == "淡出") {
            fadeProcess(1);
        }
        else {
            fadeProcess(0);
        }
    }
    </script>
</body>
</html>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值