【问题标题】:Clear splash animation javascript returns undefined清除飞溅动画javascript返回未定义
【发布时间】:2012-11-05 23:53:18
【问题描述】:

我的清晰动画有效,我的显示动画有效,但是当我尝试做一个然后另一个时,它似乎使所有编程都无效。我确信有一个我没有看到的简单论点。

var opac = null;

var removeGif = document.getElementById('splash');
function dissappear (elem, speed) {
    if (opac) clearTimeout(opac);
    if ( !elem.style.opacity ) {
        elem.style.opacity = 1;
    }
    setTimeout(function() {
        setInterval(function() {
        elem.style.opacity -= 1;
        }, speed / 50);
    },10);
}
dissappear(removeGif, 250000);

var folio = document.getElementById('content');
function appear (elem, speed) {
    if (opac) clearTimeout(opac);
    if ( !elem.style.opacity ) {
        elem.style.opacity = 0;
    }
    setTimeout(function() {
        setInterval(function() {
        elem.style.opacity += 1;
        }, speed / 50);
    },10);
}
appear(removeGif, 250000);

如果有人能看到问题,请告诉我。

【问题讨论】:

  • 您永远不会将setTimeout 的结果分配给opac,因此opac 将始终为null。你应该在那里做一些不同的事情吗?
  • 如果您尝试为元素“消失”和“出现”设置动画,为什么要将不透明度增加/减少1 - 不透明度的值可以是从0 到@ 的任意值987654328@,所以你可能想要一个更小的值。而且我不确定您对setIntervals 的处理是否正确-它们将永远运行,因为您永远不会清除它们。正如 Cory 指出的那样,这根本不应该工作,因为你实际上并没有在任何地方设置opac。如果你设置opac,那么它会起作用,但它会是一闪而过的消失,而不是渐进的。
  • 我希望交换在 250000 毫秒后立即进行,因此没有褪色是没有问题的。我什至需要间隔或超时吗?
  • @horribly_n00bie:如果您不想要“淡入淡出”效果,则不需要间隔。您可能也不需要超时,只需快速连续运行三个步骤:(1) 获取对启动画面和内容的引用,(2) 隐藏启动画面,然后 (3) 显示内容。如果它看起来闪烁太剧烈,您将不得不决定该怎么做。

标签: javascript animation opacity splash-screen


【解决方案1】:

我看到了一些可能有问题的事情:

  1. 您永远不会将setTimeout 的结果分配给opac,因此opac 将始终为null

    opac = setTimeout(function() {
               ...
           });
    
  2. appear(),这段代码对我来说没有意义:

    if ( !elem.style.opacity ) {
        elem.style.opacity = 0;
    }
    

    elem.style.opacity 可以为空吗?如果是这样,那没关系。如果不透明度为0!elem.style.opacity 也将为真,因此无需将其重置为 0。

    您不想检查元素是否已经可见,然后退出函数而不是先使其不可见吗?

  3. 正如Ian 所说,不透明度值的范围是从 0 到 1 作为十进制值,而不是百分比值。考虑将增量和减量更改为 0.1 之类的值。

  4. 您的setInterval() 函数将永远不会停止运行。你永远不会有任何对应的clearInterval()。您也不会检查不透明度是 0 还是 1 来知道何时调用 clearInterval()

一个简单的淡入/淡出实现不需要setTimeout。一个工作示例looks more like this

【讨论】:

  • 也许检查if (elem.style.opacity) 是有意义的,如果是,则将其设置为0。但我什至不认为这是有道理的。如果它在不透明度范围的中间,让它从那个值开始“出现” - 不需要重置它。
  • 嗯,内容不透明度应该从 0 开始变为 1,同时飞溅从不透明度 1 变为 0。因此它具有飞溅动画变成内容的错觉。
【解决方案2】:

感谢您的意见,帮助我使我的代码不那么迂回。这是我最终得到的代码。

window.setTimeout(function toggle () {
    var spl = document.getElementById('splash');
    var cnt = document.getElementById('content');
        spl.style.display = "none";
        cnt.style.display = "block";
}, 25000);

现在一切看起来都那么简单!

【讨论】:

  • 仅供参考:您甚至不需要(也不应该)为您的函数命名:window.setTimeout(function() { /* do work */ }, 25000);
  • 跟进...实际上,您可能应该做的是将toggle() 定义为常规函数,然后将您的代码简化为:window.setTimeout(toggle, 25000);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
相关资源
最近更新 更多