【问题标题】:JQuery: Fade in after fading out multiple objects results in flickerJQuery:淡出多个对象后淡入导致闪烁
【发布时间】:2012-04-23 16:58:00
【问题描述】:

对于这个项目,我有一个框 (div),其中包含一些静态内容(包括选项卡)和可以在各种条件下更改的内容(单击、悬停和计时器)。这些动态内容视图中的每一个都位于一个单独的 div 中。

我正在尝试编写一个可以处理所有这些情况的函数,包括页面的初始加载,因为所有动态内容最初都是用 css 隐藏的。此函数采用父框,必须对其进行修改以跟踪事物,以及我希望更改为的视图。

所以,我首先淡出所有视图,以确保没有任何内容,然后淡入新视图。我很快意识到回调没有按顺序工作,所以我遇到了 promise() 函数。不幸的是,这会在我尝试过的每个浏览器(IE、Chrome 和 Firefox)中产生闪烁。在 Chrome 中,它只是偶尔出现,但在其他版本中,它几乎是恒定的。

$(container).children('.content_view').fadeOut(transition);
$(container).children('.content_view').promise().done(function() {
    $(next).fadeIn(transition);
});

目前,这就是我的代码的业务端。有没有更好的方法来做到这一点,或者有什么方法可以消除闪烁?不幸的是,这个页面大多会在行为不端的浏览器中查看。

在玩弄了延迟之后,我怀疑问题是时间问题。一个元素的过早删除,或者另一个元素的出现,会导致我的布局暂时改变,直到达到最终布局。我怀疑 promise() 函数实现了这样的延迟。

编辑:

我找到了一个似乎对我很有效的解决方案。由于我最初的淡出是为了处理多个视图以某种方式变得不隐藏的事件(由于其他原因,这种情况经常发生,使用 mouseenter 和 mouseleave 而不是 mouseover 和 mouseout)我决定尝试立即杀死会更好任何正在从以前的通话中消失的东西,然后做我的常规褪色:

$(container).children('.content_view').filter(function(){return ($(this).css('opacity') < 1)}).each(function() {
    $(this).stop();
    $(this).css('opacity',0);
    $(this).css('hidden','none');
});

if ($(container).children('.content_view').filter(function(){return ($(this).css('display') != 'none');}).length > 0)
    $(container).children('.content_view').filter(function(){return ($this.css('display') != 'none';}).fadeOut(transition, function() {
    $(content).fadeIn(transition);
});
else
    $(content).fadeIn(transition);

希望这是有道理的。我以前不知道过滤器功能。很方便:)

请注意,在我的情况下,这是有效的,因为这是交换任何内容的唯一方式,并且它只会在每次调用结束时让一个元素树完全可见(或到达那里)。如果下一个还没有完成显示,它会立即被杀死并替换。

【问题讨论】:

  • 你能组装一个 JSFiddle 来复制这个吗?
  • 我正在尝试。哦亲爱的。似乎崩溃了很多:P

标签: jquery fadein fadeout promise


【解决方案1】:

这应该可行:

$(container).children('.content_view').fadeOut(transition, function() {
    $(next).fadeIn(transition);
});

然后试试:

$(container).children('.content_view').each(function(){
    $(this).fadeOut(transition, function() {
        $(next).fadeIn(transition);
    });
});

不过,最好的解决方案可能是使用 CSS 过渡。有这种可能吗?这必须在什么浏览器上工作?

【讨论】:

  • 这是我的第一个想法,但是由于选择器匹配多个元素,所以立即执行回调函数。
  • 好的,我添加了一些其他内容。哪个选择器有问题? .content_view 还是 $(next)?
  • $(next) 只是我传入的对象。它代表我希望插入的根元素。该元素属于 content_view 类,我可以选择的所有其他视图也是如此。此处的第二种解决方案会产生一种奇怪的闪烁效果,该效果与初始淡入淡出重叠。第三个也是如此,但似乎将内容视图留在那里我从未要求过。我假设 next() 移动到下一个兄弟节点?这可能会导致这种行为
  • 对,离开 .next() 解决方案,只是因为我不确定下一步是什么
  • 我之前确实尝试过为它制作动画,但它从来没有成功过。根据文档,如果它在多个元素上运行,则将为每个元素调用一次回调。那么,我不会像以前一样得到闪光效果吗?我明天会尝试,无论如何都会告诉你。
猜你喜欢
  • 1970-01-01
  • 2014-10-02
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 2012-09-05
  • 2019-07-31
  • 2016-01-30
  • 1970-01-01
相关资源
最近更新 更多