851

如何使用 flexbox 在容器内水平和垂直居中 div。在下面的示例中,我希望每个数字彼此下方(按行),它们水平居中。

.flex-container {
  padding: 0;
  margin: 0;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: center;
}
row {
  width: 100%;
}
.flex-item {
  background: tomato;
  padding: 5px;
  width: 200px;
  height: 150px;
  margin: 10px;
  line-height: 150px;
  color: white;
  font-weight: bold;
  font-size: 3em;
  text-align: center;
}
<div class="flex-container">
  <div class="row">
    <span class="flex-item">1</span>
  </div>
  <div class="row">
    <span class="flex-item">2</span>
  </div>
  <div class="row">
    <span class="flex-item">3</span>
  </div>
  <div class="row">
    <span class="flex-item">4</span>
  </div>
</div>

http://codepen.io/anon/pen/zLxBo

4

14 回答 14

929

我认为您想要以下内容。

html, body {
    height: 100%;
}
body {
    margin: 0;
}
.flex-container {
    height: 100%;
    padding: 0;
    margin: 0;
    display: flex;
    align-items: center;
    justify-content: center;
}
.row {
    width: auto;
    border: 1px solid blue;
}
.flex-item {
    background-color: tomato;
    padding: 5px;
    width: 20px;
    height: 20px;
    margin: 10px;
    line-height: 20px;
    color: white;
    font-weight: bold;
    font-size: 2em;
    text-align: center;
}
<div class="flex-container">
    <div class="row"> 
        <div class="flex-item">1</div>
        <div class="flex-item">2</div>
        <div class="flex-item">3</div>
        <div class="flex-item">4</div>
    </div>
</div>

参见演示:http: //jsfiddle.net/audetwebdesign/tFscL/

如果您希望高度和顶部/底部填充正常工作,您的.flex-item元素应该是块级(div而不是)。span

此外,在 上.row,将宽度设置为auto而不是100%

你的.flex-container属性很好。

如果您希望在.row视口中垂直居中,请将 100% 高度分配给htmland body,并将body边距归零。

请注意,.flex-container需要一个高度才能看到垂直对齐效果,否则容器会计算包围内容所需的最小高度,该高度小于本示例中的视口高度。

脚注: , ,
属性flex-flow可以使这个设计更容易实现。我认为不需要容器,除非您想在元素周围添加一些样式(背景图像、边框等)。flex-directionflex-wrap.row

一个有用的资源是:http ://demo.agektmr.com/flexbox/

于 2013-09-26T12:13:04.213 回答
308

如何在 Flexbox 中垂直和水平居中元素

以下是两种通用的定心解决方案。

一个用于垂直对齐的弹性项目 ( flex-direction: column),另一个用于水平对齐的弹性项目 ( flex-direction: row)。

在这两种情况下,居中 div 的高度可以是可变的、未定义的、未知的等等。居中 div 的高度无关紧要。

这是两者的 HTML:

<div id="container"><!-- flex container -->

    <div class="box" id="bluebox"><!-- flex item -->
        <p>DIV #1</p>
    </div>

    <div class="box" id="redbox"><!-- flex item -->
        <p>DIV #2</p>
    </div>

</div>

CSS(不包括装饰样式)

当弹性项目垂直堆叠时:

#container {
    display: flex;           /* establish flex container */
    flex-direction: column;  /* make main axis vertical */
    justify-content: center; /* center items vertically, in this case */
    align-items: center;     /* center items horizontally, in this case */
    height: 300px;
}

.box {
    width: 300px;
    margin: 5px;
    text-align: center;     /* will center text in <p>, which is not a flex item */
}

在此处输入图像描述

演示


当弹性项目水平堆叠时:

从上面的代码调整flex-direction规则。

#container {
    display: flex;
    flex-direction: row;     /* make main axis horizontal (default setting) */
    justify-content: center; /* center items horizontally, in this case */
    align-items: center;     /* center items vertically, in this case */
    height: 300px;
}

在此处输入图像描述

演示


将弹性项目的内容居中

flex 格式化上下文的范围仅限于父子关系。超出子元素的 flex 容器的后代不参与 flex 布局,并且将忽略 flex 属性。本质上,flex 属性不能在子级之外继承。

因此,您将始终需要将display: flexdisplay: inline-flex应用于父元素,以便将 flex 属性应用于子元素。

为了使弹性项目中包含的文本或其他内容垂直和/或水平居中,使项目成为(嵌套的)弹性容器,并重复居中规则。

.box {
    display: flex;
    justify-content: center;
    align-items: center;        /* for single line flex container */
    align-content: center;      /* for multi-line flex container */
}

更多细节在这里:如何在弹性框中垂直对齐文本?

或者,您可以应用margin: auto到弹性项目的内容元素。

p { margin: auto; }

在此处了解弹性auto边距:对齐弹性项目的方法(参见框#56)。


将多行弹性项目居中

当 flex 容器有多行时(由于环绕),该align-content属性将是横轴对齐所必需的。

从规范:

8.4. Packing Flex Lines:align-content 属性

当横轴上有额外空间时,该align-content属性在 flex 容器内对齐 flex 容器的线条,类似于在justify-content主轴内对齐单个项目的方式。 请注意,此属性对单行 flex 容器没有影响。

更多细节在这里:flex-wrap 如何与 align-self、align-items 和 align-content 一起工作?


浏览器支持

除了 IE < 10 之外,所有主流浏览器都支持 Flexbox 。一些最新的浏览器版本,例如 Safari 8 和 IE10,需要供应商前缀。要快速添加前缀,请使用Autoprefixer此答案中的更多详细信息。


旧浏览器的居中解决方案

有关使用 CSS 表和定位属性的替代居中解决方案,请参阅此答案:https ://stackoverflow.com/a/31977476/3597276

于 2015-10-10T01:06:34.317 回答
54

添加

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

到您想要居中的任何容器元素。文档: justify-contentalign-items

于 2017-04-12T13:06:27.980 回答
31

你可以利用

display: flex;
align-items: center;
justify-content: center;

在你的父组件上

在此处输入图像描述

于 2019-09-25T05:20:54.200 回答
30

不要忘记使用重要的浏览器特定属性:

对齐项目:居中;-->

-webkit-box-align: center;
-moz-box-align: center;
-ms-flex-align: center;
-webkit-align-items: center;
align-items: center;

证明内容:中心;-->

-webkit-box-pack: center;
-moz-box-pack: center;
-ms-flex-pack: center;
-webkit-justify-content: center;
justify-content: center;

您可以阅读这两个链接以更好地理解 flex: http ://css-tricks.com/almanac/properties/j/justify-content/ 和 http://ptb2.me/flexbox/

祝你好运。

于 2014-06-14T12:02:49.393 回答
16

1 - 将父 div 上的 CSS 设置为display: flex;

2 - 将父 div 上的 CSS 设置为flex-direction: column;
注意,这将使该 div 中的所有内容从上到下排列。如果父 div 仅包含子元素而没有其他内容,这将最有效。

3 - 将父 div 上的 CSS 设置为justify-content: center;

下面是 CSS 外观的示例:

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

于 2018-02-25T22:05:41.637 回答
12

diplay: flex;因为它的容器和margin:auto;它的项目完美。

注意:您必须设置widthandheight才能看到效果。

#container{
  width: 100%; /*width needs to be setup*/
  height: 150px; /*height needs to be setup*/
  display: flex;
}

.item{
  margin: auto; /*These will make the item in center*/
  background-color: #CCC;
}
<div id="container">
   <div class="item">CENTER</div>
</div>

于 2018-11-13T02:27:54.623 回答
7

用这个:

   html, body {
      display: flex;
      align-items: center;
      justify-content: center;
      height: 100%;
   }

对于一些这样的 HTML 标记:

   <html>
      <body>
        <main>
          <button> abc </button>
          <p> something </p>
        </main>
      </body>
    </html>

   html, body {
      display: flex;
      align-items: center;
      justify-content: center;
      height: 100%;
   }
   <html>
      <body>
        <main>
          <button> abc </button>
          <p> something </p>
        </main>
      </body>
    </html>

于 2021-08-26T17:46:21.380 回答
5

margin: auto与 flexbox 一起“完美”工作,即它允许垂直和水平居中项目。

html, body {
  height: 100%;
  max-height: 100%;
}

.flex-container {
  display: flex;
    
  height: 100%;
  background-color: green;
}

.container {
  display: flex;
  margin: auto;
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS</title>
</head>
<body>
  <div class="flex-container">
    <div class="container">
      <div class="row">
        <span class="flex-item">1</span>
      </div>
      <div class="row">
        <span class="flex-item">2</span>
      </div>
      <div class="row">
        <span class="flex-item">3</span>
      </div>
     <div class="row">
        <span class="flex-item">4</span>
    </div>
  </div>  
</div>
</body>
</html>

于 2017-04-20T18:52:47.527 回答
3

如果您需要在链接中将文本居中,这可以解决问题:

div {
  display: flex;

  width: 200px;
  height: 80px;
  background-color: yellow;
}

a {
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center; /* only important for multiple lines */

  padding: 0 20px;
  background-color: silver;
  border: 2px solid blue;
}
<div>
  <a href="#">text</a>
  <a href="#">text with two lines</a>
</div>

于 2017-03-04T17:47:13.013 回答
2

结果: 代码

代码

HTML:

<div class="flex-container">
  <div class="rows">

    <div class="row">
      <span class="flex-item">1</span>
    </div>
    <div class="row">
      <span class="flex-item">2</span>
    </div>
    <div class="row">
      <span class="flex-item">3</span>
    </div>
    <div class="row">
      <span class="flex-item">4</span>
    </div>

  </div>  
</div>

CSS:

html, body {
  height: 100%;  
}

.flex-container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100%;
}

.rows {
  display: flex;
  flex-direction: column;
}

其中flex-containerdiv 用于将您的rowsdiv 垂直和水平居中,而rowsdiv 用于将您的“项目”分组并在基于列的列中对它们进行排序。

于 2019-12-06T13:35:30.270 回答
1

您可以添加flex-direction:columnflex-container

.flex-container {
  flex-direction: column;
}

display:inline-block添加到flex-item

.flex-item {
 display: inline-block;
}

因为您添加width and height的元素对此元素没有影响,因为它的显示为inline. 尝试添加display:inline-blockdisplay:block了解有关宽度高度的更多信息。

还添加到类(给定行{}不被视为样式)

.row{
  width:100%;
  margin:0 auto;
  text-align:center;
}

行中的工作演示:

.flex-container {
  padding: 0;
  margin: 0;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content:center;
  flex-direction:column;
}
.row{
  width:100%;
  margin:0 auto;
  text-align:center;
}
.flex-item {
  background: tomato;
  padding: 5px;
  width: 200px;
  height: 150px;
  margin: 10px;
  line-height: 150px;
  color: white;
  font-weight: bold;
  font-size: 3em;
  text-align: center;
  display: inline-block;
}
<div class="flex-container">
  <div class="row">
    <span class="flex-item">1</span>
  </div>
  <div class="row">
    <span class="flex-item">2</span>
  </div>
  <div class="row">
    <span class="flex-item">3</span>
  </div>
  <div class="row">
    <span class="flex-item">4</span>
  </div>
</div>

专栏中的工作演示:

.flex-container {
  padding: 0;
  margin: 0;
  width: 100%;
  list-style: none;
  display: flex;
  align-items: center;
}
.row {
  width: 100%;
}
.flex-item {
  background: tomato;
  padding: 5px;
  width: 200px;
  height: 150px;
  margin: 10px;
  line-height: 150px;
  color: white;
  font-weight: bold;
  font-size: 3em;
  text-align: center;
  display: inline-block;
}
<div class="flex-container">
  <div class="row">
    <span class="flex-item">1</span>
  </div>
  <div class="row">
    <span class="flex-item">2</span>
  </div>
  <div class="row">
    <span class="flex-item">3</span>
  </div>
  <div class="row">
    <span class="flex-item">4</span>
  </div>
</div>

于 2020-09-19T10:22:16.850 回答
0

希望这会有所帮助。

.flex-container {
  padding: 0;
  margin: 0;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: center;
}
row {
  width: 100%;
}
.flex-item {
  background: tomato;
  padding: 5px;
  width: 200px;
  height: 150px;
  margin: 10px;
  line-height: 150px;
  color: white;
  font-weight: bold;
  font-size: 3em;
  text-align: center;
}
于 2020-03-22T15:37:59.273 回答
-7

使用CSS+

<div class="EXTENDER">
  <div class="PADDER-CENTER">
    <div contentEditable="true">Edit this text...</div>
  </div>
</div>

看看这里

于 2015-12-01T17:58:55.207 回答