Как заставить bxSlider скрывать слайды до загрузки страницы?

Я создаю веб-сайт, на котором используется bxSlider.

По мере загрузки страницы видны все слайды, расположенные друг над другом. После полной загрузки страницы первый слайд остается видимым, а остальные исчезают, так что ползунок может анимировать и отображать их по одному.

Я пробовал использовать различные обратные вызовы CSS и bxSlider, чтобы скрыть слайды до полной загрузки страницы, но безуспешно. Кто-нибудь знает как это сделать?

Спасибо!


person Nick Petrie    schedule 25.07.2012    source источник
comment
Поместите display:hidden в элемент, содержащий слайдер, и в document.ready покажите его.   -  person Deep Frozen    schedule 26.07.2012
comment
Используйте overflow: hidden и height: 'height of slider' для элемента, который содержит ползунок.   -  person Mandeep Pasbola    schedule 17.11.2012


Ответы (15)


bxslider имеет обратный вызов при загрузке слайдера (onSliderLoad). Я установил видимость как скрытую в контейнере div, а затем использую обратный вызов, чтобы установить видимость как «видимую».

<div id="siteslides" style="visibility: hidden;"></div>

$(".site_banner_slider").bxSlider({
    auto: true,
    slideWidth: $imageWidth,
    mode: 'fade',
    onSliderLoad: function(){
        $("#siteslides").css("visibility", "visible");
      }
  });
person bradrice    schedule 21.10.2013
comment
Это сработало для меня. Я сделал небольшое изменение, в котором не скрываю первое электронное письмо, чтобы избежать нервозности. - person Daniela; 24.01.2016

У меня была такая же проблема, и я решил ее следующим образом:

<div class="mySlider" style="display:none">

тогда

$(document).ready(function(){
      $('.mySlider').show().bxSlider({
        slideWidth: 160,
        minSlides: 2,
        maxSlides: 5,
        preloadImages: 'all'
      });
    });
person Ehsan Khaveh    schedule 29.04.2013
comment
Хорошее решение! - person Rahul; 28.02.2017

Поместите div, который обертывает все содержимое, и поставьте на него style="display:none". Затем после вызова bxslider просто покажите его.

EX:

<script type="text/javascript">
$(document).ready(function(){

    $('.bxlider').bxSlider({
        displaySlideQty : 5,
        prevText : "",
        nextText : "",
        moveSlideQty : 5,
        infiniteLoop :  false
    });
    $(".bxsliderWrapper").show("fade");
});
</script>
person Bob    schedule 10.08.2012
comment
Не знаю, почему за это проголосовали против, мне это хорошо подходит. Единственная разница в том, что я помещаю оператор show перед слайдером, но документ все еще готов. Хороший ответ. - person Ross Coulbeck; 12.10.2012
comment
в последних версиях bx-slider это действительно нужно делать в обратных вызовах, чтобы гарантировать, что вы вызываете его в нужное время: например, $ ('. bxslider'). bxSlider ({onSliderLoad: function () {#show wrapper}); вам также может потребоваться переосмыслить отображение класса-оболочки, когда у вас есть более одного слайдера на странице. - person Code Novitiate; 18.10.2013

Ни одно из опубликованных решений не помогло мне.

Использование видимости: скрыто привело к появлению огромного пустого места на странице.

По какой-то причине использование display: none не привело к загрузке ни одного слайда, а только элементов управления.

Это единственный способ найти какое-то разумное решение:

В CSS:

.ctaFtSlider
{
visibility: hidden;
height: 0;
}   

В функции:

$(document).ready(function(){
$('.bxslider').bxSlider({
...
onSliderLoad: function(currentIndex){
$(".ctaFtSlider").css("visibility", "visible");
$(".ctaFtSlider").css("height", "auto");
}
});
});

Наконец, HTML:

<div class="ctaFtSlider">
...
</div>
person Brogan    schedule 20.07.2014
comment
Это единственное, что у меня тоже работает. использование видимости: скрыто и отображения: никто не загружал изображения - person David; 10.03.2015
comment
То же самое, это сработало для меня, когда все остальные ответы не дали результата. - person user2780436; 21.03.2015
comment
было бы неплохо, если бы он анимировал от альфа 0 до 100 - person Marc; 01.08.2016

В итоге я добавил немного CSS, чтобы скрыть все, кроме первого слайда.

Никакой дополнительной разметки или поведения не требуется и работает во всех основных браузерах!

.bxslider {
  li {
    display: none;

    &:first-child {
      display: block;
    }
  }
}
person Jeff Miller    schedule 10.10.2013
comment
Я обнаружил это для себя сегодня, и он отлично работает. На самом деле мне даже не нужно было показывать первенца. Я только что спрятал все элементы li в слайдере, и bxslider автоматически переопределил значения после рендеринга, но остановил ужасное смещение элементов списка на долю секунды, что сводило меня с ума. - person AdamJones; 24.12.2015
comment
Это действительно должен быть выбранный ответ. Это не требует модификации вашего вызова bxSlider в JavaScript или чего-либо еще. Отличная работа! В случаях, когда я не использую элемент .bxslider в качестве неупорядоченного списка, я бы выбрал элементы карусели верхнего уровня следующим образом: .bxslider > * { display: none; } - person htmlbot; 07.04.2016

Предположим, у вас есть:

HTML:

<ul class="slider">
<li>...</li>
<li>...</li>
</ul>

и jQuery:

jQuery('.slider').bxSlider({
        ...
});

Следующее решение поможет скрыть все слайды, кроме первого.

CSS:

ul.slider li:nth-child(n+2) {
    display: none;
}

Когда слайдер полностью загружен, каждый активный слайд автоматически получит стиль display: block.

person Eleonora Velikova    schedule 22.06.2015
comment
Пожалуйста, объясните свой ответ. - person Dropout; 22.06.2015
comment
Мне это нравится, но в горизонтальном режиме (смахивание) не работает ... только для затухания - person Martin Zvarík; 22.12.2017
comment
@Dropout что объяснять? Ze скрывает все, кроме первого дочернего элемента (слайда) с помощью CSS, а затем, когда слайдер сгенерирован, он заставляет все блокироваться. Работает отлично. - person Kenton de Jong; 28.06.2018
comment
@KentondeJong до того, как ответ был отредактирован, это был только код. Эти типы ответов часто помечаются как низкокачественные и удаляются, так я и пришел к ответу. Теперь все в порядке. - person Dropout; 29.06.2018

У меня была такая же проблема, и мне помог этот трюк:

     <ul id="bxSlider" style="padding:0px !important;overflow:hidden;height:385px;">

поместите значения высоты и переполнения в элемент ul ползунка.

С уважением

person Kire Bananaman    schedule 29.07.2012

Быстрое и простое решение только для CSS для современных браузеров (IE10 +):

.bxslider {
    transform: scale(0);
}

Это работает, потому что изначально ползунок будет уменьшен до нуля, но затем, когда загрузится bxSlider, он переопределит преобразование встроенным стилем.

person Jonathan Potter    schedule 23.10.2015

Была такая же проблема. Я использовал разметку ниже и сначала спрятал <div class="bxsliderWrapper"> содержащий display: none; с помощью CSS display: none;. Я заметил, что ширина слайдов <div class="slide"> была отрисована в 1 пиксель.

Я подозреваю, что это как-то связано с отзывчивой функцией, которая берет размеры исходного контейнера, который был скрыт, и определяет встроенные стили для каждого слайда.

<div class="bxsliderWrapper">
  <div class="bxslider">
    <div class="slide">Your Content</div>
    <div class="slide">Your Content</div>
    <div class="slide">Your Content</div>
  </div>
</div>

Мое решение похоже на то, что bradrice упомянул выше об использовании встроенных функций обратного вызова. Вместо этого я просто добавил функцию reloadSlider() к функции show().

<script type="text/javascript">

var $j = jQuery.noConflict();
$j(document).ready(function(){
  var homeSlider = $j('.bxslider').bxSlider();
  $j(".bxsliderWrapper").show(0, "swing", function(){homeSlider.reloadSlider();});
});

</script>

Он запускает перезагрузку после завершения show ().

.

ИЗМЕНИТЬ


Первоначальное решение, приведенное выше, изначально работало, но у меня были проблемы, когда кеш был очищен во время жесткого обновления shift + REFRESH. Я предполагаю, что элементы, на которые нацелена функция .show(), были недоступны вовремя или ресурсы еще не были загружены. (Я предполагаю) Ниже приведено исправление этого поведения.


Вместо того, чтобы скрывать Bx Slider, содержащий <div> с display: none;, я скрывал изображения слайдов с помощью атрибута visibility CSS.

.bxslider .slide {
  visibility: hidden;
}

Это позволяет ползунку отображать правильный размер, не видя изображения на экране, пока они не будут готовы. Затем я использовал метод jQuery .css(), запускаемый $j(window).load(), чтобы изменить видимость после загрузки страницы. Это гарантировало, что весь код и элементы существовали до их отображения.

<script type="text/javascript">

  var $j = jQuery.noConflict();

  $j(document).ready(function(){
    var homeSlider = $j('.bxslider').bxSlider();
  });

  $j(window).load(function(){
    $j(".bxslider .slide").css("visibility", "visible");
  });

</script>

Этот метод также работал с несколькими ползунками на одной странице. Я обнаружил, что метод .show() приводит к поломке всех экземпляров ползунка. Я только догадываюсь, почему это лучшее решение, но, возможно, кто-то может добавить некоторую информацию, чтобы лучше это понять.

person user2589301    schedule 04.03.2014

Я не могу вспомнить, где я это нашел, но я думаю, что это самый чистый способ решить эту проблему, когда все слайды будут видны при загрузке страницы.

Сначала добавьте div вокруг неупорядоченного списка bxslider:

<div class="bxslider-wrap">
    <ul class="bxslider">
        <li>Image / Content </li>
        <li>Image / Content </li>
        <li>Image / Content </li>
    </ul>
</div>

Затем добавьте эту строку в свой файл css, которая скрывает весь слайдер при загрузке страницы:

.bxslider-wrap { visibility: hidden; }

Наконец, установите ползунок на видимость: видимый через jQuery (в вашем файле js) при загрузке ползунка, чтобы сделать его снова видимым!

jQuery(document).ready(function($) {
    $('.bxslider').bxSlider({
        onSliderLoad: function(){ 
            $(".bxslider-wrap").css("visibility", "visible");
        }
    }); 
});

Надеюсь это поможет!

person Jordan Smith    schedule 05.02.2015

Я попробовал большинство решений для этого и обнаружил, что они недостаточно отполированы для того, к чему я стремился. Я все еще получал отрывистую презентацию после того, как ползунок загружался только что появлялся. Использование .fade () было близко, но оно анимировалось сверху слева направо, что выглядело странно. Подключение к onSliderLoad отлично работает, но изменение видимости по-прежнему заставляет ползунок просто появляться на экране. Я искал более элегантный вход, поэтому я добавил класс вместо изменения CSS.

jQuery:

$('.slider').bxSlider({
    auto: false,
    pager: false,
    mode: 'fade',
    onSliderLoad: function(){
        $(".slide-clip").addClass('-visible');
    }
});

SASS:

.slide-clip {
    opacity:0;
    max-width: 1305px;  // Used as a clipping mask
    max-height: 360px; // Used as a clipping mask
    overflow:hidden;  // Used as a clipping mask
    margin:0 auto;
    transition(all 275ms);
    &.-visible {
        transition(all 275ms);
        opacity:1;
    }

}

Я использую обертку, чтобы замаскировать свой слайдер, поскольку он мне нужен в моем случае, поэтому для тех, кто заинтересован:

<div class="slide-clip">
    <ul class="slider">
        <li style="background-image: url('URL_HERE');"></li>
    </ul>
</div>
person Jereme Yoho    schedule 05.09.2015

Я добавил заголовок и текстовый div в свой слайдер, поэтому, когда они загружали, все это складывалось вверху страницы, поэтому с помощью этого сообщения мне удалось скрыть элементы слайда, но показать элемент загрузки:

Как уже говорилось выше, класс visibility: hidden был добавлен во внешний div, но я также добавил класс visibility: visible за пределами этого, чтобы показать ajax_loader, затем с помощью кода ниже установите первый, чтобы скрыть, когда слайды загружены и были установлены как видимые. Теперь вместо уродливого пустого места во время загрузки слайдов вы видите загрузчик, поэтому он имеет больше смысла для пользователя:

jQuery(document).ready(function($) {
$('.bxslider').bxSlider({
    onSliderLoad: function(){ 
        $(".slideouter").css("visibility", "visible");
        $(".slideloader").css("visibility", "hidden");
    },
   autoControls: true,
  auto: true,
  mode: 'fade'
}); 

Надеюсь, это поможет, так что слайд-аут - это div, который скрыт в вашем CSS, а слайд-загрузчик виден в вашем CSS, но оба меняются местами после загрузки слайдера. Надеюсь, это поможет.

Привет, Ли

person Lee Phillips    schedule 07.03.2015

Я не знаю точно о методе style = "display: none", но когда "hide () / fadeOut ()" с контейнером jQuery bxSlider и после этого init bxSlider, он будет отображаться с ошибками в разметке. (возможно, используя display: none, чтобы избежать ошибки, но если вы хотите, чтобы ваш слайдер исчез, мой метод будет применим)

просто поместите свой контейнер как «абсолютный» в css и в своем JS перед инициализацией bxSlider переместите его в невидимую часть страницы, запустите его, а затем скройте, верните в предыдущую точку и, наконец, fadeIn:

$("#bxslider-container").css({'left' : "4000px"});
$('.bxslider').bxSlider();
$("#content-wrapper").hide().css({'left' : "0px"}).fadeIn(2000);

надеюсь, это поможет

person Roaring Stones    schedule 27.06.2013

Я использовал этот CSS, и он работал для экранов шириной более 1200, потому что мой слайдер имеет максимальную ширину, версия для планшета еще не исправлена, вы также можете попробовать количество% вместо пикселей таким образом.

.banner - это мой главный div для слайдера bxslider.

.banner{overflow: hidden !important; height: 426px;}
@media screen and (max-width: 1200px){.banner{height: auto;}}
<div class="banner">
  <div class="bx-wrapper">
     			  
  </div>		    		   
</div>

person Bas    schedule 19.08.2015

Не ответ как таковой, но кто-нибудь заметил, что с этой ошибкой все непрозрачность (и) элементов списка установлена ​​на 1? Я считаю, что начальный setChildrenFade не вызывается при инициализации слайд-шоу.

Обновлено:

Мне удалось отсортировать это, добавив:

/**
    * Start the slideshow
    */
    this.startShow = function (changeText) {
      if (options.mode == 'fade') {
                    setChildrenFade();
                }

К началу функции шоу.

Похоже, что setChildrenFade не вызывается по дизайну, пока не будет вызван GoToSlide. Возможно, это ошибка, поскольку вы действительно заметите проблему, только если фон элемента списка установлен на прозрачный ... в противном случае z: index обрабатывает скрытие при первоначальном запуске.

Надеюсь это поможет.

person Dave Stringer    schedule 24.08.2012