如何在容器中使用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


当前回答

我想你想要的东西是这样的。

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>

参见demo: http://jsfiddle.net/audetwebdesign/tFscL/

如果你想让高度和上下填充正常工作,你的.flex-item元素应该是块级(div而不是span)。

同样,在.row上,将宽度设置为auto,而不是100%。

你的.flex-container属性没问题。

如果你想要.row在视图端口中垂直居中,为html和body指定100% height,并将body边距归零。

请注意,.flex-container需要一个高度来查看垂直对齐效果,否则,容器将计算包含内容所需的最小高度,该高度小于本例中的视图端口高度。

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

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

其他回答

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

以下是两种一般的定心方案。

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

在这两种情况下,居中div的高度可以是可变的,未定义的,未知的,等等。居中divs的高度并不重要。

下面是两者的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 */
}

DEMO


当伸缩项目水平堆叠时:

从上面的代码调整弯曲方向规则。

#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;
}

DEMO


将伸缩项的内容居中

伸缩格式化上下文的范围仅限于父子关系。伸缩容器的子容器以外的子容器不参与伸缩布局,并将忽略伸缩属性。本质上,flex属性不能在子属性之外继承。

因此,您总是需要将display: flex或display: 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 */
}

更多细节在这里:如何垂直对齐文本在一个flexbox?

或者,您可以将margin: auto应用于伸缩项的content元素。

p { margin: auto; }

了解flex自动边距:对齐flex项目的方法(见方框#56)。


将多行伸缩项目居中

当一个伸缩容器有多行(由于换行)时,align-content属性对于跨轴对齐是必要的。

来自规范:

8.4. 包装柔性线:对齐内容 财产 控件中的align-content属性对齐伸缩容器的行 当十字轴上有额外空间时,使用Flex容器,类似于 justify-content如何在主轴中对齐单个项。 注意,此属性对单行伸缩容器不起作用。

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


浏览器支持

除了IE < 10,所有主流浏览器都支持Flexbox。一些最新版本的浏览器,如Safari 8和IE10,需要使用厂商前缀。要快速添加前缀,请使用Autoprefixer。更多细节在这个答案中。


针对旧浏览器的居中解决方案

关于使用CSS表和定位属性的另一个定心解决方案,请参阅这个答案:https://stackoverflow.com/a/31977476/3597276

您可以在flex-container中添加flex-direction:column

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

将display:inline-block添加到flex-item

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

因为您添加的宽度和高度对该元素没有影响,因为它具有内联显示。尝试添加display:inline-block或display:block。了解更多关于宽度和高度的知识。

也添加到row类(你被给予row{}而不是作为样式)

.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>

你可以利用

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

在父组件上

结果:

CODE

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-container div用于垂直和水平居中你的行div,和行div用于分组你的“项目”,并在一个基于列的顺序。

如果你需要在链接中居中显示文本,这可以做到:

div { 显示:flex; 宽度:200 px; 身高:80 px; 背景颜色:黄色; } 一个{ 显示:flex; 对齐项目:中心; justify-content:中心; text-align:中心;/*只对多行重要*/ 填充:0 20px; 背景颜色:银色; 边框:2px纯蓝色; } < div > 文本< a href = " # " > < / > <a href="#">文本与两行</a> < / div >