【问题标题】:bxslider with dynamic html带有动态 html 的 bxslider
【发布时间】:2015-11-20 08:27:51
【问题描述】:

我在模态中使用 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 中并启动模态。让我们假设从 get_html 函数返回的 html 代码如下所示

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

模态框打开时,图片大小不对。如果我手动调整浏览器窗口的大小,幻灯片就会正确。不知何故,bxslider 无法处理我动态编写 html 代码。在编写 html 代码或任何其他方式解决此问题后,如何加载 bxslider? 谢谢 卡尔 编辑:这是我在一个例子中的问题

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

【问题讨论】:

    标签: javascript jquery html bxslider


    【解决方案1】:

    当引导模式隐藏时,您正在调用 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

    【讨论】:

    • 这很有道理,我要看看你的代码是否也适用于我的网站,谢谢 PKJ。
    【解决方案2】:

    试试这个:

    CSS

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

    如果这不起作用或只起作用一次,请尝试:

    CSS

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

    jQuery

    添加此选项:

    onBeforeSlide: extendVP;
    

    将此添加到&lt;/body&gt;结束标记上方:

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

    更新 1

    如果图像没有以适当的纵横比缩放或者甚至没有缩放,这里有 2 条建议:

    CSS

    简单

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

    更好

    此过程涉及使用背景图像:

    1. 在幻灯片中放置&lt;div&gt;&lt;li&gt; 用于您的标记),给它一个class(如imgFrame
    2. 然后在其上放置一个内联style 属性。将图像分配给imgFrame,如下所示:
      • &lt;div class="imgFrame" style="background-image: url('path/to/img.jpg')"&gt;&lt;/div&gt;
    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();
        }
    }
    

    【讨论】:

    • 嗨 zer...感谢您的建议。您的建议改变了 bxslider 的高度,但它并没有解决图像尺寸错误的问题......干杯
    • @carl 你是如何设置图片宽度的?
    • 我什么都没设置?
    • 这仍然不起作用...我认为这与图像尺寸错误无关。只要我调整浏览器的大小,图像就会正确显示。当浏览器调整大小时,它必须与 bxslider 更新有关...
    • 几天前我遇到了一个类似的问题,是的,图像也不是我的问题。调整视口解决了一半的问题,另一半可能不适用于您的情况(我是前端,后端在世界的另一端。)我修复了两种方法,第一个解决方案可能对您有用.等待更新...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 2014-10-10
    • 2014-12-23
    • 2019-04-24
    • 1970-01-01
    相关资源
    最近更新 更多