如何使用 FlexBox 均匀 space 列?
How to evenly space columns using FlexBox?
我们有一组结果应该显示在三列中。使用 Flexbox
我们能够获得我们想要完成的大部分内容(即所有高度相同,在顶部正确对齐(参见 flex__top
,并在底部正确对齐(参见 flex__bottom
).
但是,我们 运行 遇到一个问题,当 flex__bottom
元素之一的高度与其他元素不同时,对齐将关闭。
我们如何对齐所有列以具有相同的高度,同时让 flex__bottom
部分从相同的位置开始?
目标:
- 确保所有列的高度相同
flex__bottom
中的每个项目都应该有一个与所有其他项目对齐的 border-top
。
问题
期望输出
Codepen 在这里可用,以防在内联代码片段中难以复制
/* Columns */
@media screen and (min-width: 320px) {
.col-m-12 {
width: 100%;
padding: 16px;
display: flex;
justify-content: center;
align-items: stretch;
}
}
@media screen and (min-width: 768px) {
.col-t-4 {
width: calc(33% - 48px);
}
}
/* Flex */
.flex__wrapper {
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: stretch;
flex-direction: row;
flex: 0 1 auto;
}
.flex__link {
display: flex;
align-items: stretch;
justify-content: space-between;
flex-direction: column;
background-color: #eee;
}
.flex__top {
padding: 16px;
}
.flex__bottom {
border-top: 1px solid;
}
/* Image */
img {
height: auto;
display: block;
width: 100%;
}
/* Lists */
ul {
list-style: none;
}
ul>li {
display: inline-flex;
border: 1px solid;
margin: 4px;
padding: 4px;
}
/* Link */
a {
text-decoration: none;
color: #000;
}
<div class="flex__wrapper">
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/arch" class="flex__img">
<h2 class="flex__h2">Check back tomorrow;</h2>
<p>I will see if the book has arrived.</p>
</div>
<div class="flex__bottom">
<ul>
<li>Learn More</li>
</ul>
</div>
</a>
</div>
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/nature" class="flex__img">
<h2 class="flex__h2">I am happy</h2>
<p>I am never at home on Sundays.</p>
</div>
<div class="flex__bottom">
<ul>
<li>Learn More</li>
<li>Progressively matrix</li>
<li>Uniquely build extensible</li>
<li>seamless customer</li>
</ul>
</div>
</a>
</div>
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/people" class="flex__img">
<h2 class="flex__h2">Malls are great places to shop</h2>
<p>I can find everything I need under one roof.</p>
</div>
<div class="flex__bottom">
<ul>
<li>maximizing</li>
<li>Monotonectally whiteboard</li>
</ul>
</div>
</a>
</div>
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/tech" class="flex__img">
<h2 class="flex__h2">I want to buy</h2>
<p>but know it won’t suit me.</p>
</div>
<div class="flex__bottom">
<ul>
<li>Learn More</li>
<li>task error-free</li>
<li>Energistically</li>
<li>practices</li>
<li>ethical methodologies</li>
<li>task error-free</li>
</ul>
</div>
</a>
</div>
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/animals" class="flex__img">
<h2 class="flex__h2">Last Friday in three week</h2>
<p>Blue worm shake hands with a legless lizard.</p>
</div>
<div class="flex__bottom">
<ul>
<li>Learn More</li>
<li>incubate</li>
</ul>
</div>
</a>
</div>
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/animals/grayscale" class="flex__img">
<h2 class="flex__h2">She advised</h2>
<p>him to come back at once.</p>
</div>
<div class="flex__bottom">
<ul>
<li>Learn More</li>
<li>Seamlessly</li>
<li>build excellent</li>
</ul>
</div>
</a>
</div>
</div>
如果您可以限制项目标题和描述中的内容量,您可以将 min-height 添加到 .flex-top
。
/* Columns */
@media screen and (min-width: 320px) {
.col-m-12 {
width: 100%;
padding: 16px;
display: flex;
justify-content: center;
align-items: stretch;
}
}
@media screen and (min-width: 768px) {
.col-t-4 {
width: calc(33% - 48px);
}
}
/* Flex */
.flex__wrapper {
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: stretch;
flex-direction: row;
flex: 0 1 auto;
}
.flex__link {
display: flex;
flex-direction: column;
background-color: #eee;
}
.flex__top {
padding: 0 16px;
min-height: 350px;
}
.flex__bottom {
border-top: 1px solid;
}
/* Image */
img {
height: auto;
display: block;
width: 100%;
}
/* Lists */
ul {
list-style: none;
}
ul>li {
display: inline-flex;
border: 1px solid;
margin: 4px;
padding: 4px;
}
/* Link */
a {
text-decoration: none;
color: #000;
}
<div class="flex__wrapper">
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/arch" class="flex__img">
<h2 class="flex__h2">Check back tomorrow;</h2>
<p>I will see if the book has arrived.</p>
</div>
<div class="flex__bottom">
<ul>
<li>Learn More</li>
</ul>
</div>
</a>
</div>
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/nature" class="flex__img">
<h2 class="flex__h2">I am happy</h2>
<p>I am never at home on Sundays.</p>
</div>
<div class="flex__bottom">
<ul>
<li>Learn More</li>
<li>Progressively matrix</li>
<li>Uniquely build extensible</li>
<li>seamless customer</li>
</ul>
</div>
</a>
</div>
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/people" class="flex__img">
<h2 class="flex__h2">Malls are great places to shop</h2>
<p>I can find everything I need under one roof.</p>
</div>
<div class="flex__bottom">
<ul>
<li>maximizing</li>
<li>Monotonectally whiteboard</li>
</ul>
</div>
</a>
</div>
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/tech" class="flex__img">
<h2 class="flex__h2">I want to buy</h2>
<p>but know it won’t suit me.</p>
</div>
<div class="flex__bottom">
<ul>
<li>Learn More</li>
<li>task error-free</li>
<li>Energistically</li>
<li>practices</li>
<li>ethical methodologies</li>
<li>task error-free</li>
</ul>
</div>
</a>
</div>
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/animals" class="flex__img">
<h2 class="flex__h2">Last Friday in three week</h2>
<p>Blue worm shake hands with a legless lizard.</p>
</div>
<div class="flex__bottom">
<ul>
<li>Learn More</li>
<li>incubate</li>
</ul>
</div>
</a>
</div>
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/animals/grayscale" class="flex__img">
<h2 class="flex__h2">She advised</h2>
<p>him to come back at once.</p>
</div>
<div class="flex__bottom">
<ul>
<li>Learn More</li>
<li>Seamlessly</li>
<li>build excellent</li>
</ul>
</div>
</a>
</div>
</div>
但是,对于这种布局,网格可能是更好的选择
@media screen and (min-width: 640px) {
.grid__wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-gap: 10px;
}
}
.grid__item {
background: #ccc;
padding: 10px;
margin-bottom: 10px;
}
@media screen and (min-width: 640px) {
.grid__item {
margin-bottom: 0;
}
}
@media screen and (min-width: 640px) {
.grid__link {
height: 100%;
display: grid;
grid-auto-rows: 1fr;
}
}
.item__bottom {
border-top: 1px solid;
}
img {
height: auto;
display: block;
width: 100%;
}
ul {
list-style: none;
}
ul>li {
display: inline-flex;
border: 1px solid;
margin: 4px;
padding: 4px;
}
a {
text-decoration: none;
color: #000;
}
<div class="grid__wrapper">
<div class="grid__item">
<a class="grid__link" href="#">
<div>
<img src="https://placeimg.com/640/480/arch" class="flex__img">
<h2>Check back tomorrow;</h2>
<p>I will see if the book has arrived.</p>
</div>
<div class="item__bottom">
<ul>
<li>Learn More</li>
</ul>
</div>
</a>
</div>
<div class="grid__item">
<a class="grid__link" href="#">
<div>
<img src="https://placeimg.com/640/480/nature" class="flex__img">
<h2>I am happy</h2>
<p>I am never at home on Sundays.</p>
</div>
<div class="item__bottom">
<ul>
<li>Learn More</li>
<li>Progressively matrix</li>
<li>Uniquely build extensible</li>
<li>seamless customer</li>
</ul>
</div>
</a>
</div>
<div class="grid__item">
<a class="grid__link" href="#">
<div>
<img src="https://placeimg.com/640/480/people" class="flex__img">
<h2>Malls are great places to shop</h2>
<p>I can find everything I need under one roof.</p>
</div>
<div class="item__bottom">
<ul>
<li>maximizing</li>
<li>Monotonectally whiteboard</li>
</ul>
</div>
</a>
</div>
<div class="grid__item">
<a class="grid__link" href="#">
<div>
<img src="https://placeimg.com/640/480/tech" class="flex__img">
<h2>I want to buy</h2>
<p>but know it won’t suit me.</p>
</div>
<div class="item__bottom">
<ul>
<li>Learn More</li>
<li>task error-free</li>
<li>Energistically</li>
<li>practices</li>
<li>ethical methodologies</li>
<li>task error-free</li>
</ul>
</div>
</a>
</div>
<div class="grid__item">
<a class="grid__link" href="#">
<div>
<img src="https://placeimg.com/640/480/animals" class="flex__img">
<h2>Last Friday in three week</h2>
<p>Blue worm shake hands with a legless lizard. Blue worm shake hands with a legless lizard. Blue worm shake hands with a legless lizard. Blue worm shake hands with a legless lizard. </p>
</div>
<div class="item__bottom">
<ul>
<li>Learn More</li>
<li>incubate</li>
</ul>
</div>
</a>
</div>
<div class="grid__item">
<a class="grid__link" href="#">
<div>
<img src="https://placeimg.com/640/480/animals/grayscale" class="flex__img">
<h2>She advised</h2>
<p>him to come back at once.</p>
</div>
<div class="item__bottom">
<ul>
<li>Learn More</li>
<li>Seamlessly</li>
<li>build excellent</li>
</ul>
</div>
</a>
</div>
</div>
为达到预期效果,请为 flex__bottom
设置高度
问题: flex__bottom未指定高度且子元素不均匀,默认高度:auto会根据flex__bottom个元素调整高度
.flex__bottom {
border-top: 1px solid;
height: 100px;
}
我们有一组结果应该显示在三列中。使用 Flexbox
我们能够获得我们想要完成的大部分内容(即所有高度相同,在顶部正确对齐(参见 flex__top
,并在底部正确对齐(参见 flex__bottom
).
但是,我们 运行 遇到一个问题,当 flex__bottom
元素之一的高度与其他元素不同时,对齐将关闭。
我们如何对齐所有列以具有相同的高度,同时让 flex__bottom
部分从相同的位置开始?
目标:
- 确保所有列的高度相同
flex__bottom
中的每个项目都应该有一个与所有其他项目对齐的border-top
。
问题
期望输出
Codepen 在这里可用,以防在内联代码片段中难以复制
/* Columns */
@media screen and (min-width: 320px) {
.col-m-12 {
width: 100%;
padding: 16px;
display: flex;
justify-content: center;
align-items: stretch;
}
}
@media screen and (min-width: 768px) {
.col-t-4 {
width: calc(33% - 48px);
}
}
/* Flex */
.flex__wrapper {
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: stretch;
flex-direction: row;
flex: 0 1 auto;
}
.flex__link {
display: flex;
align-items: stretch;
justify-content: space-between;
flex-direction: column;
background-color: #eee;
}
.flex__top {
padding: 16px;
}
.flex__bottom {
border-top: 1px solid;
}
/* Image */
img {
height: auto;
display: block;
width: 100%;
}
/* Lists */
ul {
list-style: none;
}
ul>li {
display: inline-flex;
border: 1px solid;
margin: 4px;
padding: 4px;
}
/* Link */
a {
text-decoration: none;
color: #000;
}
<div class="flex__wrapper">
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/arch" class="flex__img">
<h2 class="flex__h2">Check back tomorrow;</h2>
<p>I will see if the book has arrived.</p>
</div>
<div class="flex__bottom">
<ul>
<li>Learn More</li>
</ul>
</div>
</a>
</div>
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/nature" class="flex__img">
<h2 class="flex__h2">I am happy</h2>
<p>I am never at home on Sundays.</p>
</div>
<div class="flex__bottom">
<ul>
<li>Learn More</li>
<li>Progressively matrix</li>
<li>Uniquely build extensible</li>
<li>seamless customer</li>
</ul>
</div>
</a>
</div>
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/people" class="flex__img">
<h2 class="flex__h2">Malls are great places to shop</h2>
<p>I can find everything I need under one roof.</p>
</div>
<div class="flex__bottom">
<ul>
<li>maximizing</li>
<li>Monotonectally whiteboard</li>
</ul>
</div>
</a>
</div>
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/tech" class="flex__img">
<h2 class="flex__h2">I want to buy</h2>
<p>but know it won’t suit me.</p>
</div>
<div class="flex__bottom">
<ul>
<li>Learn More</li>
<li>task error-free</li>
<li>Energistically</li>
<li>practices</li>
<li>ethical methodologies</li>
<li>task error-free</li>
</ul>
</div>
</a>
</div>
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/animals" class="flex__img">
<h2 class="flex__h2">Last Friday in three week</h2>
<p>Blue worm shake hands with a legless lizard.</p>
</div>
<div class="flex__bottom">
<ul>
<li>Learn More</li>
<li>incubate</li>
</ul>
</div>
</a>
</div>
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/animals/grayscale" class="flex__img">
<h2 class="flex__h2">She advised</h2>
<p>him to come back at once.</p>
</div>
<div class="flex__bottom">
<ul>
<li>Learn More</li>
<li>Seamlessly</li>
<li>build excellent</li>
</ul>
</div>
</a>
</div>
</div>
如果您可以限制项目标题和描述中的内容量,您可以将 min-height 添加到 .flex-top
。
/* Columns */
@media screen and (min-width: 320px) {
.col-m-12 {
width: 100%;
padding: 16px;
display: flex;
justify-content: center;
align-items: stretch;
}
}
@media screen and (min-width: 768px) {
.col-t-4 {
width: calc(33% - 48px);
}
}
/* Flex */
.flex__wrapper {
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: stretch;
flex-direction: row;
flex: 0 1 auto;
}
.flex__link {
display: flex;
flex-direction: column;
background-color: #eee;
}
.flex__top {
padding: 0 16px;
min-height: 350px;
}
.flex__bottom {
border-top: 1px solid;
}
/* Image */
img {
height: auto;
display: block;
width: 100%;
}
/* Lists */
ul {
list-style: none;
}
ul>li {
display: inline-flex;
border: 1px solid;
margin: 4px;
padding: 4px;
}
/* Link */
a {
text-decoration: none;
color: #000;
}
<div class="flex__wrapper">
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/arch" class="flex__img">
<h2 class="flex__h2">Check back tomorrow;</h2>
<p>I will see if the book has arrived.</p>
</div>
<div class="flex__bottom">
<ul>
<li>Learn More</li>
</ul>
</div>
</a>
</div>
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/nature" class="flex__img">
<h2 class="flex__h2">I am happy</h2>
<p>I am never at home on Sundays.</p>
</div>
<div class="flex__bottom">
<ul>
<li>Learn More</li>
<li>Progressively matrix</li>
<li>Uniquely build extensible</li>
<li>seamless customer</li>
</ul>
</div>
</a>
</div>
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/people" class="flex__img">
<h2 class="flex__h2">Malls are great places to shop</h2>
<p>I can find everything I need under one roof.</p>
</div>
<div class="flex__bottom">
<ul>
<li>maximizing</li>
<li>Monotonectally whiteboard</li>
</ul>
</div>
</a>
</div>
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/tech" class="flex__img">
<h2 class="flex__h2">I want to buy</h2>
<p>but know it won’t suit me.</p>
</div>
<div class="flex__bottom">
<ul>
<li>Learn More</li>
<li>task error-free</li>
<li>Energistically</li>
<li>practices</li>
<li>ethical methodologies</li>
<li>task error-free</li>
</ul>
</div>
</a>
</div>
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/animals" class="flex__img">
<h2 class="flex__h2">Last Friday in three week</h2>
<p>Blue worm shake hands with a legless lizard.</p>
</div>
<div class="flex__bottom">
<ul>
<li>Learn More</li>
<li>incubate</li>
</ul>
</div>
</a>
</div>
<div class="col-m-12 col-t-4">
<a class="flex__link" href="#">
<div class="flex__top">
<img src="https://placeimg.com/640/480/animals/grayscale" class="flex__img">
<h2 class="flex__h2">She advised</h2>
<p>him to come back at once.</p>
</div>
<div class="flex__bottom">
<ul>
<li>Learn More</li>
<li>Seamlessly</li>
<li>build excellent</li>
</ul>
</div>
</a>
</div>
</div>
但是,对于这种布局,网格可能是更好的选择
@media screen and (min-width: 640px) {
.grid__wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-gap: 10px;
}
}
.grid__item {
background: #ccc;
padding: 10px;
margin-bottom: 10px;
}
@media screen and (min-width: 640px) {
.grid__item {
margin-bottom: 0;
}
}
@media screen and (min-width: 640px) {
.grid__link {
height: 100%;
display: grid;
grid-auto-rows: 1fr;
}
}
.item__bottom {
border-top: 1px solid;
}
img {
height: auto;
display: block;
width: 100%;
}
ul {
list-style: none;
}
ul>li {
display: inline-flex;
border: 1px solid;
margin: 4px;
padding: 4px;
}
a {
text-decoration: none;
color: #000;
}
<div class="grid__wrapper">
<div class="grid__item">
<a class="grid__link" href="#">
<div>
<img src="https://placeimg.com/640/480/arch" class="flex__img">
<h2>Check back tomorrow;</h2>
<p>I will see if the book has arrived.</p>
</div>
<div class="item__bottom">
<ul>
<li>Learn More</li>
</ul>
</div>
</a>
</div>
<div class="grid__item">
<a class="grid__link" href="#">
<div>
<img src="https://placeimg.com/640/480/nature" class="flex__img">
<h2>I am happy</h2>
<p>I am never at home on Sundays.</p>
</div>
<div class="item__bottom">
<ul>
<li>Learn More</li>
<li>Progressively matrix</li>
<li>Uniquely build extensible</li>
<li>seamless customer</li>
</ul>
</div>
</a>
</div>
<div class="grid__item">
<a class="grid__link" href="#">
<div>
<img src="https://placeimg.com/640/480/people" class="flex__img">
<h2>Malls are great places to shop</h2>
<p>I can find everything I need under one roof.</p>
</div>
<div class="item__bottom">
<ul>
<li>maximizing</li>
<li>Monotonectally whiteboard</li>
</ul>
</div>
</a>
</div>
<div class="grid__item">
<a class="grid__link" href="#">
<div>
<img src="https://placeimg.com/640/480/tech" class="flex__img">
<h2>I want to buy</h2>
<p>but know it won’t suit me.</p>
</div>
<div class="item__bottom">
<ul>
<li>Learn More</li>
<li>task error-free</li>
<li>Energistically</li>
<li>practices</li>
<li>ethical methodologies</li>
<li>task error-free</li>
</ul>
</div>
</a>
</div>
<div class="grid__item">
<a class="grid__link" href="#">
<div>
<img src="https://placeimg.com/640/480/animals" class="flex__img">
<h2>Last Friday in three week</h2>
<p>Blue worm shake hands with a legless lizard. Blue worm shake hands with a legless lizard. Blue worm shake hands with a legless lizard. Blue worm shake hands with a legless lizard. </p>
</div>
<div class="item__bottom">
<ul>
<li>Learn More</li>
<li>incubate</li>
</ul>
</div>
</a>
</div>
<div class="grid__item">
<a class="grid__link" href="#">
<div>
<img src="https://placeimg.com/640/480/animals/grayscale" class="flex__img">
<h2>She advised</h2>
<p>him to come back at once.</p>
</div>
<div class="item__bottom">
<ul>
<li>Learn More</li>
<li>Seamlessly</li>
<li>build excellent</li>
</ul>
</div>
</a>
</div>
</div>
为达到预期效果,请为 flex__bottom
设置高度问题: flex__bottom未指定高度且子元素不均匀,默认高度:auto会根据flex__bottom个元素调整高度
.flex__bottom {
border-top: 1px solid;
height: 100px;
}