使用 flexbox 左对齐和居中对齐元素

Posted

技术标签:

【中文标题】使用 flexbox 左对齐和居中对齐元素【英文标题】:Aligning elements left and center with flexbox 【发布时间】:2015-04-26 08:55:13 【问题描述】:

我正在使用 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>

【问题讨论】:

查看此站点以获取对 flexbox 的引用:css-tricks.com/snippets/css/a-guide-to-flexbox 我没有看到任何解决我的问题的内容。 我把这个链接作为对 flexbox 最准确和全面描述的参考。如果你在那里找不到答案,那么它可能是不可能的。您可以在没有绝对定位的情况下尝试的一件事是使用两个容器。一个会将第一个按钮对齐到左侧,第二个将对齐到中心。然后以负上边距向上推第二个。 是的,没有绝对定位也是可能的。在 html 中创建第三个元素 (#right)。使其与#left 相同,但在容器的另一端除外。将以下 CSS 应用于 #rightvisibility: hiddenmargin-left: auto。现在#left 上的margin-right: auto 将按需要工作。更多细节在这里:***.com/q/35250367/3597276 【参考方案1】:

解决方案 1: 给中心元素 50% 的宽度并使用 justify-content:space-between

#parent 
  display: flex;
  justify-content: space-between;


#center 
  flex-basis: 50%;
<div id="parent">
  <span id="left">Left</span>
  <span id="center">Center</span>
</div>

解决方案2:添加一个虚拟元素并将其隐藏。

#parent 
  display: flex;
  justify-content: space-between;


#right 
 visibility:hidden;
<div id="parent">
  <span id="left">Left</span>
  <span id="center">Center</span>
  <span id="right">Right</span>
</div>

【讨论】:

【参考方案2】:

.parent 
  display: flex;


.left 
  flex: 1;


.parent::after 
  flex: 1;
  content: '';
<div class="parent">
  <div class="left">Left</div>
  <div>Center</div>
</div>

我有另一个解决方案。在我看来,向中心元素添加一个空块很好,但在代码方面它有点难看。

【讨论】:

【参考方案3】:

如果你有一个网格系统,你可以用它来做你想做的事,而不需要“额外的”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/

等等! :)

【讨论】:

【参考方案4】:

因为这是 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>

【讨论】:

【参考方案5】:

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


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

据我所知,如果不使用position: absolute;,没有很好的方法可以做到这一点,所以我建议使用它...但是如果你真的不想,或者不能使用绝对定位,那么我想您可以使用以下解决方法之一。


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

#center 
    position: relative;
    margin: auto;
    left: -half width of left divpx;


如果你不知道宽度,那么你可以在右侧复制“Left”,使用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>

【讨论】:

我不能同意第二种方法“更丑”。它实际上比第一个更好,因为当水平空间不足时 Flexbox 子级不会重叠。【参考方案6】:

添加第三个空元素:

<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 很神奇)。


实际操作:

.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;
<div class="parent">
  <div class="left">Left</div>
  <div class="center">Center</div>
  <div class="right"></div>
</div>

【讨论】:

谢谢,这正是我制作模态窗口标题栏所需要的。 您也可以使用父元素的伪元素代替空元素,例如.parent::aftercontent: ''; flex: 1 这是最简洁的方法!谢谢。 我怎样才能用这种方法做相反的事情? IE。将一个项目居中,将另一个项目放在右边? @Benisburgers 什么都没有移动,内容向左对齐,似乎“移动到中心”,like this。将text-align: right; 添加到类.right【参考方案7】:

试试这个没有黑客:)

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

【讨论】:

这仅在剩余空间内居中。这不是真正的中心【参考方案8】:

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

.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;
<div class="container">
  <div class="block justify-start"></div>
  <div class="block justify-center"></div>
</div>

【讨论】:

我不知道为什么这被否决了,这正是问题的答案,也帮助了我。谢谢! 因为有比硬编码宽度和左边距更好的方法。【参考方案9】:

据我所知,这可以通过以下代码实现。

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>

【讨论】:

整洁!迄今为止对我来说最好的解决方案。 迄今为止最好的!

以上是关于使用 flexbox 左对齐和居中对齐元素的主要内容,如果未能解决你的问题,请参考以下文章

如何居中对齐 flexbox 容器? [复制]

当其他元素居中对齐时,使用 Flexbox 将页脚与页面底部对齐

一个元素左对齐,另一个元素居中对齐,但居中的元素被左元素推动

Flex:对齐按钮向右对齐,内容向左对齐

如何使用 Flexbox 使一个弹性项目居中对齐并右对齐另一个

Flexbox 网格 - 对齐:围绕空格并对齐最后一个项目