【问题标题】:Weird flicker in jQuery togglejQuery切换中的奇怪闪烁
【发布时间】:2015-10-30 13:18:07
【问题描述】:

我有一个奇怪的问题,无论我尝试什么都找不到解决方案。 我有一个简单的菜单,可以切换几个 div(向上/向下滑动),如下所示:

    <div class="navigation">
        <ul class="left">
            <li><a href="#lorem1" class="menu">lorem1</a></li>
            <li><a href="#lorem2" class="menu">lorem2</a></li>
            <li><a href="#lorem3" class="menu">lorem3</a></li>
        </ul>       
    </div>

还有一些正在切换的div。很简单,但是代码很多,所以我不会在这里粘贴。

使其工作的脚本是:

$('.navigation a').click(function() {
  var $requested = $(this.getAttribute('href'));
  $('.top-drawer').not($requested).slideUp('slow');
  $requested.slideToggle('slow')
});

一旦用户点击链接,div 会向下滑动超过应有的高度,闪烁,然后变为实际高度(应该是高度)。

这是Fiddle。请确保“结果”窗口的宽度至少为 1000+ 像素,否则将无法正常工作(不会显示错误)。

【问题讨论】:

  • 我不知道答案,但我有一个观察结果:如果您将“慢”替换为 5000(5 秒)之类的数字,您可以更好地了解正在发生的事情。在我看来,当两个移动的东西彼此相邻时,jQuery 并没有处理这种情况。
  • 这是一个常见问题,并且(90% 的时间)归结为某些 CSS 属性。检查这些问题之类的快速建议:stackoverflow.com/questions/14420315/…
  • 你的小提琴对我来说似乎运行良好......我没有看到任何闪烁。
  • 我删除了你所有的display css 样式,现在它工作正常,可能发生的是你正在使用浮动和显示块,并且当高度发生变化时,元素会四处移动以适应这会导致向下滑动/向上滑动的 div 的高度随机变化。你需要处理你的 CSS 来解决这个问题:(

标签: javascript jquery


【解决方案1】:

查看我对此JSFIDDLE的建议

这里解释一下那里的变化:

问题

由于每个.top-drawer 中的所有这些浮动元素,jQuery 在计算div 的高度时存在很多问题,因为元素会在上下滑动时四处移动。

建议

改用inline-block。但是为了让你的 CSS 工作,特别是每个 .top-drawer 上的填充,你需要在任何使用 paddinginline-blockwidth 的东西上使用 box-sizing: border-box;%。如果好奇,您可以阅读此HERE

新问题

如果你走inline-block 的路线(现在是最佳实践)。您将需要使用 jQuery 1.8.xx 或更高版本。我注意到在您的小提琴中您使用的是 1.7.2,它有一个带有 border-box 的错误,该错误已在之后的版本中修复。

【讨论】:

    【解决方案2】:

    尝试理解您正在使用的代码。
    这就是我认为 jQuery 的 slideUp()slideDown() 的工作方式;主要是算法改变了元素的heightheight之后的display等于元素的height或者为“0”。

    因此,当您将元素的 position 设置为 relative 时,您会看到所谓的“闪烁”,特别是当您在同一位置有多个元素时。当您使用fadeIn()fadeOut() 等时,您还会看到这些“闪烁”,因为元素的display 在这些情况下不会立即设置为“无”或任何可见的,而是在动画完成之后。

    解决方案:

    将元素的位置设置为绝对位置。那应该可以解决您的问题; example.

    【讨论】:

    • 感谢帮助,但是一旦div滑动,主导航需要向下推,这种情况下我不能使用绝对定位
    • 我只是将导航的位置设置为absolute,以创建一个简单的示例。主要焦点是您上下滑动的元素。如果您总是希望导航位于divs 下方、顶部或任何位置,您可以在任何地方拥有它,并使用 CSS 以您想要的方式对其进行样式设置。该示例旨在帮助您解决问题中的问题,其他一切都只是示例。希望答案对您有所帮助。
    猜你喜欢
    • 2011-01-26
    • 2011-01-06
    • 2013-02-12
    • 2012-04-25
    • 2014-09-07
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多