我想让 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>
https://jsfiddle.net/z44p7bsx/
原文由 hazyred 发布,翻译遵循 CC BY-SA 4.0 许可协议
以下是实现此布局的五个选项:
flex: 1
的弹性盒方法 #1:CSS 定位属性
应用
position: relative
到弹性容器。将
position: absolute
应用于 D 项。现在这个项目绝对定位在 flex 容器中。
更具体地说,项目 D 已从文档流中删除,但仍位于 最近定位的祖先 的范围内。
使用 CSS 偏移属性
top
和right
将此元素移动到位。这种方法的 一个警告 是,某些浏览器可能无法从正常流程中完全删除绝对定位的弹性项目。这会以一种非标准的、意想不到的方式改变对齐方式。更多细节: 绝对定位的弹性项目不会从 IE11 中的正常流程中删除
方法 #2:Flex 自动边距和不可见的 Flex 项目(DOM 元素)
结合
auto
边距 和一个新的、不可见的弹性项目,可以实现布局。新的弹性项目与项目 D 相同,并放置在另一端(左边缘)。
更具体地说,因为 flex 对齐是基于自由空间的分布,所以新项目是保持三个中间框水平居中的必要平衡。新项目必须与现有 D 项目的宽度相同,否则中间的框不会精确居中。
使用
visibility: hidden
从视图中删除新项目。简而言之:
D
元素的副本。auto
margins to keepA
,B
andC
centered, with bothD
elements creating equal balance从两端。visibility: hidden
到副本D
方法#3:Flex Auto Margins & Invisible Flex Item(伪元素)
这种方法类似于#2,除了它在语义上更清晰,而且必须知道
D
的宽度。D
宽度相同的伪元素。::before
。auto
margins to keepA
,B
andC
perfectly centered, with the pseudo andD
elements从两端创造平等的平衡。方法#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%
--- 上的 百分比单位 (%) 在容器上使用
min-height
flex-basis
时会导致此方法中断。这是因为,作为一般规则,子级的百分比高度需要父级的显式height
属性设置。这是一个可以追溯到 1998 年的旧 CSS 规则( CSS Level 2 ),它在某种程度上仍然在许多浏览器中有效。有关完整的详细信息,请参见 此处 和 此处。
这是 user2651804 在评论中发布的问题的说明:
解决方案是不使用百分比单位。试试
px
或者什么都不做( 这是规范实际推荐 的,尽管至少有一些主要浏览器出于某种原因附加了一个百分比单位)。方法 #5:CSS 网格布局
这可能是最干净和最有效的方法。不需要绝对定位、虚假元素或其他黑客行为。
只需创建一个包含多列的网格。然后将您的项目放置在中间列和末尾列。基本上,只需将第一列留空。