使用javascript计时器更改潜水的不透明度

Changing Opacity of Div With javascript timer

本文关键字:潜水 不透明度 javascript 计时器 使用      更新时间:2023-09-26

嘿,伙计们,这个问题的解决方案应该很简单,但我很难弄清楚发生了什么。我有一个timerScript.js文件,看起来像这个

//global variables
var timerInterval = null; // the timer that changes opacity every 0.1 seconds.      
function StartTimer() 
{
    //disable the button
    document.getElementById('startOpacityTimerButton').disabled=true;
    timerInterval = window.setInterval(ChangeOpacity(), 100);
}
function StopTimer() 
{
    window.clearInterval(timerInterval);
    timerInterval = 0;
}
function ChangeOpacity() 
{
    var object = document.getElementById('opacityZone');
    var currentOpacity  = (+object.style.opacity);
    var newOpacity = currentOpacity + 0.1;
    object.style.opacity = newOpacity;
    if(newOpacity == 1.0)
    {StopTimer();}
}

这就是我的代码应该做的

  1. 单击按钮->调用StartTimer
  2. StartTimer->禁用按钮,每100毫秒调用一次ChangeOpacity
  3. ChangeOpacity->获取div元素(opacityZone),获取其当前的不透明度,递增0.1,并检查它是否处于最大不透明度,在这种情况下,它调用StopTimer
  4. StopTimer->清除计时器

它的作用如下:计时器启动,将不透明度更改为0.1,然后似乎停止了!?!

我试着用safari Web Inspector进行调试,但我不太确定发生了什么,也许你们中的一位JavaScript专家可以帮我(我是js的一个noob)。谢谢

您的问题在这里:

window.setInterval(ChangeOpacity(), 100);

现在,您不再传递对函数的引用,而是内联执行它并调度它的返回值。更改为:

window.setInterval(ChangeOpacity, 100);

除此之外,像这样的东西你应该真正使用CSS转换。

谢谢大家,我来看看建议。我只是为了学习语言而尝试使用JavaScript,下面是我为解决这个问题而想出的JavaScript函数。

//global variables
var opacityIncreasing; //boolean to know if opacity is increasing or decreasing.
var animationInterval;//time in millseconds to do animation.    
var timerInterval;//the timer that changes opacity depending on interval.   
var object;//object we are doing the animation on.
var currentOpacity;//currentOpacity of object.
//var buttonMessage;//message to make object appear or dissapear depending on animation.
function init(elementName,rateOfAnimation)
{
    var object = document.getElementById(elementName);
    animationInterval = rateOfAnimation;
    currentOpacity = Truncate((+object.style.opacity),1);
    document.getElementById('messageContainer').innerHTML=currentOpacity;
    if (currentOpacity==0)
    {
        opacityIncreasing = true;
    }
    else 
    {
        opacityIncreasing = false;
    }
    StartTimer();
}
function StartTimer() 
{
    //disable the button
    document.getElementById('startOpacityTimerButton').disabled=true;
    timerInterval = window.setInterval(ChangeOpacity, animationInterval);
}
function StopTimer() 
{
    window.clearInterval(timerInterval);
    timerInterval = 0;
    //enable Button
    document.getElementById('startOpacityTimerButton').disabled=false;
}
function Truncate (number, digits) 
{
        var multiplier = Math.pow(10, digits),
        adjustedNum = number * multiplier,
        truncatedNum = Math[adjustedNum < 0 ? 'ceil' : 'floor'](adjustedNum);
    return truncatedNum / multiplier;
}
function ChangeOpacity() 
{
    var object = document.getElementById('opacityZone');
    var stringOpValue = "";
    if(opacityIncreasing)
    {
        currentOpacity += 1/10;
        stringOpValue = String(currentOpacity.toFixed(1)); 
        object.setAttribute("style","opacity:"+currentOpacity+"; -moz-opacity:"+currentOpacity+";");//  filter:alpha(opacity="++")");
        document.getElementById('messageContainer').innerHTML= stringOpValue;
        if(currentOpacity.toFixed(1) == 1.0)
        {
            document.getElementById('startOpacityTimerButton').value = "Disappear";
            StopTimer();
        }
    }
    else 
    {
        currentOpacity -= 1/10;
        stringOpValue = String(currentOpacity.toFixed(1)); 
        object.setAttribute("style","opacity:"+currentOpacity+"; -moz-opacity:"+currentOpacity+";");//  filter:alpha(opacity="++")");
        document.getElementById('messageContainer').innerHTML= stringOpValue;
        if(currentOpacity.toFixed(1) == 0.0)
        {
            document.getElementById('startOpacityTimerButton').value = "Appear";
            StopTimer();
        }

    }
}

这是HTML和CSS

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta http-equiv="X-UA-Compatible" content="chrome=1">
        <meta charset="utf-8">
        <title>Opacity Test</title>
        <style>
            body
            {
                text-align: center; 
            }
            #opacityZone
            {
                width: 350px;
                height: 25px;
                background-color: #F50;
                text-align: center;
                margin:0 auto;
                margin-top: 10px;
                margin-bottom: 10px;
                padding-top: 5px;
                /*opacity number between 0.0 and 1.0*/
                opacity: 0.0;
            }
            #messageContainer
            {
                width: 100px;
                min-height: 100px;
                background-color:red;
                color: white;
                font-weight: bolder;
                font-size: 72px;
                text-align: center;
                margin:0 auto;
                padding-top: 10px;
            }
            .roundedContainer
            {
                -webkit-border-radius: 15px;
                -moz-border-radius: 15px;
                border-radius: 15px,15px,15px,15px;
            }
        </style>
    </head>
    <body>
        <h2>Opacity Test</h2>
        <form>
            <input type="button" id="startOpacityTimerButton" value="Appear" onclick="init('opacityZone',50);" />
        </form>
        <div id="opacityZone">Do you see me?</div>
        <p id="messageContainer" class="roundedContainer"></p>
    </body>
</html>

将函数引用传递给window.setInterval。因此传递ChangeOpacity而不是ChangeOpcity()

timerInterval = window.setInterval(ChangeOpacity, 100);

您是否考虑过使用CSS3转换效果而不是使用JavaScript?就性能而言,它应该更好:

例如:

-webkit-transition: opacity 1s ease-in-out;
-moz-transition: opacity 1s ease-in-out;
-o-transition: opacity 1s ease-in-out;
transition: opacity 1s ease-in-out;

我完全同意上面所有人的说法。只需使用CSS3动画来更改按钮的不透明度。

简单地使用以下内容:

@keyframes opacityChange{
  from {opacity: 0.1}
  to {opacity: 1}
}

您还可以声明更改发生的时间范围。

并通过javascript/jquery向按钮添加一个类。(class="opacityChange")当点击一个新按钮时,一定要删除那个类,这样以后它就可以重新实现到按钮上

但是,为了解决您的特定问题。(如果由于某种原因您不能使用css3)

只需将其添加到更改不透明度功能:

if(newOpacity == 1.0){
  StopTimer();
}else{
  ChangeOpacity();
}

看看你是怎么设置的,这应该有效,除非我在看什么。

我遇到了同样的问题,经过这么长时间的搜索,这就是我的解决方案:

而不是这条线

 var currentOpacity  = (+object.style.opacity);
 var newOpacity = currentOpacity + 0.1;

你必须使用这条线路:

let newOpacity = String(parseInt(window.getComputedStyle(Object).getPropertyValue('opacity'))+0.2))

对于替代答案,你可以这样做(如果你有白色背景:):

      let  i =0 ;
      let interval = setInterval(()=>{
        i+=0.1
        Object.style.color = `rgba(0,0,0,${i})`;
   
      },1000)
      if(Object.style.color === 'rgba(0,0,0,1)')
        clearInterval(interval)
      console.log()