带边距排水沟的 Flexbox 网格系统

Posted

技术标签:

【中文标题】带边距排水沟的 Flexbox 网格系统【英文标题】:Flexbox Grid System w/Margin Gutters 【发布时间】:2017-12-20 18:36:32 【问题描述】:

我很想了解如何使用边距排水沟来布局 flexbox 网格系统。

例如:

在下面的笔中,我有一排 display:flex,我希望它可以换行,所以我使用了 flex-wrap:wrap。一切正常,但是当我将所有列的宽度设置为 25% 时,我必须设置 calc(25% - 25px) 的最大宽度。

https://codepen.io/Jesders88/pen/rwbVwP?editors=1100

我想要的是能够有一个边距,如果可能的话,不必使用 calc 或 max-widths 。我也不想使用百分比,这样当有装订线值时,我可以在每列上方和左侧设置以 px 为单位的边距。所以基本上我想要的是如果我要设置一个 25px 的装订线并将一行上的项目数设置为 4,我希望它们之间有 25px 的装订线,但如果这有意义的话,拉伸行的整个宽度。如有任何问题,请告诉我,我很乐意详细说明。

【问题讨论】:

你愿意使用grid吗? codepen.io/mcoker/pen/WOWQGP?editors=1100 我更喜欢使用 flexbox。支持似乎要好得多。 如果您对列使用固定边距,我认为让列填充行的唯一方法是使用flex-grow: 1,它不适用于换行的行,或者像你一样使用 calc() 。您愿意拥有多行吗? 如果这是唯一的方法,我想我必须是:) 问题是它没有拉伸它需要的整个宽度。 【参考方案1】:

一种方法是使用多行和flex-grow: 1,并且不要在:last-child 上使用右margin

html, body 
	height: 100%;
	background: #252525;
  margin: 0;


section 


.row 
	display: flex;


.column 
	flex: 1 0 0;
	margin-top: 25px;
	height: 200px;
	background: #2848e6;

.column:not(:last-child) 
	margin-right: 25px;
<section>
	<div class="row">
		<div class="column"></div>
		<div class="column"></div>
		<div class="column"></div>
		<div class="column"></div>
	</div>
	<div class="row">
		<div class="column"></div>
		<div class="column"></div>
		<div class="column"></div>
		<div class="column"></div>
	</div>
</section>

或者您可以在除:nth-child(4)calc(25% - 11.25px)flex-basis(45px 边距/4 个框 = 11.25)之外的所有位置上使用margin-right: 15px 作为宽度。

html, body 
	height: 100%;
	background: #252525;
  margin: 0;


section 


.row 
	display: flex;
	flex-wrap: wrap;


.column 
	flex: 0 1 calc(25% - 11.25px);
	margin-top: 25px;
	height: 200px;
	background: #2848e6;


.column:not(:nth-child(4n)) 
	margin-right: 15px;
<section>
	<div class="row">
		<div class="column"></div>
		<div class="column"></div>
		<div class="column"></div>
		<div class="column"></div>
		<div class="column"></div>
		<div class="column"></div>
		<div class="column"></div>
		<div class="column"></div>
	</div>
</section>

使用display: grid;grid-column-gapfr 单位,您可以非常轻松地做到这一点。

html, body 
	height: 100%;
	background: #252525;
  margin: 0;


section 


.row 
	display: grid;
	grid-template-columns: 1fr 1fr 1fr 1fr;
	grid-column-gap: 25px;
	grid-row-gap: 25px;


.column 
	height: 200px;
	background: #2848e6;
<section>
	<div class="row">
		<div class="column"></div>
		<div class="column"></div>
		<div class="column"></div>
		<div class="column"></div>
		<div class="column"></div>
		<div class="column"></div>
		<div class="column"></div>
		<div class="column"></div>
	</div>
</section>

【讨论】:

【参考方案2】:

一种快速简便的方法可能是使用内部容器和填充...

这将允许通过列内部的填充形成“排水沟”,这意味着每列可以跨越所需的 25% 的完整宽度。然后,内部内容容器最终将成为您的样式,以显示为实际的列本身。

因此,您可以将列的所有标记更改为:

<div class="column">
    <div class="content"></div>
</div>

还有你的 CSS:

* 
    box-sizing: border-box;

.column 
    flex-grow:1;
    flex-shrink:1;
    width:25%;
    padding-left:25px;
    padding-top:25px;

.content 
    background:#2848e6;
    height:200px;

请注意添加了box-sizing: border-box;,这将允许内边距成为 25% 宽度的一部分,而不是除此之外。

例如:https://codepen.io/anon/pen/EXJVZy?editors=1100

【讨论】:

不得不添加更多标记来解决问题总是令人遗憾,但有时它确实让事情变得更容易! (毫无疑问,单独使用 CSS 有更聪明的方法 - 希望其他人也能将其中一些带到桌面上 - 当我有更多时间并回来时,我可能不得不考虑它!) 我发现了一个问题。如果您查看第一个容器,它会比其他容器宽。 @jesders88 你是对的,这是由于第一列的padding-left: 0;。我删除了它(以便所有列都有相同的填充),并以与顶部相同的方式进行操作,并在行上简单地执行margin: -25px 0 0 -25px;。如果您刷新那支笔,您应该会看到它们现在的大小都相同。好收获!

以上是关于带边距排水沟的 Flexbox 网格系统的主要内容,如果未能解决你的问题,请参考以下文章

增加 960px CSS 网格的宽度

如何在 Bootstrap 3 网格系统中调整装订线?

可滚动的 div 占用剩余高度(Bootstrap 4 Flexbox 网格系统)

需要:CSS 网格系统和折叠边距

Flexbox 挑战:如何在整行中使用相同且均匀的边距进行换行

scss 传统的sass网格系统没有flexbox,但也没有使用浮动。为具有IE9支持的项目创建。