Sự cố phương thức Bootstrap - Tính năng cuộn bị tắt


90

Tôi có một phương thức và trong phương thức đó, có một menu thả xuống hiển thị nội dung ẩn lớn đang hoạt động.

Bây giờ khi bạn mở phương thức tiếp theo, xếp chồng lên trên phương thức đầu tiên và loại bỏ nó, việc cuộn trên phương thức bên dưới sẽ bị tắt.

Tôi đã tạo một ví dụ đầy đủ, bao gồm các bước để tái tạo vấn đề mà tôi đang gặp phải. Bạn có thể xem nó ở đây .

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet">
    <title></title>
    <style>

    </style>
</head>
<body>


    <input type="button" data-toggle="modal" data-target="#modal_1" class="btn btn-lg btn-primary" value="Open Modal 1" >

    <div class="modal fade" id="modal_1">
        <div class="modal-dialog modal-sm">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
                    <h4 class="modal-title">First Modal</h4>
                </div>
                <div class="modal-body">



                    <form class="form">

                        <div class="form-group">
                            <label>1) Open This First: </label>
                            <input type="button" data-toggle="modal" data-target="#modal_2" class="btn btn-primary" value="Open Modal 2" >
                        </div>

                        <div class="form-group">
                            <label>2) Change this once you have opened the modal above.</label>
                            <select id="change" class="form-control">
                                <option value="small">Show Small Content</option>
                                <option value="large">Show Large Content</option>
                            </select>
                        </div> 

                        <div id="large" class='content-div'>
                            <label>Large Textarea Content.. Try and scroll to the bottom..</label>
                            <textarea rows="30" class="form-control"></textarea>

                        </div>

                        <div id="small" class='content-div'>
                            <label> Example Text Box</label> 
                            <input type="text" class="form-control">
                        </div>  


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


    <div class="modal fade" id="modal_2">
        <div class="modal-dialog modal-sm">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
                    <h4 class="modal-title">Second Modal</h4>
                </div>
                <div class="modal-body">

                    <hp>This is the stacked modal.. Close this modal, then chenge the dropdown menu, you cannot scroll... </h5>

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


</body>
<script src="http://code.jquery.com/jquery-1.11.0.min.js" type="text/javascript"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js" type="text/javascript"></script>
<script>

    $(document).ready(function() {


        $(".content-div").hide();
        $("#change").change(function() {
            $(".content-div").hide();
            $("#" + $(this).val()).show();
        });


    });

</script>
</html>

Đây là một Bootply để hiển thị hành vi đang hoạt động:

Bootply


Câu trả lời:


119

Đây cũng là một giải pháp

.modal {
  overflow-y:auto;
}

http://www.bootply.com/LZBqdq2jl5

Tự động hoạt động tốt :) Điều này thực sự sẽ sửa chữa bất kỳ chế độ nào chạy cao hơn kích thước màn hình của bạn.


5
Giải pháp này giải quyết vấn đề của tôi, trong khi đóng cửa và mở cửa modals từ jQuery$('.modal').css('overflow-y', 'auto');
Gla

Cứu tinh) Cảm ơn bạn
Victor Gorban

66

Điều này là do khi bạn đóng một phương thức, phương thức đó sẽ xóa modal-openkhỏi <body>thẻ. Bootstrap không hỗ trợ nhiều phương thức trên cùng một trang (Ít nhất là cho đến BS3).

Một cách để làm cho nó hoạt động, là sử dụng hidden.bs.modalsự kiện được kích hoạt bởi BS khi đóng một phương thức, sau đó kiểm tra xem có bất kỳ phương thức nào khác đang mở để buộc modal-openlớp đó trên cơ thể hay không.

// Hack to enable multiple modals by making sure the .modal-open class
// is set to the <body> when there is at least one modal open left
$('body').on('hidden.bs.modal', function () {
    if($('.modal.in').length > 0)
    {
        $('body').addClass('modal-open');
    }
});

10
(BS4) Đầu tiên câu trả lời tôi có thể có được để làm việc, chỉ cần có để sử dụng ($ () length> 0 'modal.show.'.) Cho Bootstrap 4.
Shoejep

Cảm ơn - vấn đề của tôi không hoàn toàn giống nhau nhưng nhận xét của bạn đã chỉ cho tôi đến lớp mở theo phương thức trên cơ thể, đây là nguyên nhân của hành động cuộn trang bị mất.
Jon

37

Tôi đã tìm thấy một giải pháp cho bạn. Tôi không chắc tại sao nó không hoạt động nhưng chỉ một mã dòng trong CSS của bạn sẽ giải quyết được vấn đề. Sau khi đóng phương thức thứ hai, phương thức đầu tiên đang nhận được overflow-y:hiddenbằng cách nào đó. Ngay cả khi nó được đặt thành autothực sự.

Bạn cần viết lại điều này và đặt khai báo của riêng bạn trong CSS:

#modal_1 {
    overflow-y:scroll;
}

Ở đây bạn có một DEMO đang hoạt động

Chỉnh sửa : sai liên kết, xin lỗi.


không làm việc, nó làm cho cuộn đựng nhưng bánh xe làm cho chuột cũng stucked
Kiran Maniya

18
$(document).ready(function () {

 $('.modal').on("hidden.bs.modal", function (e) { //fire on closing modal box
        if ($('.modal:visible').length) { // check whether parent modal is opend after child modal close
            $('body').addClass('modal-open'); // if open mean length is 1 then add a bootstrap css class to body of the page
        }
    });
});
//this code segment will activate parent modal dialog 
//after child modal box close then scroll problem will automatically fixed

3
IMO đây là câu trả lời tốt nhất. Việc thêm css bổ sung cho tràn-y: auto cũng hoạt động nhưng như đã đề cập bên dưới, dẫn đến thanh cuộn kép.
Jacob Rutherford

1
Cũng hoạt động với Bootstrap 4.1. Được đánh giá cao
Willi

1
Đã đồng ý. đã kiểm tra 2-3 câu trả lời và câu trả lời này hoạt động cho Twitter Bootstrap 4.2.1.
Tpojka


9

Đối với bootstrap 4, tôi phải thêm vào! Quan trọng

.modal {
    overflow-y: auto !important;
}

Nếu điều này không được thực hiện, nó không hoạt động và nó không được áp dụng.

ảnh chụp màn hình


6

Trước hết, nhiều phương thức mở không được Bootstrap hỗ trợ. Xem tại đây: Tài liệu Bootstrap Modal

Nhiều chế độ mở không được hỗ trợ. Đảm bảo không mở một phương thức trong khi một phương thức khác vẫn hiển thị. Hiển thị nhiều hơn một phương thức cùng một lúc yêu cầu mã tùy chỉnh.

Tuy nhiên, nếu phải, bạn có thể thêm bit CSS này vào biểu định kiểu tùy chỉnh của mình, miễn là nó được bao gồm sau biểu định kiểu Bootstrap chính:

.modal {
    overflow-y:auto;
}

3

Tôi đã giải quyết vấn đề bằng cách xóa data-dismiss="modal" và thêm

setTimeout(function(){ $('#myModal2').modal('show') }, 500);
$('#myModal1').modal('hide');

Hy vọng nó giúp


Cảm ơn @Sunny Tôi không biết lý do tại sao các giải pháp khác không làm việc cho tôi nhưng điều này chắc chắn là làm việc
dev-masih

@MasihAkbari nó có thể là vấn đề phiên bản :) Cái này cũng giúp tôi. Tôi đang sử dụng BS4. Nó có thể có một chút vấn đề về hiệu suất do độ trễ, nhưng đây là cách khắc phục nhanh chóng và dễ dàng.
Weijing Jay Lin

3

Bootstrap không hỗ trợ nhiều phương thức cùng một lúc. Đó là một lỗi Bootstrap. Chỉ cần thêm tập lệnh bên dưới cho BS4.

$('body').on('hidden.bs.modal', function () {
if($('.modal.show').length > 0)
{
    $('body').addClass('modal-open');
}
});


2

Tôi cho rằng điều này là do lỗi trong twitter bootstrap. Nó dường như loại bỏ modal-openlớp khỏi cơ thể ngay cả khi hai chế độ được mở. Bạn có thể thử nghiệm removeClasschức năng của jQuery và bỏ qua nó nếu có một phương thức vẫn còn mở (tín dụng cho chức năng cơ sở là câu trả lời sau: https://stackoverflow.com/a/1950199/854246 ).

(function(){
    var originalRemoveClassMethod = jQuery.fn.removeClass;

    jQuery.fn.removeClass = function(){
        if (arguments[0] === 'modal-open' && jQuery('.modal.in').length > 1) {
            return this;
        }
        var result = originalRemoveClassMethod.apply( this, arguments );
        return result;
    }
})();

Như đã đề cập bởi @Blazemonger, Bootstrap rõ ràng không hỗ trợ xếp chồng modals
cvrebert

1

Mã này đã giải quyết được vấn đề của tôi, khi cửa sổ bật lên thứ hai đóng lại, cửa sổ bật lên đầu tiên của tôi không thể cuộn được nữa.

$('body').on('hidden.bs.modal', '#SecondModal', function (e) {
  if ($('#FirstModal').is(':visible')) { // check if first modal open 
    $('body').addClass('modal-open'); // re-add class 'modal-open' to the body because it was removed when we close the second modal
    $('#FirstModal').focus(); // Focus first modal to activate scrollbar
  }
});

1

Đây là một loại hack, nhưng tôi chỉ muốn đóng và mở lại nó theo phương thức gần để loại bỏ bất kỳ hành vi kỳ lạ / không mong muốn nào. Nếu bạn đã tắt dần thì bạn không thể nhận thấy nó đang đóng và mở lại:

var $ModalThatWasOnTop= $('#ModalThatWasOnTop')

$ModalThatWasOnTop.on('hidden.bs.modal', function(e) {
     console.log('closing  modal that was on top of the other modal')
     $('#ModalThatWasCovered').modal('hide');
     $('#ModalThatWasCovered').modal('show');

});

0

Thêm qua JQuery lớp 'modal-open' vào phần thân. Tôi cho rằng cuộn hoạt động trên mọi thứ ngoại trừ phương thức.

Như một nhận xét cho các phản hồi trước: việc thêm thuộc tính tràn vào phương thức (thông qua CSS) sẽ hữu ích nhưng sau đó bạn sẽ có hai thanh cuộn trong trang.



0

Tôi thực sự đã tìm ra một giải pháp cho điều này. Bạn thực sự cần bật tính năng cuộn cho nội dung trang của mình nếu bạn đang sử dụng $('#myModal').hide();để ẩn một mô hình. Chỉ cần viết dòng sau $('#myModal').hide();:

$('body').attr("style", "overflow:auto")

Thao tác này sẽ kích hoạt lại tính năng cuộn.


0

Nếu bạn đang sử dụng bootstrap3 hoặc 4, hãy đảm bảo rằng bạn có một phương thức mở lớp trong phần thân html. Tôi không chắc liệu điều này có bắt buộc hay không, nhưng có thể đảm bảo rằng chỉ mục z của modal-phông nền của bạn được xóa.

    $('.your-second-modal').on('hidden.bs.modal', function (e) {
        $('.your-second-modal').css('z-index', "");
        $('.modal-backdrop').css('z-index', 1040);
        $('body').addClass("modal-open");
    });

0

Thêm mã này bên dưới js

    $(document).on("click",".modal",function () {
       if(!$("body").hasClass('modal-open'))
           $("body").addClass('modal-open');
    });
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.