1. 程式人生 > >bootstrap實現多模態框的方法

bootstrap實現多模態框的方法

前言

最近在專案中使用bootstrap模態框的時候發現了一個問題,那就是bootstrap模態框不支援多模態框,即不支援彈出了一個模態框之後,再彈出第二個模態框,只支援彈出一個模態框,雖然說第二個或更多模態框可以正常彈出,但是會出現問題,這裡就兩個我發現的問題來分享給大家:
首先來看一下正常一個模態框彈出的樣子:
正常彈出一個模態框的樣子

問題一:

當彈出多個模態框背景遮罩增多,導致背景的顏色越來越深,如下圖:

問題二:

再一個問題就是,當前頁面的內容出現了滾動條,並且前一個模態框內容過長也出現滾動條,開啟第二個或多個模態框時,關閉一個模態框時出現,如圖所示:
滾動到按鈕處
然後點選彈出第三個模態框按鈕,再將其關閉

,出現問題,當滾動滾動條的時候,是主頁面在滾動,而不是前一個模態框即第二個模態框。如圖所示:
這裡寫圖片描述
解決這個問題需要重寫覆蓋模態框原型hideModal的方法,程式碼如下:

//覆蓋Modal.prototype的hideModal方法
            $.fn.modal.Constructor.prototype.hideModal = function () {
                var that = this
                this.$element.hide()
                this.backdrop(function () {
//判斷當前頁面所有的模態框都已經隱藏了之後body移除.modal-open,即body出現滾動條。 $('.modal.fade.in').length === 0 && that.$body.removeClass('modal-open') that.resetAdjustments() that.resetScrollbar() that.$element.trigger('hidden.bs.modal'
) }) }

完美解決問題,最後附上整個測試的程式碼,以供大家參考:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <link rel="stylesheet" href="bootstrap.css"/>
    <style>
        #container{
            height:1000px;
            background:#ccc;
        }
    </style>
</head>
<body>
    <div id="container">
        <span>這是一個很長的div,使頁面出現滾動條。</span>
        <h2>使用Bootstrap建立多模態框</h2>
        <div id="example1" class="modal fade">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <a class="close" data-dismiss="modal">×</a>
                        <h3>這是第一個模態框</h3>
                    </div>
                    <div class="modal-body">
                        <h4>第一個模態框中的文字</h4>
                        <p>你可以在這新增一些文字。</p>
                    </div>
                    <div class="modal-footer">
                        <a data-toggle="modal" href="#example2" class="btn btn-primary btn-large">彈出第二個模態框</a>
                        <a href="#" class="btn" data-dismiss="modal">關閉</a>
                    </div>
                </div>
            </div>
        </div>
        <div id="example2" class="modal fade">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <a class="close" data-dismiss="modal">×</a>
                        <h3>這是第二個模態框</h3>
                    </div>
                    <div class="modal-body">
                        <h4>第二個模態框中的文字</h4>
                        <p style="height:900px">你可以在這新增一些文字。</p>
                    </div>
                    <div class="modal-footer">
                        <a data-toggle="modal" href="#example3" class="btn btn-primary btn-large">彈出第三個模態框</a>
                        <a href="#" class="btn" data-dismiss="modal">關閉</a>
                    </div>
                </div>
            </div>
        </div>
        <div id="example3" class="modal fade">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <a class="close" data-dismiss="modal">×</a>
                        <h3>這是第三個模態框</h3>
                    </div>
                    <div class="modal-body">
                        <h4>第三個模態框中的文字</h4>
                        <p>你可以在這新增一些文字。</p>
                    </div>
                    <div class="modal-footer">
                        <!--<a data-toggle="modal" href="#example2" class="btn btn-primary btn-large">發動演示模態框</a>-->
                        <a href="#" class="btn" data-dismiss="modal">關閉</a>
                    </div>
                </div>
            </div>
        </div>
        <p><a data-toggle="modal" href="#example1" class="btn btn-primary btn-large">發動演示模態框</a></p>
    </div>
    <script src="jquery.js"></script>
    <script src="bootstrap.js"></script>
    <script>
        jQuery(function($){
            //解決模態框背景色越來越深的問題
            $(document).on('show.bs.modal', '.modal', function(event) {
                $(this).appendTo($('body'));
            }).on('shown.bs.modal', '.modal.in', function(event) {
                setModalsAndBackdropsOrder();
            }).on('hidden.bs.modal', '.modal', function(event) {
                setModalsAndBackdropsOrder();
            });

            function setModalsAndBackdropsOrder() {
                var modalZIndex = 1040;
                $('.modal.in').each(function(index) {
                    var $modal = $(this);
                    modalZIndex++;
                    $modal.css('zIndex', modalZIndex);
                    $modal.next('.modal-backdrop.in').addClass('hidden').css('zIndex', modalZIndex - 1);
                });
                $('.modal.in:visible:last').focus().next('.modal-backdrop.in').removeClass('hidden');
            }

            //覆蓋Modal.prototype的hideModal方法
            $.fn.modal.Constructor.prototype.hideModal = function () {
                var that = this
                this.$element.hide()
                this.backdrop(function () {
                    //判斷當前頁面所有的模態框都已經隱藏了之後body移除.modal-open,即body出現滾動條。
                    $('.modal.fade.in').length === 0 && that.$body.removeClass('modal-open')
                    that.resetAdjustments()
                    that.resetScrollbar()
                    that.$element.trigger('hidden.bs.modal')
                })
            }
        });
    </script>
</body>
</html>