【问题标题】:vertical-align with Bootstrap 3与 Bootstrap 3 垂直对齐
【发布时间】:2013-12-31 02:51:25
【问题描述】:

我正在使用 Twitter Bootstrap 3,当我想垂直对齐两个 div 时遇到问题,例如 — JSFiddle link

<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">

<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap-theme.min.css">

<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<div class="row">
  <div class="col-xs-5">
    <div style="height:5em;border:1px solid #000">Big</div>
  </div>
  <div class="col-xs-5">
    <div style="height:3em;border:1px solid #F00">Small</div>
  </div>
</div>

Bootstrap 中的网格系统使用float: left,而不是display:inline-block,所以属性vertical-align 不起作用。我尝试使用margin-top 来修复它,但我认为这对于响应式设计来说不是一个好的解决方案。

【问题讨论】:

  • 不不,我想垂直对齐 2 div,没有里面的文字,像这样 jsfiddle.net/corinem/Aj9H9 但在这个例子中我不使用引导程序
  • 重要提示:两列都需要“vcenter”类。否则它将无法正常工作。现在花了一个小时才弄清楚这一点。
  • 对于我来说,没有一个答案在 chrome IE8 和移动设备上完美运行,其中一行包含 5 col-(和 3 col- on mobile)
  • 在 Bootstrap 4 中,垂直居中对齐非常不同:stackoverflow.com/a/41464397/171456

标签: html css twitter-bootstrap twitter-bootstrap-3


【解决方案1】:

2020 年更新

我知道最初的问题是针对 Bootstrap 3,但现在 Bootstrap 4 已经发布,这里有一些关于垂直中心的更新指南。

重要! 垂直中心是相对于父级的高度

如果您尝试居中的元素的父元素没有定义 高度没有垂直居中解决方案可以工作!

引导程序 4

现在 Bootstrap 4 默认为 flexbox,有许多不同的垂直对齐方法可以使用:auto-marginsflexbox utils,或 display utils 以及 vertical align utils。起初“垂直对齐工具”似乎很明显,但这些适用于内联和表格显示元素。以下是一些 Bootstrap 4 垂直居中选项..


1 - 使用自动边距的垂直居中:

另一种垂直居中的方法是使用my-auto。这将使元素在其容器中居中。例如,h-100 使行全高,my-auto 将使col-sm-12 列垂直居中。

<div class="row h-100">
    <div class="col-sm-12 my-auto">
        <div class="card card-block w-25">Card</div>
    </div>
</div>

Bootstrap 4 - Vertical center using auto-margins Demo

my-auto表示垂直y轴上的边距,相当于:

margin-top: auto;
margin-bottom: auto;

2 - Flexbox 垂直居中:

由于 Bootstrap 4 .row 现在是 display:flex 您可以简单地在任何列上使用 align-self-center 将其垂直居中...

       <div class="row">
           <div class="col-6 align-self-center">
                <div class="card card-block">
                 Center
                </div>
           </div>
           <div class="col-6">
                <div class="card card-inverse card-danger">
                    Taller
                </div>
          </div>
    </div>

或者,在整个.row 上使用align-items-center 将行中的所有col-* 垂直居中对齐...

       <div class="row align-items-center">
           <div class="col-6">
                <div class="card card-block">
                 Center
                </div>
           </div>
           <div class="col-6">
                <div class="card card-inverse card-danger">
                    Taller
                </div>
          </div>
    </div>

Bootstrap 4 - Vertical center different height columns Demo


3 - 使用显示工具的垂直居中:

Bootstrap 4 具有display utils,可用于display:tabledisplay:table-celldisplay:inline 等。这些可与vertical alignment utils 一起使用以对齐内联、内联块或表格单元格元素。

<div class="row h-50">
    <div class="col-sm-12 h-100 d-table">
        <div class="card card-block d-table-cell align-middle">
            I am centered vertically
        </div>
    </div>
</div>

Bootstrap 4 - Vertical center using display utils Demo

另见: Vertical Align Center in Bootstrap 4


引导程序 3

要居中的项目容器上的 Flexbox 方法:

.display-flex-center {
    display: flex;
    align-items: center;
}

转换 translateY 方法:

.transform-center-parent {
    position: relative;
    transform-style: preserve-3d;
}

.transform-center {
    position: relative;
    top: 50%;
    transform: translateY(-50%);
}

显示内联方法:

.display-inline-block {
    display: inline;
}
.display-inline-block > div {
    display: inline-block;
    float: none;
    vertical-align: middle;
}

Demo of Bootstrap 3 centering methods

【讨论】:

  • Heremx-auto(水平居中)的引导文档,因此my-auto 垂直居中(y 轴)是有意义的。
  • bootstrap 3 解决方案 +1 您应该得到这个价格
【解决方案2】:

我花了很多时间从这里尝试解决方案,但没有一个对我有帮助。几个小时后,我相信这将允许您将 BS3 中的任何子元素居中。

CSS

.vertical-center {
  display: flex;
  flex-direction: column;
  justify-content: center;
}

HTML

<div class="col-md-6 vertical-center">
    <div class="container">
        <div class="row">
        </div> 
    </div>   
</div>

【讨论】:

    【解决方案3】:

    对于最新版本的引导程序,您可以使用align-items-center。在 flexbox 容器上使用 align-items 实用程序来更改 flex 项目在交叉轴上的对齐方式(y 轴开始,x 轴如果 flex-direction: 列)。从开始、结束、中心、基线或拉伸中选择(浏览器默认)。

    <div class="d-flex align-items-center">
        ...
    </div>
    

    【讨论】:

      【解决方案4】:

      我刚刚做了这个,它做了我想做的事。

      .align-middle {
        margin-top: 25%;
        margin-bottom: 25%;
      }
      

      现在我的页面看起来像

      <div class='container-fluid align-middle'>
          content
      
       +--------------------------------+
       |                                |
       |  +--------------------------+  |
       |  |                          |  |
       |  |                          |  |
       |  |                          |  |
       |  |                          |  |
       |  |                          |  |
       |  +--------------------------+  |
       |                                |
       +--------------------------------+
      

      【讨论】:

      【解决方案5】:

      好的,我不小心混合了一些解决方案,现在它终于适用于我的布局,我尝试使用最小分辨率的 Bootstrap 列制作一个 3x3 表格。

      /* Required styles */
      
      #grid a {
        display: table;
      }
      
      #grid a div {
        display: table-cell;
        vertical-align: middle;
        float: none;
      }
      
      
      /* Additional styles for demo: */
      
      body {
        padding: 20px;
      }
      
      a {
        height: 40px;
        border: 1px solid #444;
      }
      
      a > div {
        width: 100%;
        text-align: center;
      }
      <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
      
      <div id="grid" class="clearfix row">
        <a class="col-xs-4 align-center" href="#">
          <div>1</div>
        </a>
        <a class="col-xs-4 align-center" href="#">
          <div>2</div>
        </a>
        <a class="col-xs-4 align-center" href="#">
          <div>3</div>
        </a>
        <a class="col-xs-4 align-center" href="#">
          <div>4</div>
        </a>
        <a class="col-xs-4 align-center" href="#">
          <div>5</div>
        </a>
        <a class="col-xs-4 align-center" href="#">
          <div>6</div>
        </a>
        <a class="col-xs-4 align-center" href="#">
          <div>7</div>
        </a>
        <a class="col-xs-4 align-center" href="#">
          <div>8</div>
        </a>
        <a class="col-xs-4 align-center" href="#">
          <div>9</div>
        </a>
      </div>

      【讨论】:

        【解决方案6】:

        不需要表格和表格单元格。使用变换可以轻松实现。

        示例:http://codepen.io/arvind/pen/QNbwyM

        代码:

        .child {
          height: 10em;
          border: 1px solid green;
          position: relative;
        }
        .child-content {
          position: absolute;
          top: 50%;
          left: 50%;
          -webkit-transform: translate(-50%, -50%);
          transform: translate(-50%, -50%);
        }
        <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" />
        <div class="row parent">
          <div class="col-xs-6 col-lg-6 child">
            <div class="child-content">
              <div style="height:4em;border:1px solid #000">Big</div>
            </div>
          </div>
          <div class="col-xs-6 col-lg-6 child">
            <div class="child-content">
              <div style="height:3em;border:1px solid #F00">Small</div>
            </div>
          </div>
        </div>

        【讨论】:

          【解决方案7】:

              div{
                  border: 1px solid;
              }
              span{
                  display: flex;
                  align-items: center;
              }
              .col-5{
                  width: 100px;
                  height: 50px;
                  float: left;
                  background: red;
              }
              .col-7{
                  width: 200px;
                  height: 24px;
          
                  float: left;
                  background: green;
              }
              <span>
                  <div class="col-5">
                  </div>
                  <div class="col-7"></div>
              </span>

          【讨论】:

            【解决方案8】:

            有几种方法可以做到:

            1. 使用

              display: table-cell;
              vertical-align: middle;
              

              和容器的CSS到

              display: table;
              
            2. 使用 padding 和 media-screen 来更改相对于屏幕大小的填充。 Google @media 屏幕以了解更多信息。

            3. 使用相对填充

              即,以 % 的形式指定填充

            【讨论】:

              【解决方案9】:

              自 Bootstrap 4 起原生支持 Flex 行为。在 row div 中添加 d-flex align-items-center。您不再需要修改 CSS 内容。

              简单示例:http://jsfiddle.net/vgks6L74/

              <!-- language: html -->
              <div class="row d-flex align-items-center">
                <div class="col-5 border border-dark" style="height:10em">  Big </div>
                <div class="col-2 border border-danger" style="height:3em"> Small </div>
              </div>
              

              以你的例子: http://jsfiddle.net/7zwtL702/

              <!-- language: html -->
              <div class="row d-flex align-items-center">
                  <div class="col-5">
                      <div class="border border-dark" style="height:10em">Big</div>
                  </div>
                  <div class="col-2">
                      <div class="border border-danger" style="height:3em">Small</div>
                 </div>
              </div>
              

              来源:Flex · Bootstrap

              【讨论】:

                【解决方案10】:

                这是我的解决方案。只需将此类添加到您的 CSS 内容中即可。

                .align-middle {
                  display: flex;
                  justify-content: center;
                  align-items: center;
                }
                

                那么您的 HTML 将如下所示:

                <div class="col-xs-12 align-middle">
                  <div class="col-xs-6" style="background-color:blue;">
                    <h3>Item</h3>
                    <h3>Item</h3>
                  </div>
                  <div class="col-xs-6" style="background-color:red;">
                    <h3>Item</h3>
                  </div>
                </div>
                

                .align-middle {
                  display: flex;
                  justify-content: center;
                  align-items: center;
                }
                <html>
                  <head>
                    <meta charset="utf-8">
                    <meta http-equiv="X-UA-Compatible" content="IE=edge">
                    <meta name="viewport" content="width=device-width, initial-scale=1">
                    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
                <!DOCTYPE html>
                    <title>Title</title>
                  </head>
                  <body>
                    <div class="container">
                      <div class="row">
                        <div class="col-xs-12 align-middle">
                          <div class="col-xs-6" style="background-color:blue;">
                            <h3>Item</h3>
                            <h3>Item</h3>
                          </div>
                          <div class="col-xs-6" style="background-color:red;">
                            <h3>Item</h3>
                          </div>
                        </div>
                      </div>
                    </div>
                    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
                    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
                  </body>
                </html>

                【讨论】:

                • 这会破坏响应类,例如 col-md-6
                【解决方案11】:

                根据David Walsh Vertical center CSS,我更喜欢这种方法:

                .children{
                    position: relative;
                    top: 50%;
                    transform: translateY(-50%);
                }
                

                transform 不是必需的;它只是更准确地找到了中心。因此,Internet Explorer 8 的中心化程度可能略低,但仍然不错 - Can I use - Transforms 2d

                【讨论】:

                  【解决方案12】:

                  这个答案提供了一个技巧,但我强烈建议您使用 flexbox(如 @Haschem answer 中所述),因为它现在在所有地方都受支持。

                  演示链接:
                  - Bootstrap 3
                  - Bootstrap 4 alpha 6

                  您仍然可以在需要时使用自定义类:

                  .vcenter {
                      display: inline-block;
                      vertical-align: middle;
                      float: none;
                  }
                  <div class="row">
                      <div class="col-xs-5 col-md-3 col-lg-1 vcenter">
                          <div style="height:10em;border:1px solid #000">Big</div>
                      </div><!--
                      --><div class="col-xs-5 col-md-7 col-lg-9 vcenter">
                          <div style="height:3em;border:1px solid #F00">Small</div>
                      </div>
                  </div>

                  Bootply

                  使用inline-block 会在代码块之间添加额外的空间,如果您在代码中留出一个实空间(如...&lt;/div&gt; &lt;/div&gt;...)。如果列大小加起来为 12,这个额外的空间会破坏我们的网格:

                  <div class="row">
                      <div class="col-xs-6 col-md-4 col-lg-2 vcenter">
                          <div style="height:10em;border:1px solid #000">Big</div>
                      </div>
                      <div class="col-xs-6 col-md-8 col-lg-10 vcenter">
                          <div style="height:3em;border:1px solid #F00">Small</div>
                      </div>
                  </div>
                  

                  这里,&lt;div class="[...] col-lg-2"&gt;&lt;div class="[...] col-lg-10"&gt; 之间有额外的空格(回车和 2 个制表符/8 个空格)。所以……

                  让我们踢掉这个多余的空间!

                  <div class="row">
                      <div class="col-xs-6 col-md-4 col-lg-2 vcenter">
                          <div style="height:10em;border:1px solid #000">Big</div>
                      </div><!--
                      --><div class="col-xs-6 col-md-8 col-lg-10 vcenter">
                          <div style="height:3em;border:1px solid #F00">Small</div>
                      </div>
                  </div>
                  

                  注意到看似没用的 cmets &lt;!-- ... --&gt;?它们重要——没有它们,&lt;div&gt; 元素之间的空白将占用布局中的空间,破坏网格系统。

                  注意:Bootply 已更新

                  【讨论】:

                  • 如果您指定的柱网加起来为 12(例如,使用 col-lg-2col-lg-10),则会中断。有趣的是,如果您添加以下 JS 代码(假设是 jQuery),它会设法自行修复:$('.row').html($('.vcenter'));
                  • @pasemes 这是由(众所周知的)inline-blockextra space 引起的。我在编辑中给出了解决方案。
                  • 空白cmets的部分感觉像是深沉、黑暗、邪恶的魔法。它是。但是某个地方的某个人认为它应该有效,所以它确实有效。
                  • 很惊讶还没有人提到这一点,但是,你可以设置“font-size: 0;”而不是评论的东西在内联块 div 的父级上删除“神秘空间”
                  • 无需使用任何 html 注释 或任何 javascript 代码来解决额外空间问题,有一个简单有效的 CSS 技巧:负边距。只需添加 margin-right: -4px;到 .vcenter 类。经过测试并可以与所有浏览器一起使用(旧的 IE6 和 IE7 除外……但谁在乎史前史;))
                  【解决方案13】:

                  HTML

                  <div class="row">
                      <div class="col-xs-2 pull-bottom"
                           style="height:100px;background:blue">
                      </div>
                      <div class="col-xs-8 pull-bottom"
                           style="height:50px;background:yellow">
                      </div>
                  </div>
                  

                  CSS

                  .pull-bottom {
                      display: inline-block;
                      vertical-align: bottom;
                      float: none;
                  }
                  

                  【讨论】:

                    【解决方案14】:

                    试试这个,

                    .exe {
                      font-size: 0;
                    }
                    
                    .exe > [class*="col"] {
                      display: inline-block;
                      float: none;
                      font-size: 14px;
                      font-size: 1rem;
                      vertical-align: middle;
                    }
                    <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet"/>
                    <div class="row  exe">
                       <div class="col-xs-5">
                          <div style="height:5em;border:1px solid grey">Big</div>
                       </div>
                       <div class="col-xs-5">
                           <div style="height:3em;border:1px solid red">Small</div>
                       </div>
                     </div>

                    【讨论】:

                      【解决方案15】:

                      使用 Bootstrap 4(目前处于 alpha 阶段),您可以使用 .align-items-center 类。所以你可以保持 Bootstrap 的响应特性。 对我来说效果很好。见Bootstrap 4 Documentation

                      【讨论】:

                      • 这仅适用于包含元素为 display:flex 的某些项目。
                      【解决方案16】:

                      以下代码对我有用:

                      .vertical-align {
                          display: flex;
                          align-items: center;
                      }
                      

                      【讨论】:

                      • 任何人有一个适用于单列的解决方案?我得到了一行,然后里面只有一个 col-md-6。此解决方案和其他 flexbox 解决方案仅在有 2 列时才有效
                      【解决方案17】:

                      我对@9​​87654321@做了一些阐述,以便在不同屏幕尺寸上混合不同列尺寸时更容易使用。

                      如果您使用Sass,您可以将其添加到您的 scss 文件中:

                      @mixin v-col($prefix, $min-width) {
                          @media (min-width: $min-width) {
                              .col-#{$prefix}-v {
                                  display: inline-block;
                                  vertical-align: middle;
                                  float: none;
                              }
                          }
                      }
                      
                      @include v-col(lg, $screen-lg);
                      @include v-col(md, $screen-md);
                      @include v-col(sm, $screen-sm);
                      @include v-col(xs, $screen-xs);
                      

                      它会生成以下 CSS(如果您不使用 Sass,您可以直接在样式表中使用):

                      @media (min-width: 1200px) {
                          .col-lg-v {
                              display: inline-block;
                              vertical-align: middle;
                              float: none;
                          }
                      }
                      
                      @media (min-width: 992px) {
                          .col-md-v {
                              display: inline-block;
                              vertical-align: middle;
                              float: none;
                          }
                      }
                      
                      @media (min-width: 768px) {
                          .col-sm-v {
                              display: inline-block;
                              vertical-align: middle;
                              float: none;
                          }
                      }
                      
                      @media (min-width: 480px) {
                          .col-xs-v {
                              display: inline-block;
                              vertical-align: middle;
                              float: none;
                          }
                      }
                      

                      现在您可以像这样在响应式列中使用它:

                      <div class="container">
                          <div class="row">
                              <div class="col-sm-7 col-sm-v col-xs-12">
                                  <p>
                                      This content is vertically aligned on tablets and larger. On mobile it will expand to screen width.
                                  </p>
                              </div><div class="col-sm-5 col-sm-v col-xs-12">
                                  <p>
                                      This content is vertically aligned on tablets and larger. On mobile it will expand to screen width.
                                  </p>
                              </div>
                          </div>
                          <div class="row">
                              <div class="col-md-7 col-md-v col-sm-12">
                                  <p>
                                      This content is vertically aligned on desktops and larger. On tablets and smaller it will expand to screen width.
                                  </p>
                              </div><div class="col-md-5 col-md-v col-sm-12">
                                  <p>
                                      This content is vertically aligned on desktops and larger. On tablets and smaller it will expand to screen width.
                                  </p>
                              </div>
                          </div>
                      </div>
                      

                      【讨论】:

                        【解决方案18】:

                        如果您使用的是 Less 版本的 Bootstrap,并且自己编译成 CSS,您可以使用一些实用程序类与 Bootstrap 类一起使用。

                        我发现这些在我想保留 Bootstrap 网格系统的响应性和可配置性的地方(比如使用 -md-sm)工作得非常好,但我希望给定行中的所有列都具有相同的垂直高度(这样我就可以垂直对齐它们的内容并使行中的所有列共享一个共同的中间)。

                        CSS/Less:

                        .display-table {
                            display: table;
                            width: 100%;
                        }
                        .col-md-table-cell {
                            @media (min-width: @screen-md-min) {
                                display: table-cell;
                                vertical-align: top;
                                float: none;
                            }
                        }
                        .col-sm-table-cell {
                            @media (min-width: @screen-sm-min) {
                                display: table-cell;
                                vertical-align: top;
                                float: none;
                            }
                        }
                        .vertical-align-middle {
                            vertical-align: middle;
                        }
                        

                        HTML:

                        <div class="row display-table">
                            <div class="col-sm-5 col-sm-table-cell vertical-align-middle">
                                ...
                            </div>
                            <div class="col-sm-5 col-sm-table-cell vertical-align-middle">
                                ...
                            </div>
                        </div>
                        

                        【讨论】:

                          【解决方案19】:

                          按照接受的答案,如果您不希望自定义标记、分离关注点或仅仅因为您使用 CMS,则以下解决方案可以正常工作:

                          .valign {
                            font-size: 0;
                          }
                          
                          .valign > [class*="col"] {
                            display: inline-block;
                            float: none;
                            font-size: 14px;
                            font-size: 1rem;
                            vertical-align: middle;
                          }
                          <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet"/>
                          <div class="row valign">
                             <div class="col-xs-5">
                                <div style="height:5em;border:1px solid #000">Big</div>
                             </div>
                             <div class="col-xs-5">
                                 <div style="height:3em;border:1px solid #F00">Small</div>
                             </div>
                           </div>

                          这里的限制是您不能从父元素继承字体大小,因为该行将字体大小设置为 0 以去除空白。

                          【讨论】:

                            【解决方案20】:

                            我遇到了同样的问题。就我而言,我不知道外部容器的高度,但这就是我修复它的方法:

                            首先将htmlbody 元素的高度设置为100%。这个很重要!如果没有这个,htmlbody 元素将简单地继承其子元素的高度。

                            html, body {
                               height: 100%;
                            }
                            

                            然后我有一个外部容器类:

                            .container {
                              display: table;
                              width: 100%;
                              height: 100%; /* For at least Firefox */
                              min-height: 100%;
                            }
                            

                            最后是带有类的内部容器:

                            .inner-container {
                              display: table-cell;
                              vertical-align: middle;
                            }
                            

                            HTML 很简单:

                            <body>
                               <div class="container">
                                 <div class="inner-container">
                                    <p>Vertically Aligned</p>
                                 </div>
                               </div>
                            </body>
                            

                            这就是垂直对齐内容所需的全部内容。在小提琴中检查一下:

                            Jsfiddle

                            【讨论】:

                              【解决方案21】:

                              灵活的盒子布局

                              CSS Flexible Box 的出现,解决了许多网页设计师的噩梦1。最 hacky 之一,垂直对齐。现在,即使在未知的高度也可以实现。

                              “二十年的布局黑客即将结束。也许不是明天, 但很快,在我们的余生中。”

                              — CSS 传奇Eric MeyerW3Conf 2013

                              Flexible Box(或简称 Flexbox)是一种专门为布局目的而设计的新布局系统。 specification states

                              Flex 布局表面上类似于块布局。它缺少很多 可以使用的更复杂的以文本或文档为中心的属性 在块布局中,例如浮动和列。作为回报,它变得简单 以及用于分配空间和对齐内容的强大工具 webapps 和复杂网页经常需要的。

                              在这种情况下它有什么帮助?好吧,让我们看看。


                              垂直对齐的列

                              使用 Twitter Bootstrap,我们有 .rows 和一些 .col-*s。我们需要做的就是将所需的.row2 显示为flex container 框,然后通过align-items 属性垂直对齐其所有flex items(列)。

                              EXAMPLE HERE(请仔细阅读cmets)

                              <div class="container">
                                  <div class="row vertical-align"> <!--
                                                  ^--  Additional class -->
                                      <div class="col-xs-6"> ... </div>
                                      <div class="col-xs-6"> ... </div>
                                  </div>
                              </div>
                              
                              .vertical-align {
                                  display: flex;
                                  align-items: center;
                              }
                              

                              输出

                              彩色区域显示列的填充框。

                              澄清align-items: center

                              8.3 Cross-axis Alignment: the align-items property

                              Flex items可以在flex容器当前行的cross axis对齐,类似于justify-content,但方向垂直。 align-items 为所有 flex 容器的项目设置默认对齐方式,包括匿名 flex items

                              align-items: center; 按中心值,flex item 的边距框位于行内cross axis 的中心。


                              大警报

                              重要说明 #1: Twitter Bootstrap 不会在超小型设备中指定列的 width,除非您将 .col-xs-# 类之一指定给列。

                              因此,在这个特定的演示中,我使用了.col-xs-* 类,以便在移动模式下正确显示列,因为它明确指定了列的width

                              但您也可以关闭 Flexbox 布局,只需在特定屏幕尺寸中将display: flex; 更改为display: block;。例如:

                              /* Extra small devices (767px and down) */
                              @media (max-width: 767px) {
                                  .row.vertical-align {
                                      display: block; /* Turn off the flexible box layout */
                                  }
                              }
                              

                              或者你可以像这样specify .vertical-align only on specific screen sizes

                              /* Small devices (tablets, 768px and up) */
                              @media (min-width: 768px) {
                                  .row.vertical-align {
                                      display: flex;
                                      align-items: center;
                                  }
                              }
                              

                              在这种情况下,我会选择@KevinNelsonapproach

                              重要提示 #2: 为简洁起见,省略了供应商前缀。 Flexbox 语法在此期间已更改。新的书面语法不适用于旧版本的网络浏览器(但不如 Internet Explorer 9 旧!Internet Explorer 10 及更高版本支持 Flexbox)。

                              这意味着您还应该在生产模式下使用带有供应商前缀的属性,例如 display: -webkit-box 等。

                              如果您点击Demo 中的“切换编译视图”,您将看到 CSS 声明的前缀版本(感谢Autoprefixer)。


                              内容垂直对齐的全高列

                              正如您在previous demo 中看到的那样,列(弹性项目)不再与其容器(弹性容器框。即.row 元素)一样高。

                              这是因为 align-items 属性使用了 center 值。默认值为stretch,以便项目可以填满父元素的整个高度。

                              为了解决这个问题,您也可以将display: flex; 添加到列中:

                              EXAMPLE HERE (再次提醒,请注意 cmets)

                              .vertical-align {
                                display: flex;
                                flex-direction: row;
                              }
                              
                              .vertical-align > [class^="col-"],
                              .vertical-align > [class*=" col-"] {
                                display: flex;
                                align-items: center;     /* Align the flex-items vertically */
                                justify-content: center; /* Optional, to align inner flex-items
                                                            horizontally within the column  */
                              }
                              

                              输出

                              彩色区域显示列的填充框。

                              最后但并非最不重要的一点,请注意这里的演示和代码 sn-ps 旨在为您提供不同的想法,提供实现目标的现代方法。如果您打算在现实世界的网站或应用程序中使用这种方法,请注意“大警报”部分。


                              对于包括浏览器支持在内的进一步阅读,这些资源会很有用:


                              1. Vertically align an image inside a div with responsive height2.最好使用一个额外的类,以免改变 Twitter Bootstrap 的默认 .row

                              【讨论】:

                              • 经过一番研究,我居然发现HTML5Please.com说有足够的支持使用它。那真是太棒了! html5please.com/#flexbox
                              • 这其实是最好的解决方案,应该有更多的支持。当然,我们开发人员必须尽可能多地使用它来传播它。
                              • 我尝试了这个并且没有按预期的方式为我工作,直到我编辑了你的小提琴并意识到这完全没有用并且浪费时间。这样做完全错过了响应式设计的要点,因为当列不适合屏幕时,它们将不再堆叠在其他列之上,从而使对引导程序的需求完全没有用,并使您的站点无响应。要了解我的意思,请将相应示例中的任何 col-xs-* 更改为 col-xs-12,使您的浏览器屏幕非常小(就像移动设备一样)并查看结果:不再响应。
                              • @HashemQolami 尽管您使用的是名为col-* 的类,但您的小提琴/codepens 没有使用引导程序,因此它们具有误导性。您的示例不适用于引导程序;它的网格系统不是基于flex,因此它们是不兼容的。只需在引导驱动的页面中尝试您的任何示例,您就会发现它们不起作用。
                              • @Hashem Qolami 仍然无法为您的建议找到任何用例。 Bootstrap 的核心、显着特征之一是,一旦列不水平放置,它们就会相互堆叠。您的解决方案不再发生这种情况。即使您只加载样式,网格系统也能正常工作,如您所见in this fiddle。没有js;只是CSS。更改渲染区域的大小,它会响应。在您的任何示例中都不会发生这种情况。 “移动优先”的方法丢失了,使得 Bootstrap 变得不必要了。所以这个答案是不正确的、误导的或不完整的。
                              【解决方案22】:

                              我遇到了同样的情况,我想将几​​个 div 元素垂直对齐,发现 Bootstrap 类 col-xx-xx 将样式应用于 div 作为 float: left。

                              我必须在 div 元素上应用样式,例如 style="Float:none" 并且我的所有 div 元素都开始垂直对齐。这是工作示例:

                              <div class="col-lg-4" style="float:none;">
                              

                              JsFiddle Link

                              以防万一有人想了解更多关于 float 属性的信息:

                              W3Schools - Float

                              【讨论】:

                              • 这对我不起作用。我在 Firefox 和 Chrome 中进行了测试。所有面板都是垂直堆叠的。
                              • float:none 会让它们垂直堆叠,这应该是它的工作方式。
                              【解决方案23】:

                              我确实发现以下代码可以使用 Chrome 而不是当前选择的答案以外的其他浏览器:

                              .v-center {
                                  display:table!important; height:125px;
                              }
                              
                              .v-center div[class*='col-'] {
                                 display: table-cell!important;
                                 vertical-align:middle;
                                 float:none;
                              }
                              .v-center img {
                                 max-height:125px;
                              }
                              

                              Bootply Link

                              您可能需要根据需要修改高度(特别是在 .v-center 上)并删除/更改 div[class*='col-'] 上的 div。

                              【讨论】:

                                【解决方案24】:

                                在 div 的 CSS 中试试这个:

                                display: table-cell;
                                vertical-align: middle;
                                

                                【讨论】:

                                • 父元素需要显示:table
                                【解决方案25】:

                                我想我会分享我的“解决方案”,以防它对不熟悉@media 查询的其他人有所帮助。

                                感谢@HashemQolami 的回答,我构建了一些媒体查询,它们可以像 col-* 类一样在移动设备上工作,这样我就可以将 col-* 堆叠起来用于移动设备,但在中心垂直对齐以显示更大的屏幕,例如

                                <div class='row row-sm-flex-center'>
                                    <div class='col-xs-12 col-sm-6'></div>
                                    <div class='col-xs-12 col-sm-6'></div>
                                </div>
                                

                                .

                                .row-xs-flex-center {
                                    display:flex;
                                    align-items:center;
                                }
                                @media ( min-width:768px ) {
                                    .row-sm-flex-center {
                                        display:flex;
                                        align-items:center;
                                    }
                                }
                                @media ( min-width: 992px ) {
                                    .row-md-flex-center {
                                        display:flex;
                                        align-items:center;
                                    }
                                }
                                @media ( min-width: 1200px ) {
                                    .row-lg-flex-center {
                                        display:flex;
                                        align-items:center;
                                    }
                                }
                                

                                对于每个屏幕分辨率需要不同数量的列的更复杂的布局(例如,-xs 为 2 行,-sm 为 3 行,-md 为 4 行等)需要一些更高级的修饰,但对于一个简单的页面与 -xs 堆叠和 -sm 和更大的行,这工作正常。

                                【讨论】:

                                • 在我的情况下,我必须在媒体查询中的类中添加一个clear: both; 才能使其正常工作。
                                • @motaa,抱歉给您带来了困惑...在 BS3 风格中,正如您在我的 HTML 示例中看到的那样,我将其用作 .row 修饰符...所以它应该看起来像 @987654325 @。 BS3 .row 定义处理 clear:both;
                                • 我应该更彻底地分析您的 html 代码。 :) 我确实也使用了 .row 修饰符,但在我的情况下(wordpress),它在父主题中发生了变化,最终导致我再次添加了clear: both;
                                猜你喜欢
                                • 2017-01-19
                                • 2018-10-13
                                • 1970-01-01
                                • 2013-09-11
                                • 2015-03-24
                                • 1970-01-01
                                • 1970-01-01
                                • 2015-10-02
                                相关资源
                                最近更新 更多