当前位置: 首页 > 知识库问答 >
问题:

javascript - css(display:none)在为何在隐藏后又显示?

越源
2024-07-19

$('#abc').addClass('slideout').removeClass('slidein').delay(200).css('display','none');

执行以上语句,slideout 效果显示了,但是 display:none 也执行了,但后又显示了。。。

.slidein .major {
  -webkit-animation: fcl-in 200ms linear;
          animation: fcl-in 200ms linear;
}
.slideout {
  -webkit-animation: slideout-null 200ms;
          animation: slideout-null 200ms;
}
.slideout .major {
  -webkit-animation: fcl-out 200ms linear;
          animation: fcl-out 200ms linear;
}

@keyframes fcl-in {
  from {
    -webkit-transform: translate3d(100%, 0, 0);
    transform: translate3d(100%, 0, 0);
  }
  to {
    -webkit-transform: translate3d(0, 0, 0);
    transform: translate3d(0, 0, 0);
  }
}

@keyframes fcl-out {
  from {
    -webkit-transform: translate3d(0, 0, 0);
    transform: translate3d(0, 0, 0);
  }
  to {
    -webkit-transform: translate3d(100%, 0, 0);
    transform: translate3d(100%, 0, 0);
  }
}

@keyframes slideout-null {
  0% {
    opacity: 1;
  }
  100% {
    opacity: 1;
  }
}

共有1个答案

邵伟泽
2024-07-19

解答

在 jQuery 中,.delay() 方法仅适用于队列中的动画效果,而不是对 .css() 这样的非动画效果。当你链式调用 .delay(200).css('display','none'); 时,.delay() 实际上并没有对 .css('display','none') 起作用,因为 .css() 不属于动画队列。

在你的例子中,.addClass('slideout') 触发了动画,但紧接着的 .delay(200) 并没有等待动画完成,而是立即执行了 .css('display','none')。然而,由于 .css('display','none') 是在动画开始后立即设置的,它可能会立即隐藏元素,但这之后,动画可能仍在执行其动画帧(尽管元素已不可见),并且在动画完成后,如果有其他代码(例如动画完成后的回调函数)试图改变元素的显示状态,那么元素可能会再次显示。

解决方案

你可以使用动画的完成回调函数来确保在动画结束后才设置 display: none。但是,因为 .addClass() 不提供直接的回调,你可能需要使用 .animate()(即使你不需要动画效果)或者监听动画结束事件。

以下是一个使用 .animate() 的示例,尽管我们实际上并不改变任何属性,只是利用 .animate() 的回调函数:

$('#abc')
  .addClass('slideout')
  .removeClass('slidein')
  .animate({ opacity: 1 }, { // 使用一个不会改变任何东西的动画
    duration: 200,
    complete: function() {
      // 动画完成后,设置 display: none
      $(this).css('display', 'none');
    }
  });

或者,如果你使用的是 CSS 动画,并且想要监听动画结束事件,你可以这样做:

$('#abc')
  .one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function() {
    // 动画结束后,设置 display: none
    $(this).css('display', 'none');
  })
  .addClass('slideout')
  .removeClass('slidein');

在这个例子中,.one() 方法用于绑定一个一次性的事件处理器,它会在 CSS 动画结束时触发,并设置 display: none。注意,这里使用了多个浏览器前缀来确保在所有浏览器中都能正常工作。

 类似资料:
  • 问题内容: 按下后如何隐藏“编辑”链接?当我按下编辑键时,是否还可以隐藏“ lorem ipsum”文本? 问题答案:

  • 问题内容: 页面加载后5秒钟是否可以隐藏元素? 我想做完全相同的事情,但希望通过CSS过渡获得相同的结果。 有什么创意吗?还是我问的问题超出了CSS过渡/动画的限制? 问题答案: 但是您无法以可能立即想到的方式进行操作,因为您无法为原本依赖的属性(例如,或更改尺寸和设置为)设置动画或创建过渡,以正确隐藏元素和防止其占用可见空间。 因此,为有问题的元素创建一个动画,并在5秒后进行切换,同时还将高度和

  • 问题内容: 在我的脚本中有三个div。我想在第一行悬停时显示div ,而在第二行悬停时显示。否则,我想默认显示div 。 但它永远不会显示带有的div 。 问题答案: 你需要 原始CSS中的问题是in css选择器启动了一个全新的选择器。它没有结合..所以意味着和。您将其设置为始终对所有元素都隐藏。

  • 有很多这样的词:test1test2test3test4test5test6test7test8test9test10test11。。。 每个单词都与多个例句相关联。我希望它们在光标覆盖单词之前被隐藏。这是我的代码。 演示:https://jsfiddle.net/kyubyong/umxf19vo/ HTML: CSS 问题是,当原始行不止一行时,例句块覆盖了底线中的单词。我想把它们写下来,这样

  • 乍一看,我试图做一些相当简单的事情,但我做不到。我有一个按钮和两个隐藏的div。按下按钮时,我希望第一个div显示,n秒后隐藏,然后第二个div显示。 HTML: 包含JS的完整代码如下所示:https://jsfiddle.net/439xbfe5/ 我已经在这里检查了答案:jQuery显示5秒钟,然后隐藏 这个代码的问题是#div2在#div1消失之前出现: 同样的问题: 我还尝试创建一个阻塞

  • 问题内容: 对于我正在做的网站,我想加载一个div,然后隐藏另一个,然后有两个按钮可以使用JavaScript在div之间切换视图。 这是我当前的代码 替换div2的第二个功能不起作用,但第一个功能起作用。 问题答案: 如何显示或隐藏元素: 为了显示或隐藏元素,请操纵元素的style属性。在大多数情况下,您可能只想更改元素的属性: 或者,如果您仍然希望元素占用空间(例如,如果您要隐藏表格单元格),