将元素与flexbox对齐左对齐和居中

时间:2015-02-24 16:14:31

标签: html css css3 flexbox

我使用flexbox来对齐我的子元素。我想做的是将一个元素居中,让另一个元素与左边对齐。通常我只想使用margin-right: auto设置左元素。问题是将中心元素推离中心。这可能没有使用绝对定位吗?

HTML& CSS



#parent {
  align-items: center;
  border: 1px solid black;
  display: flex;
  justify-content: center;
  margin: 0 auto;
  width: 500px;
}
#left {
  margin-right: auto;
}
#center {
  margin: auto;
}

<div id="parent">
  <span id="left">Left</span>
  <span id="center">Center</span>
</div>
&#13;
&#13;
&#13;

8 个答案:

答案 0 :(得分:40)

添加第三个空元素:

<div class="parent">
  <div class="left">Left</div>
  <div class="center">Center</div>
  <div class="right"></div>
</div>

以下风格:

.parent {
  display: flex;
}
.left, .right {
  flex: 1;
}

只有左右都会增长,并且要归功于......

  • 只有两个不断增长的元素(如果为空则无关紧要)和
  • 两者都获得相同的宽度(它们可以均匀地分配可用空间)

... 中心元素将始终完美居中。

这比我认为的接受答案要好得多,因为你不必将左边内容复制到右边并隐藏它以获得双方相同的宽度,它只是神奇地发生(flexbox是神奇的)。

在行动中:

&#13;
&#13;
.parent {
  display: flex;
}

.left,
.right {
  flex: 1;
}


/* Styles for demonstration */
.parent {
  padding: 5px;
  border: 2px solid #000;
}
.left,
.right {
  padding: 3px;
  border: 2px solid red;
}
.center {
  margin: 0 3px;
  padding: 3px;
  border: 2px solid blue;
}
&#13;
<div class="parent">
  <div class="left">Left</div>
  <div class="center">Center</div>
  <div class="right"></div>
</div>
&#13;
&#13;
&#13;

答案 1 :(得分:18)

编辑:请参阅下面的Solo's answer,这是更好的解决方案。


flexbox背后的想法是提供一个框架,用于在容器内轻松对齐具有可变维度的元素。因此,提供一个完全忽略一个元素的宽度的布局是没有意义的。从本质上讲,这正是绝对定位的目的,因为它使元素脱离正常流程。

据我所知,没有使用position: absolute;没有好办法,所以我建议使用它...但如果你真的不想,或者不能使用绝对定位然后我想你可以使用以下解决方法之一。


如果你知道“左”div的确切宽度,那么你可以将justify-content更改为flex-start(左),然后将“中心”div对齐这样:

#center {
    position: relative;
    margin: auto;
    left: -{half width of left div}px;
}

如果您不知道宽度,则可以在右侧复制“左”,使用justify-content: space-between;,并隐藏新的右侧元素: 为了清楚起见,这真的非常难看......使用绝对定位比复制内容更好。 : - )

#parent {
  align-items: center;
  border: 1px solid black;
  display: flex;
  justify-content: space-between;
  margin: 0 auto;
  width: 500px;
}
#right {
    opacity: 0;
}
<div id="parent">
  <span id="left">Left</span>
  <span id="center">Center</span>
  <span id="right">Left</span>
</div>

答案 2 :(得分:1)

试试这个没有黑客攻击:)

<强> CSS

.container{
  width: 500px;
  margin: 0 auto;
}
.box{
  display: flex;
  align-items: center;/* just in case*/
  justify-content: space-between;
}
.box p:nth-child(2){
  text-align: center;
  background-color: lime;
  flex: 1 1 0px;
}

<强> HTML

<div class="container">
  <div class="box">
    <p>One</p>
    <p>Two</p>
  </div>
</div>

http://codepen.io/whisher/pen/XpGaEZ

答案 3 :(得分:1)

我有另一个解决方案。我认为,在中心元素中添加一个空块是很好的,但是从代码角度来看,它有点难看。我对此的解决方案如下

    <div id="parent">
      <span id="left">Left</span>
      <span id="center">Center</span>
    </div>

   #parent {
      display: flex;    
   }

   #left {
      flex:1;
   } 

   #center {
      flex:1;
   } 

   #parent:after {
      flex:1;
   }

答案 4 :(得分:0)

如果你不想依赖定位,我发现让它真正居中的唯一方法是使用自动边距和负边距的组合来防止中心元素被推翻左对齐的元素。这要求您知道左对齐元素的确切宽度。

&#13;
&#13;
.container {
  height: 100px;
  border: solid 10px skyblue;
  
  display: flex;
  justify-content: center;
}

.block {
  width: 120px;
  background: tomato;
}

.justify-start {
  margin-right: auto;
}

.justify-center {
  margin-right: auto;
  margin-left: -120px;
}
&#13;
<div class="container">
  <div class="block justify-start"></div>
  <div class="block justify-center"></div>
</div>
&#13;
&#13;
&#13;

答案 5 :(得分:0)

由于这是4岁,所以我想用一个更简单的CSS Grid解决方案来更新它。

#parent {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  border: 1px solid black;
  margin: 0 auto;
  width: 500px;
}
#center {
  text-align: center;
}
<div id="parent">
  <span id="left">Left</span>
  <span id="center">Center</span>
</div>

答案 6 :(得分:0)

如果你有一个网格系统,你可以用它来做你想做的事,而无需“额外”的 css。

下面带有引导程序(V 4.X)
注意:它在引擎盖下使用了 flex

<div class="row">
  <div class="col text-left">left</col>
  <div class="col text-center">center</col>
  <div class="col text-right">right</col>
</div>

文档引导:https://getbootstrap.com/docs/4.6/layout/grid/

等等! :)

答案 7 :(得分:-1)

据我所知,使用以下代码可以实现这一点。

https://jsfiddle.net/u5gonp0a/

.box {
    display: flex;
    justify-content: center;
    background-color: green;
    text-align: left;
}

.left {
    padding: 10px;
    background-color: pink;
}

.center {
    padding: 10px;
    background-color: yellow;
    margin: 0 auto;
}
<div class="box">
    <div class="left">left</div>
    <div class="center">center</div>
</div>