【问题标题】:jQuery carousel in a div with display:none带有显示的 div 中的 jQuery 轮播:无
【发布时间】:2020-12-14 23:03:45
【问题描述】:

我必须在我的网站上使用一个 jQuery 响应式轮播,其中包含 4 个显示的项目,一次滑动一个,等等。关键是:这个轮播被放置在一个带有 display:none 的 div 中,并且它似乎点击了一个按钮使用 slideToggle 脚本(jQuery)。好吧,当 div 出现时,轮播不会显示。没有什么!请注意,如果我删除display:none,轮播将完美显示。我尝试了一堆轮播插件(bxslider、caroufredsel、elastislide、flexslider),所有这些都发生了这个问题。然后……我要疯了!!

不好意思朋友,这里是代码:

HTML(这里是FlexSlider 的情况,但其他插件的代码类似)

<div id="hiddenDiv">
  <div id="hiddenDivInner">
    <div class="flexslider">
      <ul class="slides">
        <li>...</li>
        <li>...</li>
        <li>...</li>
      </ul>
    </div>
  </div>
</div>

CSS

#hiddenDiv{
    display:none;
    padding-bottom:10px;
    background: url("../img/xxx.gif") repeat left bottom #FFFFFF;
}

SCRIPT(从站点复制粘贴。此脚本在$(document).ready 与其他脚本之间。已经尝试删除load 函数)

$(window).load(function() {
  $('.flexslider').flexslider({
    animation: "slide",
    animationLoop: false,
    itemWidth: 300,
    itemMargin: 5,
    minItems: 1,
    maxItems: 4
  });
});


$("#trigger").click(function () {
    $("#hiddenDiv").slideToggle(400, "easeInOutExpo");
});

我提醒您,使用此代码和 否 display:none 每个轮播都可以工作,如果我使用 slideToggle 按钮 (#trigger) 向上然后向下滑动 div。

【问题讨论】:

  • 您确定按钮将显示该 div 的属性设置为阻止?
  • 请出示您的代码。
  • I've tried a bunch of carousel plugin (bxslider, caroufredsel, elastislide, flexslider) and this issue happens for all of them. And then... I'm going crazy!! 这意味着它不是轮播
  • 你能提供你的jquery代码吗。
  • 很可能轮播在初始化时需要可见,这样它才能正确获取动画的高度/宽度。尝试在隐藏之前或在显示之后初始化轮播。

标签: jquery css carousel


【解决方案1】:

通过将 div 放在视口之外来“隐藏”它

#hiddenDiv {
    position:absolute;
    top: -3000px;
}

脚本将能够初始化,因为 div 没有隐藏,但它不会是可见的。

您可以在 onload 或触发器 onclick 中将 display 设置为 none 并将 position 设置为 relative

编辑绝对定位将元素从文档流中移除,因此其行为类似于 display:none。

【讨论】:

  • 嗨 enrico,你能写出这样的代码吗:“你可以在你的 onload 或你的触发器 onclick 中将 display 设置为 none 和 position 为 relative”?我试图在 slideToggle 之前的触发器 onclick 中放置一些代码,但它不起作用。我不确定这样做是否正确。
  • 我在想这样的事情fiddle。这不是一个很好的演示,但看看它是否适用于您的完整实现。
  • 感谢恩里科!我已经在我的工作中尝试过该代码并且不起作用! :( 我正在尝试一些回调函数......我认为这是唯一的方法。
【解决方案2】:

不要使用display: none; 来隐藏您的轮播,而是使用visibility: hidden;

然后当你准备好展示它时,使用visibility: visible;

轮播在初始化时需要其容器具有尺寸。使用display: none;时,维度为零,轮播未正确初始化。

另外,display: none; 将元素从流中取出,visibility: hidden; 将元素保留在原位,但隐藏。这样做的好处是,当你让元素出现时,你周围的内容流不会被打断。

见:https://developer.mozilla.org/en-US/docs/CSS/visibility

我看不到您的所有代码/布局,但不妨试试这样的方法。修改以适应您的布局...

#hiddenDiv{
    visibility: hidden;
}


$("#trigger").click(function () {
    $("#hiddenDiv").css('visibility', 'visible');
});

编辑:

另一种可能性是仅在构造它之后 隐藏它,而不是在初始 CSS 中隐藏它。

$(document).ready(function() {

    $('.flexslider').flexslider({
        animation: "slide",
        animationLoop: false,
        itemWidth: 300,
        itemMargin: 5,
        minItems: 1,
        maxItems: 4
    });

    $("#trigger").click(function () {
        $("#hiddenDiv").slideToggle(400, "easeInOutExpo");
    });

    $("#hiddenDiv").css('display', 'none'); // the very last thing

});

CSS:

#hiddenDiv{
    padding-bottom:10px;
    background: url("../img/xxx.gif") repeat left bottom #FFFFFF;
}

【讨论】:

  • 嗨,闪闪发光。已经尝试了可见性:隐藏,但正如你所说,它保留了 div 的空间,我必须隐藏它。
  • @FredKafka,你别无选择。正如您已经发现的那样,轮播插件都需要在非隐藏的div 中初始化。另一种可能的解决方案...检查我编辑的答案。
  • 嗨!非常感谢,但它不起作用!它不会初始化轮播。它不显示。
  • @FredKafka,再次编辑。删除了 load() 函数,因为它可能不需要。我的解决方案与您所说的代码唯一不同的是,我已经将 display: none 从 CSS 移到了 jQuery 在 DOM 上做的最后一件事。
【解决方案3】:

这是我的解决方案!我觉得是对的!

.hidden{
  visibility: hidden;
  position: absolute;
  width: 300px;
  overflow: hidden;
}

【讨论】:

    猜你喜欢
    • 2016-05-10
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 2017-06-13
    • 2018-05-18
    相关资源
    最近更新 更多