Vertically centering Bootstrap modal window

前端 未结 30 1900
被撕碎了的回忆
被撕碎了的回忆 2020-12-07 07:00

I would like to center my modal on the viewport (middle) I tried to add some css properties

 .modal { position: fixed; top:50%; left:50%; }   
相关标签:
30条回答
  • 2020-12-07 07:34
    <!-- Modal -->
    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
        <div class="table">
            <div class="table-cell">
                <div class="modal-dialog">
                    <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>
    </div>
    

    // Styles

    .table {
     display: table;
     height:100%;
    }
    .table-cell {
    display: table-cell;
    vertical-align: middle;
    }
    
    0 讨论(0)
  • 2020-12-07 07:34

    The top parameter is being overridden in .modal.fade.in to force the value set in your custom declaration, add the !important keyword after top. This forces the browser to use that value and ignore any other values for the keyword. This has the drawback that you can't override the value anywhere else.

    .modal {
        position: fixed;
        top: 50% !important;
        left: 50%;
    }
    
    0 讨论(0)
  • 2020-12-07 07:36

    To add vertical modal centering to bootstrap modal.js I added this at the end of the Modal.prototype.show function:

    var $modalDialog = $('.modal-dialog'),
            modalHeight = $modalDialog.height(),
            browserHeight = window.innerHeight;
    
        $modalDialog.css({'margin-top' : modalHeight >= browserHeight ? 0 : (browserHeight - modalHeight)/2});
    
    0 讨论(0)
  • 2020-12-07 07:37

    Advantages:

    • modal contents accessible even when taller than device
    • doesn't use display:table-cell (that's not meant for layouts)
    • does not require any modifications to default Bootstrap 3 modal markup
    • positioning is pure CSS. The JS is added for closing the modal on click/tap below and above it
    • I included the un-prefixed SCSS for those who use gulp or grunt

    // closes the modal on click/tap below/above the modal
    
    $('.modal-dialog').on('click tap', function(e){
        if (e.target.classList.contains('modal-dialog')) {
        $('.modal').modal('hide');
      }
    })
    .modal-dialog {
      display: -webkit-box;
      display: -webkit-flex;
      display: -moz-box;
      display: -ms-flexbox;
      display: flex;
      -webkit-box-orient: vertical;
      -webkit-box-direction: normal;
      -webkit-flex-direction: column;
         -moz-box-orient: vertical;
         -moz-box-direction: normal;
          -ms-flex-direction: column;
              flex-direction: column;
      -webkit-box-pack: center;
      -webkit-justify-content: center;
         -moz-box-pack: center;
          -ms-flex-pack: center;
              justify-content: center;
      overflow-y: auto;
      min-height: -webkit-calc(100vh - 60px);
      min-height: -moz-calc(100vh - 60px);
      min-height: calc(100vh - 60px);
    }
    @media (max-width: 767px) {
      .modal-dialog {
        min-height: -webkit-calc(100vh - 20px);
        min-height: -moz-calc(100vh - 20px);
        min-height: calc(100vh - 20px);
      }
    }
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    
    
    <button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
      Launch demo modal
    </button>
    
    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
      <div class="modal-dialog" role="document">
        <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>
            <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>

    Note: I intend to keep this answer up to date with the latest specs of Bootstrap 3. For a Bootstrap 4 solution, see this answer (for now they are more or less the same, but in time they might diverge). If you find any bug or problem with it, let me know and I will update. Thanks.


    Clean, un-prefixed SCSS (for use with gulp/grunt):

    .modal-dialog {
      display: flex;
      flex-direction: column;
      justify-content: center;
      overflow-y: auto;
      min-height: calc(100vh - 60px);
      @media (max-width: 767px) {
        min-height: calc(100vh - 20px);
      }
    }
    
    0 讨论(0)
  • 2020-12-07 07:40

    Because most of the answer here didn't work, or only partially worked:

    body.modal-open .modal[style]:not([style='display: none;']) {
        display: flex !important;
        height: 100%;
    } 
    
    body.modal-open .modal[style]:not([style='display: none;']) .modal-dialog {
        margin: auto;
    }
    

    You have to use the [style] selector to only apply the style on the modal that is currently active instead of all the modals. .in would have been great, but it appears to be added only after the transition is complete which is too late and makes for some really bad transitions. Fortunately it appears bootstrap always applies a style attribute on the modal just as it is starting to show so this is a bit hacky, but it works.

    The :not([style='display: none;']) portion is a workaround to bootstrap not correctly removing the style attribute and instead setting the style display to none when you close the dialog.

    0 讨论(0)
  • 2020-12-07 07:40

    Vertically centered Add .modal-dialog-centered to .modal-dialog to vertically center the modal

    Launch demo modal

    <!-- Modal -->
    <div class="modal fade" id="exampleModalCenter" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
      <div class="modal-dialog modal-dialog-centered" role="document">
        <div class="modal-content">
          <div class="modal-header">
            <h5 class="modal-title" id="exampleModalCenterTitle">Modal title</h5>
            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
              <span aria-hidden="true">&times;</span>
            </button>
          </div>
          <div class="modal-body">
            ...
          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
            <button type="button" class="btn btn-primary">Save changes</button>
          </div>
        </div>
      </div>
    </div>
    
    0 讨论(0)
提交回复
热议问题