【问题标题】:bxslider isn't displaying images until page resize with responsive design在使用响应式设计调整页面大小之前,bxslider 不会显示图像
【发布时间】:2016-12-12 11:19:49
【问题描述】:

我正在尝试在响应式页面(使用 Bootstrap)上实现 bxslider,并且在前 2 或 3 次它正确显示图像。然而,在那之后它只显示一个狭窄的白色带:

如果我调整浏览器的大小,那么 bxSlider 会正确调整大小并显示图像。

我的部分代码包含以下代码(注意,这会填充一个 div 作为 AJAX 调用的结果)

<ul class="product-view-bxslider">
  <% @product.images.each do |image| %>
      <li><%= image_tag image.image.url %></li>
  <% end %>
</ul>

<script>
  $(document).ready(function(){
    console.log('slider initialising');
    $('.product-view-bxslider').bxSlider({
      onSliderLoad: function(){
        console.log('finished loading');
      }
    });
  });
</script>

bxslider 设置工作正常,因为我总是得到预期的输出到控制台。

我已经在 Safari、Chrome 和 Firefox 中复制了这种行为。

根据我的搜索结果,大多数在使用 bxslider 时遇到过调整大小问题的人调整浏览器大小时遇到​​问题,而不是在初始加载时。

编辑

为 bxslider 的布局设置初始固定高度一次显示所有图像(包括 2 个额外的 - 我假设它们用于缓冲导航)。同样,只有浏览器调整大小会强制 bxslider 调整大小并正确显示。

.bx-viewport.bx-viewport {
  min-height: 90px;
}

这表明问题可能不是我最初认为的那样,是响应式布局行为不当造成的。

也许以下信息与这个问题有关。我正在使用 Rails,我之前发布的页面是 AJAX 调用 ProductsController#show 操作的结果。这里似乎没有发生任何深奥的事情:

ProductsController#show

  def show
  end

show.js.erb

  $('#product-details').html("<%= escape_javascript(render 'products/show') %>")

_show.html.erb

在问题开始时发布

调用

<%= link_to 'Show', product, remote: true %>

【问题讨论】:

  • 是的,这是一个已知问题。为什么要调整浏览器大小?
  • 这就是重点……我不想调整浏览器的大小以使其正常工作。我遇到了图像显示直到我调整浏览器大小的问题。
  • 哦,拍摄...是的,您可以尝试触发$(window).trigger("resize") 操作吗?
  • 所以当你的 Ajax 调用返回时触发 bxSlider 调用,而不是在页面加载时。或者在 Ajax 代码完成并填充数据时触发调整大小事件。
  • @epascarello - 为了清楚起见,我正在使用 Rails 并通过使用remote: true 的链接简单地调用我的操作来让它处理 AJAX。服务器端我只是渲染一个 js.erb 页面,其中包含以下$('#product-details').html("&lt;%= escape_javascript(render 'products/show') %&gt;")。我不认为问题出在这不是吗?也许我找错地方了——我怀疑响应式设计是罪魁祸首。

标签: jquery html ruby-on-rails twitter-bootstrap bxslider


【解决方案1】:

当第一张幻灯片有视频时,我的项目就会发生这种情况。如果初始计算.bx-viewport 的时间过长,bxSlider 有时会达到一个奇怪的默认高度。通常,它会在刷新甚至幻灯片转换时重新加载正确的高度。试试这个:

.bx-viewport.bx-viewport {
   min-height: 90vh;
}

根据您的具体需求调整值,但我建议您使用固有或绝对的度量单位,例如 vh 或 px,并避免使用百分比或 em 等相对度量。

另一个修复与前一个类似,但违反直觉:

`$('.bx-viewport`).height(0).css('min-height', '80vh')`;

@David 通过使用与我相反的方法找到了解决方案,这表明他的网站对 bxSlider 的负担比我的要少。 bxSlider 不会在每次加载错误或超时时挂起,它倾向于继续并开始制作快捷方式。不幸的是,.bx-viewport 的高度计算是常见的快捷方式受害者,导致 bxSlider (.bx-viewport {height:0}) 变窄。

`$('.bx-viewport').css('height', '');

这个和以前的技术将“唤醒” bxSlider 重新计算.viewport 高度。两者都做同样的事情,但里程因用户而异。

【讨论】:

  • 感谢您的回复,很遗憾这也不起作用。它显示所有图像,并且过渡不会导致重新计算高度。再次调整浏览器的大小会强制执行正确的行为……但是这提供了一些见解……这表明响应式布局表现不佳不是问题。
  • 还有另一种唤醒 bxSlider 的方法,请参阅帖子底部的更新。
  • 该代码确实生效,但不幸的是它的行为与以前相同 - 由于这种见解,我更新了我的问题。
  • hmm 奇怪 - 在受到您的回答的启发后,我开始在浏览器中玩,发现问题似乎与 height:0px;bx-viewport 类有关。将以下内容添加到
  • @David Great 我很高兴你解决了你的问题,我很高兴 bxSlider 变得更加可预测。答案已更新,先生。快乐编码。 :)
【解决方案2】:

出于好奇,这可能有效。

$(function () {
  // Your code.
  $(element).bxSlider({
    // options.
  });
  // Add this.
  $(window).trigger("resize");
});

所以,你需要做的就是,在 bxSlider 加载之后添加这个小代码:

$('.product-view-bxslider').bxSlider({
  onSliderLoad: function(){
    console.log('finished loading');
  }
});
// Add this.
$(window).trigger("resize");

【讨论】:

  • 试过了,不幸的是它不起作用——进一步阅读我发现了以下信息:jQuery 的触发器实际上并没有触发原生的“resize”事件——它只是触发已绑定的调整大小事件。不过谢谢你的建议。
  • 感谢@David 提供的信息... 看看我还能做些什么。
猜你喜欢
  • 1970-01-01
  • 2012-08-16
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多