modal-dialog - 如何垂直对齐Bootstrap v4模式对话框

标签 modal-dialog flexbox bootstrap-modal vertical-alignment bootstrap-4

在Bootstrap 4中垂直居中模态对话。

注意:已添加以下要求,以使我很清楚我正在寻找一种正确的方式,以垂直居中Bootstrap模态,涵盖所有可能的情况,在所有浏览器中的所有设备。就我而言,我希望大型SPA在整个应用程序中重用相同的模式,因此我需要在每种情况下都可以使用它。

这应该:

  • 即使在高于设备高度的情况下,也可以在所有设备上访问模态内容
  • 可在市场份额大于1%的任何设备+浏览器组合上工作
  • 不使用display:table-cell或类似的技巧(任何不是为布局而设计或设计的布局技术)
  • click以外的任何地方(包括上方和下方)关闭tap.modal-content
  • 尽可能限制jQuery / JavaScript的使用
  • (可选)可在默认的Bootstrap示例上工作,而无需标记修改
  • 最佳答案

    从Beta 3开始,[docs]更新:

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



    原始答案:
    SCSS:

    .modal-dialog {
      min-height: calc(100vh - 60px);
      display: flex;
      flex-direction: column;
      justify-content: center;
      overflow: auto;
      @media(max-width: 768px) {
        min-height: calc(100vh - 20px);
      }
    }
    

    无前缀 CSS:

    .modal-dialog {
        min-height: calc(100vh - 60px);
        display: flex;
        flex-direction: column;
        justify-content: center;
        overflow: auto;
    }
    @media(max-width: 768px) {
      .modal-dialog {
        min-height: calc(100vh - 20px);
      }
    }
    

    注1:请注意,随着浏览器对某些属性的更改,全前缀CSS逐渐变得过时。获取更新的前缀CSS的正确方法是:
  • 将未添加前缀的CSS复制/粘贴到Autoprefixer中。
  • 将底部框中的过滤器设置为所需的设置(要获得最大的浏览器支持,请使用> 0%)。
  • 从右侧的框中获取最新代码。


  • 注2:这个答案是在 v4 (alpha 3或4)的早期阶段添加的,该版本目前处于beta版本。您可以通过向.modal-dialog添加以下类来安全地替换此答案的CSS部分:
    h-100 d-flex flex-column justify-content-center my-0
    

    ...,正如@Androbaut在下面的评论中指出的那样。您仍将需要JavaScript(请参见下文)以关闭模态窗口下方/上方的click tap上的模态窗口。
    jQuery(需要在点击/点击上方/下方时关闭模式):

    $('.modal-dialog').on('click tap', function(e){
      if ($(e.target).hasClass('modal-dialog')) {
        $('.modal').modal('hide');
      }
    })
    

    而已。

    工作片段,完全前缀的CSS和使用不同模式大小的标记:

    $('.modal-dialog').on('click tap', function(e){
      if ($(e.target).hasClass('modal-dialog')) {
      	$('.modal').modal('hide');
      }
    })
    .modal-dialog {
      min-height: -webkit-calc(100vh - 60px);
      min-height: -moz-calc(100vh - 60px);
      min-height: calc(100vh - 60px);
      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: auto; 
    }
    @media (max-width: 768px) {
      .modal-dialog {
        min-height: -webkit-calc(100vh - 20px);
        min-height: -moz-calc(100vh - 20px);
        min-height: calc(100vh - 20px);   
      }
    }
    
    /* you don't need the CSS below this line. It's mainly cosmetic and for aligning the modal launch buttons */
    
    .modal-content {
      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; }
    .modal-content > * {
      -webkit-box-flex: 0;
      -webkit-flex: 0 0 auto;
         -moz-box-flex: 0;
          -ms-flex: 0 0 auto;
              flex: 0 0 auto; 
    }
    .modal-content > *.modal-body {
      -webkit-box-flex: 1;
      -webkit-flex-grow: 1;
         -moz-box-flex: 1;
          -ms-flex-positive: 1;
              flex-grow: 1; 
    }
    
    #Modal_2 .modal-content {
      min-height: 50vh; 
    }
    
    #Modal_3 .modal-content {
      min-height: 85vh; 
    }
    
    #Modal_4 .modal-content {
      min-height: 200vh; 
    }
    
    .full-page-center {
      display: -webkit-box;
      display: -webkit-flex;
      display: -moz-box;
      display: -ms-flexbox;
      display: flex;
      -webkit-box-pack: center;
      -webkit-justify-content: center;
         -moz-box-pack: center;
          -ms-flex-pack: center;
              justify-content: center;
      -webkit-box-align: center;
      -webkit-align-items: center;
         -moz-box-align: center;
          -ms-flex-align: center;
              align-items: center;
      min-height: 100vh; 
    }
    .full-page-center button {
      margin: 15px; 
    }
    @media (max-width: 768px) {
      .full-page-center {
        -webkit-flex-wrap: wrap;
            -ms-flex-wrap: wrap;
                flex-wrap: wrap;   
      }
      .full-page-center button {
        display: block;
        min-width: 100%;
        margin: 10px 15px;
      }
      .full-page-center::after {
        display: none;
        -webkit-box-flex: 0;
        -webkit-flex-grow: 0;
           -moz-box-flex: 0;
            -ms-flex-positive: 0;
                flex-grow: 0;
      }
    }
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.5/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://npmcdn.com/tether@1.2.4/dist/js/tether.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.5/js/bootstrap.min.js"></script>
    
    
    <div class="container full-page-center">
      <button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#Modal_1">
        Tiny modal
      </button>
      <button type="button" class="btn btn-default btn-lg" data-toggle="modal" data-target="#Modal_2">
        Normal modal
      </button>
      <button type="button" class="btn btn-success btn-lg" data-toggle="modal" data-target="#Modal_3">
        Large modal
      </button>
      <button type="button" class="btn btn-warning btn-lg" data-toggle="modal" data-target="#Modal_4">
        Very large modal
      </button>
    </div>
    <div class="modal fade" id="Modal_1" tabindex="-1" role="dialog" aria-labelledby="modalLabel_1" aria-hidden="true">
      <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="modalLabel_1">Tiny modal</h4>
          </div>
          <div class="modal-body">
            I am cute...
          </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>
    <div class="modal fade" id="Modal_2" tabindex="-1" role="dialog" aria-labelledby="modalLabel_2" aria-hidden="true">
      <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="modalLabel_2">Dull modal</h4>
          </div>
          <div class="modal-body">
            I am normal...
          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
            <button type="button" class="btn btn-primary">Some action</button>
          </div>
        </div>
      </div>
    </div>
    <div class="modal fade" id="Modal_3" tabindex="-1" role="dialog" aria-labelledby="modalLabel_3" aria-hidden="true">
      <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="modalLabel_3">Don't call me fat</h4>
          </div>
          <div class="modal-body">
            Call me "oversized".
          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
            <button type="button" class="btn btn-success">Some action</button>
          </div>
        </div>
      </div>
    </div>
    <div class="modal fade" id="Modal_4" tabindex="-1" role="dialog" aria-labelledby="modalLabel_4" aria-hidden="true">
      <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="modalLabel_4">Huge modal</h4>
          </div>
          <div class="modal-body">
            Comments, anyone?
          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
            <button type="button" class="btn btn-warning">Some action</button>
          </div>
        </div>
      </div>
    </div>


    如果您发现任何错误或缺点,请告诉我。我将花一些时间来改善答案并使之有用。欢迎完成此任务。

    关于modal-dialog - 如何垂直对齐Bootstrap v4模式对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41377501/

    相关文章:

    jquery - 使用dialog()更新动态创建的输入

    wpf - 强制MessageBox在.net/WPF中的应用程序窗口顶部

    html - 无法让 flexbox 元素水平排列

    html - 垂直和水平居中图标和位于 div 边框上方的文本

    javascript - 打印操作后 Bootstrap Modal 关闭按钮问题

    javascript - 为什么我的 bootstrap javascript 不能在本地运行?

    objective-c - 在 Cocoa 中呈现 XIB 的模式对话框 : best/shortest pattern?

    javascript - avgrund 如何调用激活函数

    html - 无法滚动到容器溢出的 flex 元素顶部

    javascript - Bootstrap 中可点击表格行的模态