Bootstrap 3 modal vertical position center

后端 未结 30 1092
天涯浪人
天涯浪人 2020-11-28 00:15

This is a two part question:

  1. How can you position the modal vertically in the center when you don\'t know the exact height of the modal?

  2. Is

相关标签:
30条回答
  • 2020-11-28 00:54

    yet another solution which will set a valid position for each visible modal on window.resize event and on show.bs.modal:

    (function ($) {
        "use strict";
        function centerModal() {
            $(this).css('display', 'block');
            var $dialog  = $(this).find(".modal-dialog"),
                offset       = ($(window).height() - $dialog.height()) / 2,
                bottomMargin = parseInt($dialog.css('marginBottom'), 10);
    
            // Make sure you don't hide the top part of the modal w/ a negative margin if it's longer than the screen height, and keep the margin equal to the bottom margin of the modal
            if(offset < bottomMargin) offset = bottomMargin;
            $dialog.css("margin-top", offset);
        }
    
        $(document).on('show.bs.modal', '.modal', centerModal);
        $(window).on("resize", function () {
            $('.modal:visible').each(centerModal);
    
        });
    })(jQuery);
    
    0 讨论(0)
  • 2020-11-28 00:56

    A simple way. Work for me. Thks rensdenobel :) http://jsfiddle.net/rensdenobel/sRmLV/13/

    <style>
    .vertical-alignment-helper {
        display:table;
        height: 100%;
        width: 100%;
    }
    .vertical-align-center {
        /* To center vertically */
        display: table-cell;
        vertical-align: middle;
    }
    .modal-content {
        /* Bootstrap sets the size of the modal in the modal-dialog class, we need to inherit it */
        width:inherit;
        height:inherit;
        /* To center horizontally */
        margin: 0 auto;
    }
    </style>
    <!-- Button trigger modal -->
    <button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">Launch demo modal</button>
    <!-- Modal -->
    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
        <div class="vertical-alignment-helper">
            <div class="modal-dialog vertical-align-center">
                <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" id="myModalLabel">Modal title</h4>
    
                    </div>
                    <div class="modal-body">...</div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                        <button type="button" class="btn btn-primary">Save changes</button>
                    </div>
                </div>
            </div>
        </div>
    </div>    
    
    0 讨论(0)
  • 2020-11-28 00:56

    Very very easy way to achieve this concept and you will get modal always in the moddle of your screen by css as fllow : http://jsfiddle.net/jy0zc2jc/1/

    you have to just modal class display as table by following css:

    display:table
    

    and modal-dialog as display:table-cell

    see full working example in given fiddle

    0 讨论(0)
  • 2020-11-28 00:57

    1. How can you position the modal vertically in the center when you don't know the exact height of the modal?

    To absolute center the Bootstrap 3 Modal without declaring a height, you will first need to overwrite the Bootstrap CSS by adding this to your style sheet:

    .modal-dialog-center { /* Edited classname 10/03/2014 */
        margin: 0;
        position: absolute;
        top: 50%;
        left: 50%;
    }
    

    This will position the modal-dialogs top-left corner in the center of the window.

    We have to add this media query or else the modal margin-left is wrong on small devices:

    @media (max-width: 767px) {
      .modal-dialog-center { /* Edited classname 10/03/2014 */
        width: 100%;
      }
    } 
    

    Now we will need to adjust its position with JavaScript. To do that we give the element a negative top and left margin equal to half of its height and width. In this example we will be using jQuery since it is available with Bootstrap.

    $('.modal').on('shown.bs.modal', function() {
        $(this).find('.modal-dialog').css({
            'margin-top': function () {
                return -($(this).outerHeight() / 2);
            },
            'margin-left': function () {
                return -($(this).outerWidth() / 2);
            }
        });
    });
    

    Update (01/10/2015):

    Adding on Finik's answer. Credits to Centering in the Unknown.

    .modal {
      text-align: center;
      padding: 0!important;
    }
    
    .modal:before {
      content: '';
      display: inline-block;
      height: 100%;
      vertical-align: middle;
      margin-right: -4px; /* Adjusts for spacing */
    }
    
    .modal-dialog {
      display: inline-block;
      text-align: left;
      vertical-align: middle;
    }
    

    Notice the negative margin-right? This removes the space added by inline-block. That space causes the modal to jump to the bottom of the page @media width < 768px.

    2. Is it possible to have the modal centered and have overflow:auto in the modal-body, but only if the modal exceeds the screen height?

    This is possible by giving the modal-body an overflow-y:auto and a max-height. This takes a bit more work to get it working properly. Start with adding this to your style sheet:

    .modal-body {
        overflow-y: auto;
    }
    .modal-footer {
        margin-top: 0;
    }
    

    We will use jQuery again to get the window height and set the max-height of the modal-content first. Then we have to set the max-height of the modal-body, by subtracting the modal-content with the modal-header and modal-footer:

    $('.modal').on('shown.bs.modal', function() {
        var contentHeight = $(window).height() - 60;
        var headerHeight = $(this).find('.modal-header').outerHeight() || 2;
        var footerHeight = $(this).find('.modal-footer').outerHeight() || 2;
    
        $(this).find('.modal-content').css({
            'max-height': function () {
                return contentHeight;
            }
        });
    
        $(this).find('.modal-body').css({
            'max-height': function () {
                return (contentHeight - (headerHeight + footerHeight));
            }
        });
    
        $(this).find('.modal-dialog').css({
            'margin-top': function () {
                return -($(this).outerHeight() / 2);
            },
            'margin-left': function () {
                return -($(this).outerWidth() / 2);
            }
        });
    });
    

    You can find a working demo here with Bootstrap 3.0.3: http://cdpn.io/GwvrJ EDIT: I recommend using the updated version instead for a more responsive solution: http://cdpn.io/mKfCc

    Update (30/11/2015):

    function setModalMaxHeight(element) {
      this.$element     = $(element);  
      this.$content     = this.$element.find('.modal-content');
      var borderWidth   = this.$content.outerHeight() - this.$content.innerHeight();
      var dialogMargin  = $(window).width() < 768 ? 20 : 60;
      var contentHeight = $(window).height() - (dialogMargin + borderWidth);
      var headerHeight  = this.$element.find('.modal-header').outerHeight() || 0;
      var footerHeight  = this.$element.find('.modal-footer').outerHeight() || 0;
      var maxHeight     = contentHeight - (headerHeight + footerHeight);
    
      this.$content.css({
          'overflow': 'hidden'
      });
    
      this.$element
        .find('.modal-body').css({
          'max-height': maxHeight,
          'overflow-y': 'auto'
      });
    }
    
    $('.modal').on('show.bs.modal', function() {
      $(this).show();
      setModalMaxHeight(this);
    });
    
    $(window).resize(function() {
      if ($('.modal.in').length != 0) {
        setModalMaxHeight($('.modal.in'));
      }
    });
    

    (Updated 30/11/2015 http://cdpn.io/mKfCc with above edit)

    0 讨论(0)
  • 2020-11-28 00:57

    My solution

    .modal-dialog-center {
        margin-top: 25%;
    }
    
        <div id="waitForm" class="modal">
            <div class="modal-dialog modal-dialog-center">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
                        <h4 id="headerBlock" class="modal-title"></h4>
                    </div>
                    <div class="modal-body">
                        <span id="bodyBlock"></span>
                        <br/>
                        <p style="text-align: center">
                            <img src="@Url.Content("~/Content/images/progress-loader.gif")" alt="progress"/>
                        </p>   
                    </div>
                </div>
            </div>
        </div>
    
    0 讨论(0)
  • 2020-11-28 00:57

    If you're okay with using flexbox then this should help solve it.

    .modal-dialog {
      height: 100%;
      width: 100%;
      display: flex;
      align-items: center;
    }
    
    .modal-content {
      margin: 0 auto;
    }
    
    0 讨论(0)
提交回复
热议问题