bxslider在加载时计算错误的视口大小

时间:2012-12-05 11:30:07

标签: jquery css bxslider

无论如何,我最近开始使用bxslider,我遇到了问题。

似乎在页面加载时错误地计算了其视口大小,这意味着它在移动设备,平板电脑等上无法正常工作。

奇怪的是,当我调整浏览器窗口的大小(即使只是一个像素)时,视口高度得到正确计算,一切看起来都很好。但是如果我刷新了具有相同高度和宽度的页面,则无法正确计算bx-viewport。

知道为什么会这样吗?

HTML看起来像这样(是的,我知道它可能与它没有任何关系,但仍然):

<ul class="seminars-slider">
    <li>
        <article class="education-article">
            <h3><a href="#"> Sit tincidunt eros massa, lundium ultrices, sit in aliquet velit</a></h3>
            <p>LOL1</p>
            <div class="buttons">
                <a href="#" class="book-button"><span>Book now</span></a>
                <a href="#" class="read-more"><span>Read more</span></a>
            </div>
            <div class="clearall"></div>

        </article>
    <div class="clearall"></div>
    </li>

    // same li
    <li>
        <article class="education-article">
            <h3><a href="#"> Sit tincidunt eros massa, lundium ultrices, sit in aliquet velit</a></h3>
            <p>LOL1</p>
            <div class="buttons">
                <a href="#" class="book-button"><span>Book now</span></a>
                <a href="#" class="read-more"><span>Read more</span></a>
            </div>
            <div class="clearall"></div>

        </article>
    <div class="clearall"></div>
    </li>
</ul>          

js看起来像:

slider=jQuery('.seminars-slider').bxSlider({
    mode: 'vertical',
    controls:false,
    pager:false,
    minSlides:2,
    maxSlides:2,
    moveSlides:1
});

jQuery('.up-control').click(function() {
    slider.goToNextSlide();
});
jQuery('.down-control').click(function() {
    slider.goToPrevSlide();
});

感谢。

6 个答案:

答案 0 :(得分:51)

可能是你太早调用bxSlider函数。如果你是从

调用它

$(document).ready(function() { ... });

请考虑使用

$(window).load(function() { ... });

使用这两个函数之间的区别在于(document).ready等待DOM向用户显示初始状态,而(window).load实际上等待直到所有资源都加载到DOM上。

答案 1 :(得分:7)

您可以使用

slider=jQuery('.seminars-slider').bxSlider({
    mode: 'vertical',
    controls:false,
    pager:false,
    minSlides:2,
    maxSlides:2,
    moveSlides:1
});
setTimeout(function(){
            slider.redrawSlider();
        },100);

答案 2 :(得分:3)

&#34; romelmederos&#34;在bxslider github页面上建议;


&#34; BxSlider v4.1 - 由于我在移动设备的响应式网站中使用高度百分比,因此存在滑块渲染问题。

所以我不得不做出改变 从: slider.viewport.css(&#39; height&#39;,getViewportHeight()); 对此: slider.viewport.css(&#39; height&#39;,&#39;&#39;);

我在我的副本中使用选项更改了插件,但更改的最快方法是修改上面的行&#34;


我在1290行编辑了我的jquery.bxslider.js;这对我来说很有用,似乎比window.load更好的解决方案(使用window.load滑块被破坏,直到所有内容都被加载。)

答案 3 :(得分:2)

如果您使用ajax加载<ul>元素并且它包含图片,请在加载后尝试slider.reloadSlider();。首先我用

setTimeout('slider.reloadSlider()',1000);

等待图片加载,但最终我切换到等待图片加载的好库ImagesLoaded

imagesLoaded('.seminars-slider', function() {
   slider.reloadSlider();
});

(更改了变量名以匹配问题的那些)

答案 4 :(得分:0)

Matthew Watson给了我一个好主意,我进入了插件并更新了实际的getViewPortHeight()函数,如下所示:

var getViewportHeight = function(){
    var height = 0;
    children = slider.children;
    height = jQuery(slider.children[0]).height();;
    return height;
}

所以现在它取第一张图像的高度(希望它们都是一样的......)并用它来确定滑块的高度。请注意,您的控件仍然位于滑块下方,但这可以通过css定位等修复。

希望这有助于一些失去的人。

答案 5 :(得分:0)

找到这个safari bug的解决方案。你必须让滑块的模式处于水平位置(不确定垂直是否也能正常工作但是淡入淡出根本不起作用)。然后你必须获得第一个图像的高度并将其传递给“.bx-viewport”。这是我的脚本的样子:

$( "img.Banner" ).attr( "id", "first-slide" );
$('.bxslider').bxSlider({
  adaptiveHeight: true,
  mode: 'horizontal',
  auto: true
  });
$("#first-slide").load(function(){
  var height = $(this).height();
   $( ".bx-viewport" ).css( "height", height );
});