bxslider с динамическим html

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

Вот мой модальный код:

<div class="modal fade" id="figure_carousel" role="dialog">
    <div class="modal-dialog" style="width: 80%; height: 100%;">
        <div class="modal-content">

            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                <br>
            </div>

            <div class="modal-body">

                <ul class="bxslider" id="elements">



                </ul>

            </div>

            <div class="modal-footer">
                <input class="btn btn-default" type="button" data-dismiss="modal" value="Close" />
            </div>  

        </div>
    </div>
</div>

при нажатии на изображение я запускаю следующий скрипт

<script>
    $(document).on("click",".paper_img",function(event){
        var modalview = get_html()
        document.getElementById('elements').innerHTML = ""
        $('#figure_carousel').modal('show');
        $('.bxslider').append(modalview.innerHTML);

        var slider = $('.bxslider').bxSlider({mode: 'horizontal'});
        slider.reloadSlider();
    });
</script>   

который получает какой-то html (используя функцию get_html), записывает его в id=elements ul в модальном окне и запускает модальное окно. Предположим, что html-код, возвращаемый функцией get_html, выглядит так:

<li><img src="/static/sourcefiles/image.png" alt="figure"/></li>

При открытии модального окна размер изображений неправильный. Если я изменяю размер окна браузера вручную, слайды становятся правильными. Почему-то bxslider не может справиться с динамическим написанием html-кода. Как я могу загрузить bxslider после написания html-кода или любым другим способом решить эту проблему? спасибо, Карл РЕДАКТИРОВАТЬ: вот моя проблема в примере

http://plnkr.co/edit/sHVq6cggMfVVS4QywQNs?p=preview


person carl    schedule 14.11.2015    source источник


Ответы (2)


вы вызываете bxSlider(), когда модальная загрузка скрыта. Возможно, поэтому bxSlider не может определить высоту изображений.

var bx;
$('#myModal1').on('shown.bs.modal', function () {
  if(bx === undefined){
    bx= $('.bxslider').bxSlider();
  } else {
    bx.reloadSlider(); 
  }
});

'shown.bs.modal' это событие начальной загрузки срабатывает, когда модель становится видимой для пользователя. затем мы вызываем bxSlider(), и каждый раз, когда мы добавляем изображения, мы вызываем bx.reloadSlider();

пример: http://plnkr.co/edit/LTMCuDUc3vUm9VnmmvzG?p=preview

person Pavan Kumar Jorrigala    schedule 20.11.2015
comment
Это имеет смысл, я посмотрю, применим ли ваш код и к моему сайту, спасибо, PKJ. - person zer00ne; 20.11.2015

Попробуй это:

CSS

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

Если это не работает или работает только один раз, попробуйте:

CSS

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

JQuery

Добавьте эту опцию:

onBeforeSlide: extendVP;

Добавьте это выше конечного тега </body>:

function extendVP($ele, from, to) {
     var vp = $('.bx-viewport');
     vp.addClass('extend');
}

ОБНОВЛЕНИЕ 1

Если изображения не масштабируются с правильным соотношением сторон или даже не масштабируются, вот 2 предложения:

CSS

Простой

img { width: 100%; height: auto; }

Лучше

Эта процедура включает использование фонового изображения:

  1. Поместите <div> на слайд (<li> для вашей разметки), присвойте ему class (например, imgFrame)
  2. Then place an inline style attribute on it. Assign the image to imgFrame as follows:
    • <div class="imgFrame" style="background-image: url('path/to/img.jpg')"></div>
  3. Затем добавьте это в свой CSS:

    • .imgFrame { width: 100%; height: auto; background-repeat: no-repeat; background-size: contain; }

ОБНОВЛЕНИЕ 2

Модификации, сделанные в этой демонстрации bxSlider, не предназначены для демонстрации того, что она работает, потому что в первую очередь у нее нет проблемы с высотой. Его цель - показать источник и объяснить, что он делает. При создании этой демонстрации я создал функцию adaptiveWidth(), это необязательно. Что он делает, так это при загрузке страницы, у него есть оверлей, после нажатия он переходит в полноэкранный режим, а затем быстро выходит из полноэкранного режима, когда оверлей исчезает. Надеюсь, это выведет bxSlider из ступора.

CodePen

CSS

<link href="https://cdn.jsdelivr.net/bxslider/4.2.5/jquery.bxslider.css" rel="stylesheet"/>

/* Default Style ____________________________________________________*/

html, body { box-sizing: border-box; }
html { height: 100vh; width: 100vw; overflow-x: hidden; overflow-y: auto; }
body { height: 100%; width: 100%; position: relative; }
*, *:before, *:after { box-sizing: inherit; margin: 0; padding: 0; border: 0; }

/* Aesthetics [Optional]_____________________________________________*/

html { font: 400 16px/1.45 'Source Code Pro'; }
body { background: #000; color: #FFF; font-variant: small-caps; }
h1 { font-size: 3rem; font-weight: 700; }

/* jquery.bxslider.css jsDelvr.com Image Override ___________________*/

.bx-wrapper .bx-loading { background: url('https://cdn.jsdelivr.net/bxslider/4.2.5/images/bx_loader.gif') center center no-repeat #ffffff; }
.bx-wrapper .bx-prev { background: url('https://cdn.jsdelivr.net/bxslider/4.2.5/images/controls.png') no-repeat 0 -32px; }
.bx-wrapper .bx-next { background: url('https://cdn.jsdelivr.net/bxslider/4.2.5/images/controls.png') no-repeat -43px -32px; }
.bx-wrapper .bx-controls-auto .bx-start { background: url('https://cdn.jsdelivr.net/bxslider/4.2.5/images/controls.png') -86px -11px no-repeat; }
.bx-wrapper .bx-controls-auto .bx-stop { background: url('https://cdn.jsdelivr.net/bxslider/4.2.5/images/controls.png') -86px -44px no-repeat; }

/* bxSlider init Style ___________________________________________*/

#overlay { position: fixed; top: 0; bottom: 0; left: 0; right: 0; z-index: 999999999; height: 101%; width: 101%; overflow: hidden; cursor: pointer; pointer-events: auto; background-color: black; opacity: .5; }
.ext { max-width: -moz-fit-content; max-width: -webkit-fit-content; max-width: fit-content; width: auto; height: auto; padding: 25%; } /* adaptiveWidth Style [Optional] */

HTML

<body class="expand">
<div id="overlay"><h1>Click anywhere to start</h1></div>
<div class="ext"> <!-- adaptiveWidth Wrapper [Optional] -->
<ul class='bxslider'>
    <li>
        <img src="http://dummyimage.com/500X16:9/000/FFF.png&text=1"/>
    </li>
    <li>
        <img src="http://dummyimage.com/500X4:3/07C/FC0.png&text=2"/>
    </li>
    <li>
        <img src="http://dummyimage.com/4:3X400/D06/0FF.png&text=3"/>
    </li>
    <li>
        <img src="http://dummyimage.com/640X16:9/765/cee.png&text=4"/>
    </li>
    <li>
        <img src="http://dummyimage.com/210X16:9/B40/6F3.png&text=5"/>
    </li>
    <li>
        <img src="http://dummyimage.com/16:9X420/E2F/FC9.png&text=6"/>
    </li>
</ul>
</div>

JQ/JS

<script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.1.4.min.js"></script> 
<!-- [Suggestion] Don't use the minified version: jquery.bxslider.min.js, it's buggy -->
<script src="https://cdn.jsdelivr.net/bxslider/4.2.5/jquery.bxslider.js"></script> 

/* Page loads #overlay */
$(document).ready(function() {                      // jQ DocReady
    $("#overlay").one('click', function(event) {    // User  clicks #overlay
        event.stopImmediatePropagation();           // Isolate Event
        var tgt = document.querySelector('.expand'),// Target <body>
                that = this;                // Establish this as that
        enterFS(tgt);                       // Enter full screen to wakeup bxSlider!
        exitFS();                                  // Exit full screen
            $(that).fadeOut(1000, function() {     // #overlay fades...
                $(that).remove();                  // #overlay is gone
        });
    });
    /* Adaptive bxSlider */ 
    var bx = $('.bxslider').bxSlider({
        adaptiveHeight: true,   // http://bxslider.com/options#adaptiveHeight
        onSlideBefore: adaptiveWidth    // Callback [optional]
    });
});

/* adaptiveHeight [Optional] */
function adaptiveWidth($ele, from, to) {
    var imgWidth = $ele.find('img').width();
    var bxWidth = $('.bx-wrapper').width(imgWidth);
}

/* Enter Full Screen */ 
function enterFS(element) {
    if(element.requestFullscreen) {
        element.requestFullscreen();
    } 
    else if(element.mozRequestFullScreen) {
        element.mozRequestFullScreen();
    } 
    else if(element.webkitRequestFullscreen) {
        element.webkitRequestFullscreen();
    } 
    else if(element.msRequestFullscreen) {
        element.msRequestFullscreen();
    }
}

/* Exit Full Screen */
function exitFS() {
    if(document.exitFullscreen) {
        document.exitFullscreen();
    } 
    else if(document.mozCancelFullScreen) {
        document.mozCancelFullScreen();
    } 
    else if(document.webkitExitFullscreen) {
        document.webkitExitFullscreen();
    }
}
person zer00ne    schedule 14.11.2015
comment
привет Зер ... спасибо за предложение. Ваше предложение изменяет высоту bxslider, но не решает проблему неправильного размера изображений... ура - person carl; 14.11.2015
comment
@carl Как вы установили ширину ваших изображений? - person zer00ne; 14.11.2015
comment
я ничего не ставил? - person carl; 14.11.2015
comment
это все еще не работает ... Я не думаю, что это как-то связано с неправильным размером изображений. Как только я изменяю размер браузера, изображения отображаются правильно. Это должно быть связано с чем-то, что bxslider обновляет при изменении размера браузера... - person carl; 14.11.2015
comment
У меня была аналогичная проблема пару дней назад, и да, изображения тоже не были моей проблемой. Настройка области просмотра решила половину проблемы, а другая половина может быть неприменима к вашей ситуации (я работаю с интерфейсом, а серверная часть находится на другом конце мира). Я исправил это двумя способами, и первое решение может работать для вас. . Ожидание обновления... - person zer00ne; 14.11.2015
comment
извините, но он все еще не работает... посмотрите на jsfiddle, который я включил выше - person carl; 17.11.2015
comment
У jsFiddle нет ни одного из моих предложений, или есть еще один jsFiddle, который я пропустил? - person zer00ne; 17.11.2015
comment
нет, я просто добавил скрипку, чтобы объяснить свою первоначальную проблему. Я попробовал ваши решения в своем коде, но это не сработало. Я также не совсем понимаю ваше решение, поэтому я думаю, что скрипка может быть лучшим способом справиться с этим. Например. тот факт, что вы даете телу класс (расширяете), а затем изменяете этот класс, имеет очень странные последствия для моего браузера. - person carl; 17.11.2015
comment
Я переношу вашу демонстрацию в plunkr и исправляю ее: #-- innerhtml должен быть innerHTML #-- Теги link и script, указывающие на файлы bootstrap-select, мертвы #-- Экземпляр bxSlider не заключен внутри jQuery docReady. Я должен изменить реализацию этой демонстрации, потому что модальное окно сложное. - person zer00ne; 17.11.2015
comment
@carl это plunkr версии 1. Версия 1 является синтаксически правильной исходной демонстрацией. - person zer00ne; 17.11.2015
comment
привет зер... извините, у меня работала jsfiddle, но я заметил, что при нажатии на ссылку выше скрипка больше не работает... спасибо за версию plunkr - person carl; 17.11.2015
comment
Версии могут обмануть вас, если вы забудете об обновлении во время работы над ними, не беспокойтесь. Есть ли проблемы с использованием iframe в вашем сервисе? Взгляните на эту демонстрацию. Это 6 горизонтальных bxSlider внутри вертикального bxSlider с использованием 6 iframe. Iframes отлично подходят для запуска сложных JS на сайтах WordPress, CMS, Bootstrap, потому что они изолированы. - person zer00ne; 17.11.2015