【问题标题】:CSS animation pop-in after pop-out in again conflicts with eachotherCSS动画在弹出后再次弹出相互冲突
【发布时间】:2017-05-03 20:06:28
【问题描述】:

我遇到了一个我没想到会发生的特殊问题。 Here is a codepen 的情况。是这样的:

我有一个隐藏的 div,它会在单击按钮时弹出,并在关闭后弹出“in”。这是通过 jQuery 显示/隐藏来处理的。对于 UX,我想通过 CSS 添加一个微妙的弹出动画。我添加了以下内容:

.popout { animation: popout .2s ease;}
.popin  { animation: popin .2s ease;}

@keyframes popout {
    from {transform:scale(0)}
    90%  {transform:scale(1.1)}
    to   {transform:scale(1)}
}
@keyframes popin {
    from {transform:scale(1)}
    10%  {transform:scale(1.1)}
    to   {transform:scale(0)}
}

现在动画工作正常,但在关闭弹出窗口(添加 popin 类)后,它恢复到默认的 css 状态,这是可见的。所以结果是你看到弹出窗口缩小,然后再次出现并停留。 我可以通过在 CSS 动画调用中添加 forwards 来“修复”这个问题,但这会强制动画继续进行,而不管其他点击如何。换句话说;如果我将 forwards 添加到 CSS 动画中,它会保持隐藏状态,但在您再次打开它时不会显示(因为 forwards 仍然处于活动状态)。

我再次参考the Codepen,您可以在其中查看并亲自尝试。如果将forwards 添加到.popin 类中,关闭后它会保持隐藏状态,但无法再次打开。

所以我想知道我的思维过程哪里出错了;我们是否能够“覆盖”或“停止”forwards 设置?我错过了一些明显的东西吗?或者这不是这样做的方法,我应该研究一下 jQuery 动画吗?

【问题讨论】:

  • 哇哦,这么简单啊。你所做的只是添加超时?我之前想过,但我认为如果动画滞后或长度发生变化,它可能会给隐藏它的固定超时带来问题。
  • 点击关闭时忘记隐藏弹出窗口,必须添加$('popup').hide();
  • 你可以使用 jquery fadeIn 和 fadeOut 函数来实现。它更容易。例如:$("popup").fadeIn("slow")
  • @AlexTimmer 我认为这不会造成任何问题

标签: jquery css animation


【解决方案1】:

首先,当您添加 popin/popout 类时,您并没有删除旧的类,因此最终会在元素上同时使用这两个类,这使得控制变得更加困难(如果不是不可能的话)。

$('.open').click(function() {
    //...
    $('popup').removeClass('popin').addClass('popout');
});

$('.close').click(function() {
    //...
    $('popup').removeClass('popout').addClass('popin');
})

此外,您需要考虑到,一旦动画结束,元素将恢复为适用于其的任何 CSS 规则。因此,如果您希望它们持久存在,则需要将 scale() 转换添加到类定义中:

.popout { 
    /* ... */
    transform: scale(1);
}
.popin  { 
    /* ... */
    transform: scale(0);
}

工作示例:https://codepen.io/anon/pen/Emvjaj


旁注:建议您只使用一个按钮并处理您正在调用的函数内的状态更改,而不是让两个按钮根据状态相互替换。在进行切换时,某些浏览器/设备可能会触发点击这两个按钮。一键更安全。

【讨论】:

  • 只是为了澄清;我确实忘记删除类 onclick,但在实际生产环境中确实有。仅此一项并不能解决问题。但是,将比例添加到课程中确实如此 :) 似乎这是我错过的一根稻草。但是它仍然无法在我的生产环境中工作,我打赌这最终将成为解决方案。
  • @AlexTimmer 有机会看看吗?我可能会发现你错过的东西。另外,请确保您没有启用任何 cache。当急于应用修复时,我们可能会忘记禁用/清除 cache 发生在我们所有人身上。 :)
  • 是的,我知道,我已经在这个项目上工作了几个月了——我知道它会怎么做;)谢谢你的提议,但这不是必需的;我很确定这与当前的战区有关,即我的 jquery 代码遍布整个系统(Magento)。我会弄清楚的:)并进一步澄清;该 codepen 只是这种情况的“演示”;生产现场有完全不同的触发器等等。
  • @Alex,不客气。请参阅添加的旁注。我在 linux 机器上,在 chrome 上,有时它会触发点击两个按钮。只需创建一个togglePopup() 函数并在其中使用if
  • @AlexTimmer 下面是我简化它的方法:codepen.io/anon/pen/OmjVor
【解决方案2】:

我已经在 codepen 中测试了您的示例, 通过简单地删除替代类并保留前向填充属性,您的代码似乎工作得很好。

【讨论】:

  • 如上面在其他 cmets 中所述,我确实在我的实际生产环境中删除了备用类,在这种情况下,简单地向两者添加转发也不起作用。但是很高兴听到在简单的用例中,这会起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 2013-08-23
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多