今天在沸点上看到的这个问题:
11 元素排列,每个元素 200px ,4 个元素一行,每行两端对齐,相邻元素间距要一样,仅使用 CSS 实现。
刚开始感觉很简单,自己实现的过程中,却和想象的不太一样。有一些关键点,所以总结下自己的实现分享给大家。
最终实现效果
采用 flex 布局,两端对齐,子元素使用 margin-right 生成间距,父元素使用负 margin 抵消最后一列的间距。
HTML
<div class="p">
<div class="c"></div>
<div class="c"></div>
<div class="c"></div>
<div class="c"></div>
<div class="c"></div>
<div class="c"></div>
<div class="c"></div>
<div class="c"></div>
<div class="c"></div>
<div class="c"></div>
<div class="c"></div>
</div>
CSS
.p {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
margin-right: calc((800px - 100%) / 3);
}
.c {
margin-top: 20px;
margin-right: calc((100% - 800px) / 4);
flex-basis: 200px;
flex-shrink: 0;
height: 100px;
background: red;
}
.c:last-child { margin-right: auto }
关键点
-
.c:last-child { margin-right: auto }因为p父级元素设置了space-between;两端对齐, 这样做可以使最后一行的元素如果不够 4 个时,仍然保持固定间距。 -
子元素
c设置margin-right: calc((100% - 800px) / 4);设置间距,父元素p设置对应负间距margin-right: calc((800px - 100%) / 3);来修正最后一列元素的 margin-right 边距。
扩展
同理,如果一排 3 个:
.p {
margin-right: calc((200px * 3 - 100%) / 2);
}
.c {
margin-right: calc((100% - 200px * 3) / 3);
}
同理,如果一排 2 个:
.p {
margin-right: calc((200px * 2 - 100%) / 1);
}
.c {
margin-right: calc((100% - 200px * 2) / 2);
}
相关资料
- margin 负值 xiaohuochai.site/CSS/layout/…
- 浅谈margin负值 zhuanlan.zhihu.com/p/25892372