当前位置: 首页 > 面试题库 >

使flexbox元素居中和右对齐

秦才英
2023-03-14
问题内容

我想有A B和C中间对齐。

我如何才能D完全右移?

ul {

  padding: 0;

  margin: 0;

  display: flex;

  flex-direction: row;

  justify-content: center;

  align-items: center;

}

li {

  display: flex;

  margin: 1px;

  padding: 5px;

  background: #aaa;

}

li:last-child {

  background: #ddd;

  /* magic to throw to the right*/

}


<ul>

  <li>A</li>

  <li>B</li>

  <li>C</li>

  <li>D</li>

</ul>

问题答案:

以下是实现此布局的五个选项:

  • CSS定位
  • 带有不可见DOM元素的Flexbox
  • 带有不可见伪元素的Flexbox
  • Flexbox与 flex: 1
  • CSS网格布局

方法1:CSS定位属性

应用于position: relativeflex容器。

应用于position: absolute项目D。

现在,此项目已完全放置在flex容器中。

更具体地说,项目D从文档流中删除,但停留在最接近的祖先的范围内。

使用CSS偏移属性top并将right此元素移到适当位置。

li:last-child {
  position: absolute;
  top: 0;
  right: 0;
  background: #ddd;
}
ul {
  position: relative;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: center;
}
li {
  display: flex;
  margin: 1px;
  padding: 5px;
  background: #aaa;
}
p {
  text-align: center;
  margin-top: 0;
}
span {
  background-color: aqua;
}
<ul>
  <li>A</li>
  <li>B</li>
  <li>C</li>
  <li>D</li>
</ul>
<p><span>true center</span></p>

运行代码段展开摘要
此方法的一个警告是,某些浏览器可能无法从正常流程中完全删除绝对定位的flex项目。这会以非标准的意外方式更改对齐方式。更多详细信息:绝对定位的弹性项目不会从IE11的常规流中移除

方法2:Flex自动边距和不可见的Flex项(DOM元素)

结合使用页auto边距和新的,不可见的柔性项目,可以实现布局。

新的弹性项目与项目D相同,并位于另一端(左边缘)。

更具体地说,因为弯曲对齐基于自由空间的分布,所以新项目是保持三个中间框水平居中的必要平衡。新项目的宽度必须与现有D项目的宽度相同,否则中间框将无法精确居中。

使用将该新项目从视图中删除visibility: hidden。

简而言之:

  • 创建该D元素的副本。
  • 将其放在列表的开头。
  • 使用Flex auto利润率保持A,B并C居中,既有D元素创建从两端完全平衡。
  • 申请visibility: hidden副本D
li:first-child {
  margin-right: auto;
  visibility: hidden;
}
li:last-child {
  margin-left: auto;
  background: #ddd;
}
ul {
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: center;
}
li {
  display: flex;
  margin: 1px;
  padding: 5px;
  background: #aaa;
}
p { text-align: center; margin-top: 0; }
span { background-color: aqua; }
<ul>
  <li>D</li><!-- new; invisible spacer item -->
  <li>A</li>
  <li>B</li>
  <li>C</li>
  <li>D</li>
</ul>
<p><span>true center</span></p>

方法3:Flex自动保证金和不可见的Flex项(伪元素)

此方法与#2相似,但在语义上更简洁,并且D必须知道的宽度。

  • 创建一个宽度与相同的伪元素D。
  • 将其放置在容器的开头::before。
  • 使用Flex auto利润率保持A,B而C完全居中,用伪和D元素来创建从两端完全平衡。
ul::before {
  content:"D";
  margin: 1px auto 1px 1px;
  visibility: hidden;
  padding: 5px;
  background: #ddd;
}
li:last-child {
  margin-left: auto;
  background: #ddd;
}
ul {
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: center;
}
li {
  display: flex;
  margin: 1px;
  padding: 5px;
  background: #aaa;
}
p { text-align: center; margin-top: 0; }
span { background-color: aqua; }
<ul>
  <li>A</li>
  <li>B</li>
  <li>C</li>
  <li>D</li>
</ul>
<p><span>true center</span></p>

方法4:添加flex: 1到左侧和右侧项目

从上面的方法2或方法3开始,不必担心左右项目的宽度相等以保持相等的平衡,只需为每个项目分配一个即可flex: 1。这将迫使它们都占用可用空间,从而使中间项居中。

然后,您可以添加display: flex到各个项目以使其内容对齐。

关于在以下情况下使用此方法的min-height注意事项:目前,在Chrome,Firefox,Edge和其他可能的浏览器中,速记规则flex: 1细分如下:

  • flex-grow: 1
  • flex-shrink: 1
  • flex-basis: 0%

当在容器上使用该百分比单位(%)时,flex-basis此方法将中断min-height。这是因为,通常来说,子级上的百分比高度要求height在父级上进行显式的属性设置。

这是一条可以追溯到1998年(CSS Level 2)的旧CSS规则,该规则在某种程度上仍在许多浏览器中有效。有关完整的详细信息,

这是user2651804在评论中发布的问题的说明:

#flex-container {
  display: flex;
  flex-direction: column;
  background: teal;
  width: 150px;
  min-height: 80vh;
  justify-content: space-between;
}

#flex-container>div {
  background: orange;
  margin: 5px;
}

#flex-container>div:first-child {
  flex: 1;
}

#flex-container::after {
  content: "";
  flex: 1;
}
<div id="flex-container">
  <div>very long annoying text that will add on top of the height of its parent</div>
  <div>center</div>
</div>

解决方案是不使用百分比单位。尝试一下px或根本不尝试(这实际上是规范的建议,尽管事实上至少有一些主要的浏览器出于某种原因附加了百分比单位)。

#flex-container {
  display: flex;
  flex-direction: column;
  background: teal;
  width: 150px;
  min-height: 80vh;
  justify-content: space-between;
}

#flex-container > div {
  background: orange;
  margin: 5px;
}


/* OVERRIDE THE BROWSER SETTING IN THE FLEX PROPERTY */

#flex-container > div:first-child {
  flex: 1;
  flex-basis: 0;
}

#flex-container::after {
  content: "";
  flex: 1;
  flex-basis: 0;
}


/* OR... JUST SET THE LONG-HAND PROPERTIES INDIVIDUALLY

#flex-container > div:first-child {
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: 0;
}

#flex-container::after {
  content: "";
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: 0;
}
 */

<div id="flex-container">
  <div>very long annoying text that will add on top of the height of its parent</div>
  <div>center</div>
</div>

方法5:CSS网格布局

这可能是最干净,最有效的方法。无需绝对定位,伪造元素或其他黑客手段。

只需创建一个具有多列的网格。然后将项目放在中间和结尾列中。基本上,只需将第一列留空。

ul {
  display: grid;
  grid-template-columns: 1fr repeat(3, auto) 1fr;
  grid-column-gap: 5px;
  justify-items: center;
}

li:nth-child(1) { grid-column-start: 2; }
li:nth-child(4) { margin-left: auto; }

/* for demo only */
ul { padding: 0; margin: 0; list-style: none; }
li { padding: 5px; background: #aaa; }
p  { text-align: center; }
<ul>
  <li>A</li>
  <li>B</li>
  <li>C</li>
  <li>D</li>
</ul>
<p><span>| true center |</span></p>


 类似资料:
  • 我想在中间对齐和。 如何使完全向右移动? 以前: 之后: https://jsfiddle.net/z44p7bsx/

  • 问题内容: 我正在使用flexbox对齐我的子元素。我想做的是将一个元素居中,而另一个保持最左对齐。通常我会使用来设置left元素。问题是将中心元素推离中心。这是可能的 ,而不 使用绝对定位? HTML和CSS 问题答案: 编辑: 请参阅下面的[Solo答案,这是更好的解决方案。 flexbox背后的想法是提供一个框架,可以轻松地将容器中尺寸可变的元素对齐。这样,提供一个布局而完全忽略一个元素的宽

  • 问题内容: 我有一些孩子: 我想要以下布局: 无论文本中有多少文本,我都希望始终将其始终停留在底部,而不会将其从流程中移出。我听说这可以通过Flexbox实现,但我无法使其正常工作。 问题答案: 您可以使用自动边距 在通过和对齐之前,任何正的自由空间都会分配给该维度中的自动边距。 因此,您可以使用以下一种(或两种): 或者,您可以在增长之前使元素填充可用空间:

  • 我与一些孩子有: 我想要以下布局: 无论中有多少文本,我都希望将始终贴在底部,而不将其从流中取出。我听说Flexbox可以实现这一点,但我不能让它工作。

  • 问题内容: 如何使用flexbox在容器内水平和垂直居中div。在下面的示例中,我希望每个数字都彼此相邻(按行),并水平居中。 问题答案: 我认为您想要以下内容。 你的元素应该是块级(而非)如果你想要的高度和顶部/底部填充,以正常工作。 另外,在上,将宽度设置为而不是。 您的属性很好。 如果您希望垂直居中于视口中,请为和分配100%的高度,然后将页边距清零。 请注意,需要一个高度才能看到垂直对齐效

  • 如何使用FlexBox在容器内水平和垂直地居中div。在下面的例子中,我希望每一个数字在彼此下面(在行中),水平居中。 null null http://codepen.io/anon/pen/zlxbo