Flexbox:增加除最后一行以外的所有项目
Flexbox : grow all items but last line
我目前有这个简单的 Flexbox 布局:
ul {
display: flex;
flex-wrap: wrap;
list-style: none;
padding: 0;
}
li {
flex-grow: 1;
padding: 20px;
margin: 10px;
background: #ddd;
}
<ul>
<li>lorem</li>
<li>ipsum</li>
<li>dolor</li>
<li>sit</li>
<li>amet</li>
<li>consectetur</li>
<li>adipisicing</li>
<li>elit</li>
<li>sed</li>
<li>do</li>
<li>eiusmod</li>
<li>tempor</li>
<li>incididunt</li>
<li>ut</li>
<li>labore</li>
<li>et</li>
<li>dolore</li>
<li>magna</li>
<li>aliqua</li>
</ul>
我希望我的元素填充容器宽度(如现在一样),但让最后一行左对齐。如您所见,最后一行试图填充 space,这有时会使最后一个元素的宽度变丑。
Flexbox 允许我们这样做吗?我找不到办法。
可以设置伪::last-child
。除最后一个 <li>
外,所有 <li>
都在增长
CSS
ul {
display: flex;
flex-wrap: wrap;
list-style: none;
padding: 0;
}
li {
flex-grow: 1;
padding: 20px;
margin: 10px;
background: #ddd;
}
li:last-child {
flex-grow: 0;
}
您可以在 li 上删除 flex-grow: 1
并在 ul
上添加 justify-content: space-between
ul {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
list-style: none;
padding: 0;
}
li {
padding: 20px;
margin: 10px;
background: #ddd;
}
<ul>
<li>lorem</li>
<li>ipsum</li>
<li>dolor</li>
<li>sit</li>
<li>amet</li>
<li>consectetur</li>
<li>adipisicing</li>
<li>elit</li>
<li>sed</li>
<li>do</li>
<li>eiusmod</li>
<li>tempor</li>
<li>incididunt</li>
<li>ut</li>
<li>labore</li>
<li>et</li>
<li>dolore</li>
<li>magna</li>
<li>aliqua</li>
</ul>
更新:原来我没有理解正确,我误读了这个问题,因为它只希望针对最后一个 item列表,而不是最后 行 。不过,为了以后遇到此问题并可能会有所帮助的任何人的利益,将在此处保留以下内容。
如果我对你的理解是正确的,那么为了实现你想要的,你需要在所有 但 上设置 flex-grow
属性您可以通过组合 negation pseudo class :not()
with the :last-child
pseudo class 来完成的最后一项,如下所示:
ul {
display: flex;
flex-wrap: wrap;
list-style: none;
padding: 0;
}
li:not(:last-child) {
flex-grow: 1;
}
li {
padding: 20px;
margin: 10px;
background: #ddd;
}
<ul>
<li>lorem</li>
<li>ipsum</li>
<li>dolor</li>
<li>sit</li>
<li>amet</li>
<li>consectetur</li>
<li>adipisicing</li>
<li>elit</li>
<li>sed</li>
<li>do</li>
<li>eiusmod</li>
<li>tempor</li>
<li>incididunt</li>
<li>ut</li>
<li>labore</li>
<li>et</li>
<li>dolore</li>
<li>magna</li>
<li>aliqua</li>
</ul>
你可以添加一个::after
带有巨大flex-grow
的伪元素,这样li
元素的flex-grow: 1
就可以忽略不计了:
ul::after {
content: '';
flex-grow: 1000000000;
}
ul {
display: flex;
flex-wrap: wrap;
list-style: none;
padding: 0;
}
li {
flex-grow: 1;
padding: 20px;
margin: 10px;
background: #ddd;
}
ul::after {
content: '';
flex-grow: 1000000000;
}
<ul>
<li>lorem</li>
<li>ipsum</li>
<li>dolor</li>
<li>sit</li>
<li>amet</li>
<li>consectetur</li>
<li>adipisicing</li>
<li>elit</li>
<li>sed</li>
<li>do</li>
<li>eiusmod</li>
<li>tempor</li>
<li>incididunt</li>
<li>ut</li>
<li>labore</li>
<li>et</li>
<li>dolore</li>
<li>magna</li>
<li>dolore</li>
<li>magna</li>
<li>aliqua</li>
</ul>
您还可以将带 height: 0
的空项目附加到容器中,让它们占用额外的 space:http://codepen.io/anon/pen/OyOqrG
(从我的codepen复制的源代码:
<div class="container">
<p></p>
<p></p>
<p></p>
...
<p class="empty"></p>
<p class="empty"></p>
</div>
.container {
max-width: 490px;
display: flex;
flex-flow: row wrap;
background-color: #00f;
}
.container p {
min-width: 90px;
margin: 5px;
background-color: #f00;
height: 90px;
flex-grow: 1;
}
.container p.empty {
height: 0;
margin-top: 0;
margin-bottom: 0;
}
遇到了同样的问题,用css网格解决了。网格的最后一条规则左对齐,所有元素具有相同的宽度。
grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
ul {
display: grid;
gap: 10px;
grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
list-style: none;
padding: 0;
}
li {
padding: 20px;
background: #ddd;
}
<ul>
<li>lorem</li>
<li>ipsum</li>
<li>dolor</li>
<li>sit</li>
<li>amet</li>
<li>consectetur</li>
<li>adipisicing</li>
<li>elit</li>
<li>sed</li>
<li>do</li>
<li>eiusmod</li>
<li>tempor</li>
<li>incididunt</li>
<li>ut</li>
<li>labore</li>
<li>et</li>
<li>dolore</li>
<li>magna</li>
<li>aliqua</li>
</ul>
我目前有这个简单的 Flexbox 布局:
ul {
display: flex;
flex-wrap: wrap;
list-style: none;
padding: 0;
}
li {
flex-grow: 1;
padding: 20px;
margin: 10px;
background: #ddd;
}
<ul>
<li>lorem</li>
<li>ipsum</li>
<li>dolor</li>
<li>sit</li>
<li>amet</li>
<li>consectetur</li>
<li>adipisicing</li>
<li>elit</li>
<li>sed</li>
<li>do</li>
<li>eiusmod</li>
<li>tempor</li>
<li>incididunt</li>
<li>ut</li>
<li>labore</li>
<li>et</li>
<li>dolore</li>
<li>magna</li>
<li>aliqua</li>
</ul>
我希望我的元素填充容器宽度(如现在一样),但让最后一行左对齐。如您所见,最后一行试图填充 space,这有时会使最后一个元素的宽度变丑。
Flexbox 允许我们这样做吗?我找不到办法。
可以设置伪::last-child
。除最后一个 <li>
外,所有 <li>
都在增长
CSS
ul {
display: flex;
flex-wrap: wrap;
list-style: none;
padding: 0;
}
li {
flex-grow: 1;
padding: 20px;
margin: 10px;
background: #ddd;
}
li:last-child {
flex-grow: 0;
}
您可以在 li 上删除 flex-grow: 1
并在 ul
justify-content: space-between
ul {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
list-style: none;
padding: 0;
}
li {
padding: 20px;
margin: 10px;
background: #ddd;
}
<ul>
<li>lorem</li>
<li>ipsum</li>
<li>dolor</li>
<li>sit</li>
<li>amet</li>
<li>consectetur</li>
<li>adipisicing</li>
<li>elit</li>
<li>sed</li>
<li>do</li>
<li>eiusmod</li>
<li>tempor</li>
<li>incididunt</li>
<li>ut</li>
<li>labore</li>
<li>et</li>
<li>dolore</li>
<li>magna</li>
<li>aliqua</li>
</ul>
更新:原来我没有理解正确,我误读了这个问题,因为它只希望针对最后一个 item列表,而不是最后 行 。不过,为了以后遇到此问题并可能会有所帮助的任何人的利益,将在此处保留以下内容。
如果我对你的理解是正确的,那么为了实现你想要的,你需要在所有 但 上设置 flex-grow
属性您可以通过组合 negation pseudo class :not()
with the :last-child
pseudo class 来完成的最后一项,如下所示:
ul {
display: flex;
flex-wrap: wrap;
list-style: none;
padding: 0;
}
li:not(:last-child) {
flex-grow: 1;
}
li {
padding: 20px;
margin: 10px;
background: #ddd;
}
<ul>
<li>lorem</li>
<li>ipsum</li>
<li>dolor</li>
<li>sit</li>
<li>amet</li>
<li>consectetur</li>
<li>adipisicing</li>
<li>elit</li>
<li>sed</li>
<li>do</li>
<li>eiusmod</li>
<li>tempor</li>
<li>incididunt</li>
<li>ut</li>
<li>labore</li>
<li>et</li>
<li>dolore</li>
<li>magna</li>
<li>aliqua</li>
</ul>
你可以添加一个::after
带有巨大flex-grow
的伪元素,这样li
元素的flex-grow: 1
就可以忽略不计了:
ul::after {
content: '';
flex-grow: 1000000000;
}
ul {
display: flex;
flex-wrap: wrap;
list-style: none;
padding: 0;
}
li {
flex-grow: 1;
padding: 20px;
margin: 10px;
background: #ddd;
}
ul::after {
content: '';
flex-grow: 1000000000;
}
<ul>
<li>lorem</li>
<li>ipsum</li>
<li>dolor</li>
<li>sit</li>
<li>amet</li>
<li>consectetur</li>
<li>adipisicing</li>
<li>elit</li>
<li>sed</li>
<li>do</li>
<li>eiusmod</li>
<li>tempor</li>
<li>incididunt</li>
<li>ut</li>
<li>labore</li>
<li>et</li>
<li>dolore</li>
<li>magna</li>
<li>dolore</li>
<li>magna</li>
<li>aliqua</li>
</ul>
您还可以将带 height: 0
的空项目附加到容器中,让它们占用额外的 space:http://codepen.io/anon/pen/OyOqrG
(从我的codepen复制的源代码:
<div class="container">
<p></p>
<p></p>
<p></p>
...
<p class="empty"></p>
<p class="empty"></p>
</div>
.container {
max-width: 490px;
display: flex;
flex-flow: row wrap;
background-color: #00f;
}
.container p {
min-width: 90px;
margin: 5px;
background-color: #f00;
height: 90px;
flex-grow: 1;
}
.container p.empty {
height: 0;
margin-top: 0;
margin-bottom: 0;
}
遇到了同样的问题,用css网格解决了。网格的最后一条规则左对齐,所有元素具有相同的宽度。
grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
ul {
display: grid;
gap: 10px;
grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
list-style: none;
padding: 0;
}
li {
padding: 20px;
background: #ddd;
}
<ul>
<li>lorem</li>
<li>ipsum</li>
<li>dolor</li>
<li>sit</li>
<li>amet</li>
<li>consectetur</li>
<li>adipisicing</li>
<li>elit</li>
<li>sed</li>
<li>do</li>
<li>eiusmod</li>
<li>tempor</li>
<li>incididunt</li>
<li>ut</li>
<li>labore</li>
<li>et</li>
<li>dolore</li>
<li>magna</li>
<li>aliqua</li>
</ul>