绝大多数网站都使用网格。它们可能没有显式地使用网格系统,但如果它们有一个“主要内容区域”浮动到左侧,一个“侧边栏”浮动到右侧,那就是一个简单的网格。
如果出现更复杂的布局,人们往往会求助于网格框架。他们认为网格是这些超级困难的事情,最好留给超级 CSS 极客。这种想法是由他们所使用的许多网格系统本身非常复杂的事实所造成的。
请注意,这篇文章发布于 2012 年。浮动仍然是网格系统的首要方法,这篇文章侧重于真正简单的方法,就像仅仅浮动四个 25% 的元素,而不会对数学和奇特的间距系统感到疯狂。如今,我强烈建议使用 CSS 网格 或 弹性盒 作为您的网格系统,如果您确实需要创建抽象网格的话。它可以说是更简单,而且肯定更灵活、更强大。
以下是我构建网格的方式。它并不难或复杂。即使使它们灵活也不是什么大问题。
上下文
块级元素的宽度与它所在的父元素一样宽 (width: auto;
)。我们可以把它看作 100% 宽。网格的包装器可能与语义关系不大,它只是一个通用包装器,所以 div
就很好。
<div class="grid">
<!-- 100% wide -->
</div>

列
让我们从一个实用且常见的需求开始:主要内容区域占 2/3 的宽度,侧边栏占 1/3 的宽度。我们只需要创建两个具有适当类名的列 div。
<div class="grid">
<div class="col-2-3">
Main Content
</div>
<div class="col-1-3">
Sidebar
</div>
</div>
要使它们并排显示,我们只需要将它们浮动并应用宽度。我们可以像这样选择它们
[class*='col-'] {
float: left;
}
并像这样单独设置宽度
.col-2-3 {
width: 66.66%;
}
.col-1-3 {
width: 33.33%;
}
这就是别想太多网格的全部前提。
清除上下文
由于父元素只有浮动子元素,它将塌陷到零高度。让我们通过清除它来解决这个问题。如今,您只需要这样就可以了
.grid:after {
content: "";
display: table;
clear: both;
}
间距
网格中最难的部分是间距。到目前为止,我们已经通过使用百分比来设置宽度,使我们的网格变得灵活。我们可以使数学计算变得复杂,并使用百分比来设置间距,但我个人不喜欢百分比间距,我喜欢固定像素大小的间距。此外,我们正试图避免对这些内容进行过多的思考。
第一步是使用 box-sizing: border-box;
。我喜欢在所有内容上使用它。
*, *:after, *:before {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
现在,当我们设置宽度时,该元素保持该宽度,尽管应用了填充或边框。
第二步是在所有列(最后一个列除外)的右侧应用固定填充。
[class*='col-'] {
padding-right: 20px;
}
[class*='col-']:last-of-type {
padding-right: 0;
}

这就是基本间距的全部内容。
外部间距
需要外部间距吗?我喜欢为此使用一个选择性类
<div class="grid grid-pad">
Grid with outside gutters also
</div>
第一步是向网格父元素添加左侧填充(并可选地添加顶部和底部填充)
.grid-pad {
padding: 20px 0 20px 20px;
}
第二步是将右侧填充恢复到最后一列
.grid-pad > [class*='col-']:last-of-type {
padding-right: 20px;
}

更多列选项
超级简单
.col-1-2 {
width: 50%;
}
.col-1-4 {
width: 25%;
}
.col-1-8 {
width: 12.5%;
}
随心所欲。只要确保列分数加起来等于 1。是的,需要思考一下,但比平时更容易。

Sass
虽然我没有在这里大量使用它,但整个部分使用 SCSS/Compass 会变得更加简洁
* {
@include box-sizing(border-box);
}
$pad: 20px;
.grid {
background: white;
margin: 0 0 $pad 0;
&:after {
/* Or @extend clearfix */
content: "";
display: table;
clear: both;
}
}
[class*='col-'] {
float: left;
padding-right: $pad;
.grid &:last-of-type {
padding-right: 0;
}
}
.col-2-3 {
width: 66.66%;
}
.col-1-3 {
width: 33.33%;
}
.col-1-2 {
width: 50%;
}
.col-1-4 {
width: 25%;
}
.col-1-8 {
width: 12.5%;
}
/* Opt-in outside padding */
.grid-pad {
padding: $pad 0 $pad $pad;
[class*='col-']:last-of-type {
padding-right: $pad;
}
}
模块
我喜欢在这些网格中使用“模块”。
<div class="grid">
<div class="col-2-3">
<article class="module">
stuff
</article>
<article class="module">
stuff
</article>
</div>
<div class="col-1-3">
<aside class="module">
Sidebar stuff. Sub modules?
</aside>
</div>
</div>
以这种方式将内容分解成片段感觉很好。额外的副作用是,每个模块都可以有自己的填充,从而使文本远离网格的边缘。
结果
这里有一个 CodePen 上的演示。
浏览器等等
在 IE 8 及更高版本以及所有其他标准内容中都非常有效。如果您需要 IE 7 支持,您将不得不做其他事情 =)。
此外,弹性盒 将使此过程变得更加容易和更好(以多种方式,包括按需重新排序),但我认为我们还需要大约一年时间才能开始考虑使用它。
相关
查看 OOCSS 网格。
嘿 Chris,这很酷!谢谢,我将尝试一下
Donna Phillips
有一个 box-sizing 的 polyfill https://github.com/Schepp/box-sizing-polyfill
来源 @goetter http://www.knacss.com/(使用浮动的相同网格,以及使用表格单元格的其他选项)
嗯... 有意思!
不错
或者,如果你喜欢这种类型的话,你可以使用 mixin。我相信这可以写得更好。=)
我对这个例子,以及很多网格框架感到困惑的一点是,命名方案带来的副作用。在这个例子中,你有一堆类名,实际上把表现形式编码到它们的名字里(col-1-3,col-2-3,等等)。当你需要为屏幕更窄的用户代理创建一个新的样式表时会发生什么?现在你的类名就没有任何语义意义了......'col-1-3'可能就占100%的宽度。
类名命名一直是我持续斗争的问题。当我尝试使用象牙塔式的纯语义名称时,我最终会得到一堆非常通用的类/ID,以至于样式表无法解读。
你不需要使用这些名称,你可以使用自己的语义类名,比如“menu”和“entries”,然后在css中设置所有内容的列宽,比如
这就是我用来保持html语义的方法。
这正是@extend的典型用例=)
@Chris 没错!
我并不介意把非语义类名塞进我的标记中,但是如果你觉得不舒服,你可以在sass中将你的语义类/ID扩展到网格类。
我从没觉得所有移动端的网格类都占用100%的宽度会有什么困惑。好吧......因为它们本来就都是100%吗?
嗯,你好!我第一次看到sass中的@extend......我之前都在哪里?!现在就要部署!谢谢!
@joe 如果使用媒体查询,请谨慎使用@extend。
一些需要注意的地方
http://designshack.net/articles/css/sass-and-media-queries-what-you-can-and-cant-do/
SASS 3.2 媒体查询和 @extend
http://thesassway.com/intermediate/responsive-web-design-in-sass-using-media-queries-in-sass-32
这里使用@extend的问题在于它不会使用“[class*=‘col-‘]”。所以你将会错过你的“float: left;”。提醒一下而已。
新的%占位符语法不会在这里派上大用场吗?这样就不需要在代码中包含列类名,但仍然可以使用它们来确保你遵守了网格(假设你不需要为使用网格的网站动态创建列,尽管你仍然可以使用类名,并只创建等效的%占位符),从而显著减少样式表中使用的选择器数量?
依赖于特定(通常过于冗长)HTML的网格系统让我抓狂。我坚信所有类名都应该反映它们包含的数据类型,任何布局驱动的代码都应该严格保留在CSS文件中。然而,HTML 网格系统完全破坏了这一点,在某种程度上让我想起了我们用表格进行布局的时代。
我在这方面是个新手,但我看到的问题是,表现形式和内容并没有完全分离。如果我在不同的页面上以不同的方式显示相同类型的内容呢?现在我必须在样式表中为每个页面定义更多选择器。而如果我只是在做个独特的页面,并且想要以某种方式排列内容,我可以直接在标记中使用特定的网格类来实现,而无需去拆解样式表。如果你试图将表现形式与内容完全抽象化,那么你所针对的只是用例的一个子集。没有一个单一的解决方案能解决每一个设计问题。
需要使用*:after, *:before吗?我一直只使用*。
参见:https://twitter.com/garazi/statuses/234076720595075072
大多数网格系统并没有比这更复杂。div-1-3 / div-2-3 和 span4 / span8 有什么区别?基本上是一样的。除了可能是基于像素的间距。只是大多数网格系统只是更大css框架中的一个较小的部分。但我经常只选择我需要的项目,然后丢弃其他所有内容。最终的效果是一样的。
不过我很好奇。我看到很多人在他们的css中添加了类似的clearfix。为什么呢?几乎每次在父级添加overflow hidden都能得到相同的结果,而不会添加我们不需要的额外内容。
我希望有人能回答jochem的问题。我也有同样的疑问。能帮帮我吗?
添加overflow: hidden 是一个非常简单有效的方法。但如果你有一些内容需要以重叠的方式显示,并且在同一个盒子里标记(例如小层/工具提示或验证气泡),那么你就不能使用overflow: hidden。
干杯
不错的帖子,Chris。
我有一个部分完成的(基于Sass)网格系统,它做了一些类似的事情,但使用
inline-block
来获得一些非常实用的布局优势,并且它试图在响应式设计的世界中表现良好——https://github.com/necolas/griddle一些评论
这是一个子字符串匹配,这意味着它不是非常健壮。如果你有任何其他包含
col-
的类,那么样式最终也会应用到那里。一般来说,我更喜欢避免这种类型的选择器来选择组件,尤其是在更大的代码库中。是的,你只需要这段代码就可以包含浮动元素(在这种情况下,你也可以使用
display: block
),但它会导致顶部和底部边距的包含方式不同,并且与其他浮动包含方法(例如overflow: hidden
)不一致。为了避免这两个问题,你仍然需要:before
伪元素。这在网格组件中不是什么大问题,但在一般的浮动包含中,我仍然建议使用
:before
。谢谢。
感谢更新。
除了
[class*='col-']
之外,另一个简单的办法是在HTML中添加一个额外的类,例如class="col col-1-3"
。在我的情况下,我通常对整个代码库都很熟悉,所以我可以接受单个类名,但我同意,在更大的、不太熟悉的团队代码库中,第二个类会更好。所以你建议同时使用
:before
和:after
吗?Nicolas 说:“对于一般的浮动包含,我仍然建议使用:before。”
关于:你建议的浮动包含模型与IE 7 和 8 不兼容,除非你打算包含为这些浏览器添加‘before’支持的 javascript hack,但我怀疑你可能会得到不可预测的行为。
我强烈建议坚持使用向后兼容的方法来处理浮动包含。
很棒的工作,再一次......我主张以'合理的方式'使用网格(例如,不要只是为了说你使用了网格而将网格放在设计下面!),这是实现一个轻量级(代码方面)、高效网格的好方法。我也喜欢边框框方法。
很棒的工作!
我喜欢网格背后的理念(常规布局),并将其用于线框图和模型。但我讨厌网格框架,因为它们在我的代码中填充了大量的非语义html。
我也不喜欢灵活的网格。很多网页设计师忽略了一个重要的事实(无意冒犯,Chris):如果你每行文本太短或太长,可读性(用户体验的重要组成部分)就会下降。
不过,这也不能算是网格的错,对吧?我完全同意你的评估,文本长度/行不应该太短或太长,但我对此的看法是,确保有一个合适的中间值是在任何媒体查询中添加更多断点/等等。例如,我有一个相当标准的内容 - 侧边栏布局,当屏幕足够大时,两者都获得更高的边距,并且在几步之后,内容获得额外的填充。
很明显,这仍然意味着文本长度并不一致,但网络的优势和劣势是相同的:你永远无法知道其他人正在使用什么,也不知道为什么。
(另外,我真的很喜欢回复/评论的布局。简洁、美观、有趣)
感谢你的帖子,Chris。我喜欢你网格的简洁性。而且*选择器和伪元素(:before & :after) 的 n1 提示也很棒。
这个网格系统真的是 IE8 及以上版本的吗?使用了所有“last-of-type”选择器?我只是很好奇,因为看起来很棒,但不确定它会如何工作?
不幸的是只有 IE9 及以上版本
刚刚检查了一下 - “last-of-type” 在 IE8 中不起作用
事实上,这在 IE8 中不起作用。但 IE8 支持 `:first-child`,所以你可以更改 CSS 以使用它
当然,你不能在第一列之前有任何其他类型的元素。
这也是我的问题。希望他们能更新文章内容以反映“last-of-type” 样式在 IE8 中不起作用的事实,以防人们在没有认真核实的情况下实现这种网格系统。
当我第一次阅读 Andy Clarke 的“超越 CSS”时,我最大的收获是,为了跨多个浏览器使用列式布局(甚至 IE7),你必须将你的内容包含在容器中并给内容内部添加填充 - 保持实际容器不受污染。当然,使用额外的 `div` 会生成更多标记。
我同意布局结构很容易,但我们仍然需要列来帮助进行严格的对齐。我的意思是……当然,你拥有这个很棒的比例布局的盒子,但如何在其中对齐内容?指南在哪里?我认为 Gridset 在帮助我们保持布局整洁和笔直方面取得了长足的进步。
为什么不在所有边上添加填充?我对整个 `[class*='col-']:last-of-type` 添加有什么遗漏吗?
*是我
如果你在父元素 .grid 上添加了全面的填充,最后一列将不正确。文章中的技术使它们都保持相等。
我自己也在想这个。Chris,如果你去 CodePen 演示,你可以看到区别:复制以下内容
然后将一个填充的网格更改为使用 grid-pad2;当你添加和删除“2”时,你可以看到间距的不同。在三分之二的示例中,哪个“最好”并不十分清楚,但很明显,在八分之一的示例中,它出了问题。
问题是,如果你尝试使用不同的外部填充,两种方法看起来都很糟糕。你可以在 CodePen 上的这个版本 中看到这一点。
我尝试了一段时间来想出一个更好的方法来处理所有这些情况,但我无法完全弄清楚。我认为真正的答案是:等待 flexbox!*笑*
是的……当我们构建适合我们设计的网格而不是在网格上设计时,它更现实。
我以前对网格一无所知。谢谢!
我喜欢 Chris 的网格,我一直使用 Bootstrap 网格很长时间了,而且我也在模块上使用这种抽象,但当我创建响应式网站并在设计中必须修复断点时,我一直找不到解决方法,设计在某个宽度会出现错误,但这些网格类在整个页面中使用,所以如果我针对其中一个类来修复问题,这个修复将影响该类的所有其他实例,从而破坏布局,所以我被迫使用基于父元素的类来修复这些错误,可能使用页面特定的 body 类或出现问题网格的父元素,对此有什么想法吗?
这是我在评论中读过的最长的短语之一。
我尝试过很多框架,目前对 semantic.gs 非常满意。因为我可以保留 CSS 中的名称。我在工作中将其用于大型跨国公司网站。它包含 less、sass 并且非常紧凑和聪明地制作
我完全同意。 semantic.gs 似乎是迄今为止最好的网格系统。
– 响应式
– 语义化
– 无 HTML 膨胀
– 基于 LESS / SASS 构建
Chris Coyier 对这个想法怎么看?没有 HTML 膨胀!
我想看看用 semantic.gs 制作的网站示例……
如果将 CSS(用于网格)应用于 header、article、section、aside、footer,你只能使用它们一次(?)
我可以看到一些*简单的*布局,但读完 semantic.gs 的首页 CSS 后(http://semantic.gs/stylesheets/screen.css)
基于 id 的 CSS?
就像 Atimoda 说的那样,你可以保持你的 HTML 语义化
将 Chris 的示例更改为
你的 HTML 就是“语义化”的。
你可以选择你想要的元素,这样 HTML 代码就干净了。
看看这个 HTML 代码
嵌套
你这样设置它
您好!我读了你的文章。它真的很有帮助而且信息丰富。我会再次访问你的博客以获取新的更新。
不错,但是当你需要,比如 20% 但不能少于 200 像素时,就会出现问题。然后另一列必须在那列之后进行定位。
这是一个非常好的解释,Chris。我确实有几个快速问题
为什么在清理时使用 `display:table` 而不是 `display:block`?我一直使用 `display:block`,所以只是想知道是否有什么优势(或劣势)是我错过的。
其次,当你恢复右侧填充时,为什么不直接删除删除它的规则?或者你是保留这两个规则,以便你可以选择性地在你想要填充时使用 grid-pad,而不需要填充时不使用它?(在打完这个问题后,我认为我已经回答了它 - 但是,值得确认)。
无论如何,这篇文章写得非常好 - 谢谢!
我同意上面关于保持语义化和使用预处理器来创建网格的评论。
即使只是修改一个 10 页静态网站的布局,当你在 HTML 中硬编码了布局时,也会非常麻烦……也许只有我这样,因为每次看到反语义化时,我都会产生一种精神上的抽搐!;o)
我一直使用 Susy 响应式网格。Johan 的 semantic.gs 建议看起来不错(感谢),我今天会试玩一下。:)
在网格上使用负边距并将填充留在每列的左右两侧是否有任何缺点?例如,网格容器的左侧和右侧边距为 -10px,而列使用左右填充 10px。这样你就可以在你想要网格填充时只删除负边距。
嗨,Chris,
感谢你的精彩帖子。我一直用你的代码玩,只是想知道你是否考虑过用它嵌套网格,因为我认为这将非常有用。我添加了这个来修复我发现的一个问题
我还注意到,如果你不在每一行上使用 .grid-pad,最终最后一个 div 会比其他 div 大一点,因为删除的填充没有在所有其他 div 之间平均分配。
你有什么想法如何纠正这个问题吗?
干杯
Paul
我知道其他人会发现这个问题。 ;-) 为了确保 Paul 的修复是清楚的,原版将 padding-right 0 作为默认值,而所有边的填充应该作为默认值。
因此,原版与预期相反:类型的最后一个元素具有 padding-right。Paul 的修复表明,在最后一个类型上,padding-right 应该为零。
我开始阅读有关网格的信息,并下载了一些,但我一直不明白为什么我需要一个比我内裤条纹更多的网格系统。(抱歉,让你联想到画面了)
这对我更有意义,如果需要,它可以轻松地通过添加 24% 的 1-1-1-4 来升级,或者其他什么。
err…
甚至 25% 的 1-1-1-4 ツ
很棒的工作!非常有用的信息,SASS 是你优化 CSS 的首选工具吗?谢谢
很棒的帖子,Chris。我认为创建适合自己的网格是最重要的。为什么使用 12-24 列网格,当你只使用三列时?
我正在开发一个 Sass/Compass 网格系统,它支持非对称网格。这允许做复杂的事情,但大多数人只需要两三列,而且由于 webkit 的舍入错误,均匀的 24 列网格可能会变得很糟糕。使用适合自己需求的低分辨率非对称网格通常更好。$columns: 70%, 10%, 20%;
当您使用背景颜色作为块的颜色,并且列的内容不同时,就会出现唯一的问题。
示例:http://codepen.io/anon/pen/ruFGc
当您可以使用表格元素而无需任何清除修复时,为什么要使用浮动块?所有主流浏览器都支持它(IE 8+ 支持它,但我认为这已经足够了)。
我认为表格在语义上是错误的选择。
不错,Chris。作为一名 Python 开发人员,也是一名女性,看到网页开发人员和设计师如何轻松地使用 CSS,真的让我大开眼界。我在假期尝试涉足网页设计,但我对此毫无办法。
顺便说一句,干得漂亮:)
简洁明了。
我只是将这篇文章中的代码和约定放到
concrete5 html5 Boilerplate 模板中。非常适合。
感谢您剥离网格理论,以一种我的大脑能够理解的方式展示基础知识。
喜欢 css-tricks 和 ShopTalk
谢谢!好文章。
亲爱的 CSS-Tricks,
我想拥有你的孩子。我甚至不喜欢孩子。而且,我是一个男孩。
你很棒,
twrecks
你应该尝试一下 Susy,它是 Sass/Compass 的网格系统,无需额外的标记
时机真巧,我刚梦想着为工作中的一个项目设计一个灵活的网格系统。我也选择使用 `box-sizing: border-box;`、百分比宽度和填充作为间距。
需要注意的一点
将填充从右侧...
转换为左侧,结合 `:first-child`...
再加上一个 `box-sizing` polyfill,应该可以让您使用相同的技术在 ie7 中获得浏览器支持。(我没有测试过,所以可能遗漏了一些其他不支持的内容。)
太棒了…:)
您能提供一些在 IE7 中也能工作的示例吗?
是否有针对 codepen 的服装线?是否有银色星星可用?响亮和柔和的区别是什么?
Roosevelt,加油!
非常喜欢这篇文章;学到了一些新东西,甚至尝试在一个项目中使用它。
我唯一的问题是如何才能将整个“.module”从 div 更改为链接并仍然保留宽度。当我尝试用图像和文本同时这样做时,模块的填充会包裹到文本/图像的侧面。
以下是我试图实现的内容的摘录:http://codepen.io/anon/pen/qfcJw
感谢您的文章,Chris,任何帮助将不胜感激。
您的链接需要是块级元素。在您的示例中,将 `display: block;` 添加到 `linkblock` 可以解决您的问题(如果我理解正确的话)。
Pen
Brendan,这太完美了,真的感谢您的回复。
谢谢!:)
多年来我从未接触过网格,因为我以为定制布局更“纯粹”。谢天谢地,我放弃了那个想法,网格很棒。像 Chris 一样,我使用网格,但会为特定项目自行创建,而不是使用框架。
我喜欢使用我第一次在 Harry Roberts (@csswizardry) 的 Inuit.css 中看到的样式。它需要额外的 <div> 用于标记,但这没什么大不了的。本质上,.grids 类具有等于间距边距的负边距。这意味着,如果您有多个跨越多行的项目,您无需将多个 first/last 类应用于 html,并且它也将在您构建响应式布局时调整视窗时有效。
我在此处创建了一个代码笔来进行说明。 http://codepen.io/anon/pen/GLyjF
尝试调整浏览器窗口的大小,您会看到这些框将自动跳到下一行,并与左侧对齐。无需在浏览器调整大小时计算第一个或最后一个 div。
问题是,您的网站不会居中,而会向一侧偏移 20 像素。您也会有水平滚动,并且它会在例如 480 像素处重新排列,而它应该在 500 像素处重新排列。
Chris,你真是个天才:) 虽然,很多东西对我来说就像外语一样。
我很高兴你发布了这篇文章,因为我一直在尝试弄清楚网格的概念。
至于清除浮动,`display: block;` 和 `display: table;` 之间的区别是什么?
Casey。
有趣,但“在 IE 8 及更高版本以及其他所有标准内容中都能很好地工作。如果您需要 IE 7 支持,您将不得不做其他事情=)。 ”这已经让事情变得更难了;) 当然,对于所有新浏览器来说都很棒。但我猜这就是使用功能齐全的网格系统如此棒的原因:我们也可以将其用于旧浏览器(除了那些非常古老的恐龙浏览器,显然;))。
Chris,干得漂亮。我很享受阅读和学习它。
嗨,
有一件事我不明白。如果我想要两列具有相同的宽度,我必须使用这个
但是,如果我使用间距,我的第一个 <div> 将会有“padding-right:20px”。所以,我的第一个框的宽度不会是“50%”,而是“50% – 20px”。因此,实际上,我的两列不会完全相同宽度。
我错了?
Box-sizing 确保无论填充如何,宽度都相同。
是的,但也不完全是。我的两个框将占用相同的空间,但第一个框的内容宽度将小于第二个框的内容宽度。示例
在这里,我的两个框不会有相同的宽度,而两列应该具有相同的宽度。
这有效,并且使列相等。它也不依赖于 `:last-of-type`,我认为这是更好的选择。
我个人不会在每列使用属性选择器,而只会添加 `grid-col` 类。
关于此解决方案的更多信息
我发现使用“last”类型的选择器会导致浏览器渲染性能下降。对于浏览器来说,“查找 first-of” 的速度要快得多。因此,我会将上面的代码更改为
感谢您发布此技术。`border-box` 似乎是让这变得简单有效的关键。
是的,将网格和模块化内容分开是最好的方法。我冒着对大家讲道风险,告诉你们为什么我这么喜欢它
1. 这感觉很对。
2. 如果您需要将模块移动到另一个位置列,只需拿起并放下即可。您无需更改任何网格类来调整它到它的新位置。
3. 我喜欢将边距底部添加到所有 HTML5 语义上下文创建元素(section、article、nav、aside)中,例如 margin-bottom: 30px。这保证了那些应该在逻辑上分开的区域在视觉上也分开。然后,我使用一些实用程序类来添加或减少可能需要它的模块的边距。由于边距应用于所有 HTML5 上下文创建元素,我只需选择模块的适当元素(最常见的是 section),并且我知道间距会很好看。因此,在构建网站时,我不必太担心边距。我只是布局我的网格,开始添加模块,并且所有东西都会自动间隔开。
示例
4. 我也喜欢添加一大段代码来使间距更紧凑和一致。
这确保模块中的最后一个元素没有边距底部。这样,模块内部的最后一个元素就不会增加堆叠在网格列内的两个模块之间的距离。它们的距离完全由模块 HTML5 元素的 margin-bottom 决定。如果您向模块添加背景和填充,这也有助于您,因为它会消除底部额外的空间,并围绕整个区域创建均匀的间距。
这就是我喜欢将网格和模块分开的理由。它使移动模块和垂直间距变得容易。只是想和大家分享一下。关于这种方法有什么意见或建议吗?
这正是网格的实现方式。不知道为什么人们总是依赖复杂的网格系统。
@Christian Krammer,人们喜欢复杂的网格系统,因为他们喜欢让事情看起来比实际需要更难。我想这是一种自尊心问题:)
不错的帖子!太可惜它都是流动的,如果也有一个 2 列流动-固定示例就好了。
此致,J
很棒的帖子!我之前害怕使用 Grids,但你解释得非常清楚。感谢!
这里使用的技术很棒,而且自己创建网格确实很容易,而且通常也更可取。
我最近在我的 Proportional Grids 框架中创建了一些东西来帮助我实现这些方面,该框架使用网格包装器上的负边距而不是
:last-of-type
来消除间隙问题。它还使用固定间隙(Chris,它们是有意义的!)和比例来使用单独的类快速构建网格,针对每个断点。
无论如何,看看吧,有人可能会觉得它有用:)
http://builtbyboon.com/blog/proportional-grids
出色的文章,非常感谢大家的资源丰富的反馈。
Matt,你的布局和菜单实在是太实用太实用了。
感谢分享。
我在我的网站上使用了 Chris 的响应式菜单,我真希望能够用更好的颜色选择来设置下拉菜单的样式。
我注意到 Tiste 在这个讨论中早些时候也说到了同样的问题。在这个例子中
第一段和第二段并不相等,因为第一列的右侧填充占用了一些空间。
我是这样解决的:我在所有列的两侧都添加了填充(左侧 10px,右侧 10px)。当然,这会将 .grid 扩展 20px(第一个左侧 10px,最后一个右侧 10px),从而导致问题。我通过在 .grid 上使用负边距解决了这个问题,如下所示
试试吧。对我来说管用。
你也可以这样做
我不得不创建一个基于网格的响应式网站,该网站可以在 IE7 及更高版本上运行,但我在网上找不到我喜欢的,所以我创建了自己的(基于互联网上的不同网格系统)。它允许在一行中组合固定宽度和流体宽度列,并且可以在 IE7 及更高版本上运行(通过 js)。我并不是一个经验丰富的前端开发人员,所以我希望得到一些意见或批评。
提前感谢:)
在 http://www.pataphysicalturkey.ch/less_test/ 中找到它
Jonas
好文章,我想更多地了解一下 web 移动和 Grid。
Chris,这太酷了。必须是我最棒的帖子之一。很喜欢。
太棒了!非常感谢这篇有用的帖子。
我之前没有意识到,与其通过使用 960 网格系统之类的网格框架来简化我的工作,我实际上让我的工作变得更加复杂了……
感谢 Chris 的这篇精彩且充满知识的帖子,我是一个 CSS 初学者,我一口气读完了它,包括每一条评论。它非常有趣也很有帮助
再次感谢
很棒的文章,但是……哦不!我还是无法停止过度思考。实际上,我唯一担心的就是流体网格中嵌套的网格组件,就像你的示例中那样。我很好奇地想知道你处理它们的最佳实践是什么。
如果你想要在嵌套时也有相等的间隙,可以使用固定间隙(em)而不是 %,这样可以。
我必须回来看看这个——我最近使用了一个网格系统,它太复杂了,而且还必须不断调整列宽,因为存在填充问题——我不知道有一个技巧可以强制列保持该宽度,而不管填充/边距等等。
所以,谢谢!
我喜欢这条评论,如果你想让它在 IE 7 上运行——那就使用其他东西吧。将“box-sizing”设置为“border-box”是一个完美的解决方案,直到那时。
如果你要针对 IE10 或 Windows 8,可以使用 -ms-grid,它非常棒!我知道它不适用于针对广阔的网络,但当你使用 HTML/CSS/JS 创建 Windows 8 应用程序时,网格系统非常不错。在 http://ie.microsoft.com/testdrive/Graphics/hands-on-css3/hands-on_grid.htm 上查看。哦,顺便说一下,那里也有一个很好的 flexbox 实现,以及一个名为 ViewBox 的 WinJS(即 Windows 8 上的 JavaScript 库)控件,它会在布局改变时自动缩放和转换其内容。
大家好。我只想说我一直想创建我自己的轻量级 CSS 框架,其中包含一个网格系统,我认为 Chris 这里介绍的内容非常棒,它(虽然经过修改)成为了我名为“Kaleidoscope”的项目的里程碑。你可以在 https://github.com/emilbrann/Kaleidoscope 中找到它。如果有人愿意尝试一下并给我一些反馈,那就太棒了!感谢;)
Matt Berridge
“如果你想要在嵌套时也有相等的间隙,可以使用固定间隙(em)而不是 %,这样可以……”
我指的是百分比的复合。例如,如果你有一个 7/8 列……它需要包含一个 3/7 列和一个 4/7 列?
@Matt Berridge
是的,你说得对。我认为要点在某个地方丢失了(就像经常发生的那样)当人们试图在网页设计中使用百分比时。
我喜欢像这样自己编写网格的想法,特别是因为对于很多框架来说,很难知道后台发生了什么。
但我也想知道你将如何使用这种方法来处理嵌套列?据我所知,所有嵌套列在其右侧都会包含填充,包括最后一个,这使得它们与网格不对齐。是否有简单的方法来解决这个问题?
我也希望得到这个问题的答案。我一直没有找到解决方法。
Chris; 这个简单的网格今天救了我的命!
我一直无法使用 WordPress 并在缩略图库中使用 .last 类。这是响应式框架(如 Bootstrap(?) 和 1140 等)的常见问题。
再次感谢。
我正在使用 Foundation 框架,它也使用 box-sizing: border-box; 以及用于左右间隙的填充。这是我遇到的问题
如果每列都有填充(作为间隙),这意味着我永远无法在列中拥有一个带有背景或上下边框的 div,该边框一直延伸到该列的左右边缘。这正是我经常设计的,但现在我无法使用这种间隙系统轻松实现。始终会有填充,这会阻止我的子 div 接触到父 div(列)的边缘。
有什么想法吗,或者有人遇到过需要在视觉上显示列边缘内部的东西吗?
我错过了什么微妙的 CSS 行为,它解释了为什么我们不能在网格周围使用 $pad?即
/* 选择外部填充 */
.grid-pad {
padding: $pad
}
我看到了这样做时会发生什么:我们在网格上得到了正确的外部填充,但最后一列扩展了一点(到它的间隙填充)。我只是不明白为什么。
我创建了一个 stylus 混合器来自动执行此操作
要制作一个 1-3 框
要制作一个 2-3 框
它可能可以转换为 sass 或其他任何东西。
Brian Danin 使用 Sass 移植了它
@jochem 我认为这与跨度宽度有关,span4/span8 等都假设跨度大小相同,而 div-1-3/div-2-3 可以在“跨度”可变的系统中使用。 div-1-3 表示跨度为 1 的列,总共 3 个跨度,计算后,其宽度为屏幕宽度的三分之一,包括填充、边距等,你也可以使用 div-1-4,它代表 4 个跨度中的 1 个,这意味着每个跨度实际上占 25% 的宽度。
嗨!我尝试使用你的 Sass 代码,但在编译时一直出现这个错误:C:/path/config.rb 第 [¨24¨] 行的语法错误:语法错误,意外出现 tINDENTIFIER,预期为输入结束 @ mixin box-zinzing $pad
我似乎找不到解决办法...也许你能帮忙?
是我理解错了吗?还是只有我在乎列宽不一致?
http://codepen.io/mattweb/pen/Jgrdm
同意,在我看来,等宽列在很多情况下都是非常必要的。感谢你发布了这个关于此解决方案列宽不一致的清晰示例。因此,虽然这个网格选项是一个好主意,比大多数疯狂的网格要好得多,但我认为列宽不一致是它的一个缺陷。
但我成功地实现了上面这个 评论 中发布的负边距修复。它可能不适用于所有情况,但如果你仔细设置包含元素,它确实提供了一个不错的解决方案,让你可以继续使用这个非常简单的网格解决方案。就我个人而言,我在网站构建中已经成功地使用了它。
Chris,我遇到了困难,我现在正在学习你的 Lynda.com 课程“WordPress 3:创建和编辑自定义主题”,我正在尝试整理我的 CSS 和 HTML,以便让主题运行起来。我想要两个侧边栏(左和右),以及一个中心(用于主要内容)…你能提供一些帮助吗?因为在我的情况下它不起作用。
这个方法一点也不简单或易读。
你有没有在合理的框架中编辑过网格?
例如,WPF 有 WrapPanels(类似于 HTML)、StackPanels(水平、垂直)、Grids、Canvas 等。创建简单或复杂的图案就像喝一杯牛奶一样容易。
我不知道为什么网页开发者如此顺从。W3C 在构建网页的方式上存在着根本性的腐败,如果没有人说些什么,除了“哦,我们只需要在这里粘贴一个脏的 hack,然后它就不会崩溃”,那么什么都不会改变!
这
不是一个网格。它是一个神秘的、陌生的混乱堆,难怪网页看起来如此糟糕,因为很少有设计师能够忍受这种 HTML/CSS 的虐待性语言,难怪他们会使用自定义元素库,至少为了获得可读性。
我希望 Google 能用 Dart 替换 JS,用合理的自定义标签替换 HTML。如果这些疯狂的语言不存在,我们可以轻松地在浏览器中运行类似于本机的内容。
我遇到了一个 div 内的一个段落文本换行的问题(没有从原始示例修改)。
示例 Pen
它只发生在某些文本字符串上,但它们并不特别长或有任何异常之处。
有人能告诉我为什么会发生这种情况吗?CSS 本身很简单,所以这个段落溢出突然发生真的让我很困惑?就像它突然不再限制在 div 的大小内了。
好吧,我最近决定自己编写网格,并尽可能地简化它。我想用 (MED) 来思考。在没有大多数框架的所有花哨功能的情况下,流体网格框架的最小有效剂量是什么?我受到了“死简单网格”的启发(http://mourner.github.io/dead-simple-grid/)。
我的网格不使用间距。相反,我在将内容放置到页面后,再找出内容的间距。我使用的过程是,在没有任何视觉样式的情况下编写所有代码,这样我就可以先设计好视觉布局。我吃过苦头才明白,过早地添加样式会让后面的 CSS 调试工作更多。请批评,因为我可能过于简化了。
我通过将我的
.content
类与一个“大小”类(.col-1, .col-2, .col-3.
等)结合起来,来创建列。我最多使用 10 列,而不是通常的 12 列。这使得它成为简单的百分比,并且易于嵌套(10%、20% 等)。此外,布局更多地是关于组合列,将页面划分为布局块(侧边栏、右侧内容等)。因此,我不认为有必要坚持大多数框架中存在的 12 列。我最初在开发网站时只使用它。在网站的初始布局开发完成后,我会将我的所有网格 CSS 从
.content .col-3
更改为更具语义的 CSS.sidebar
。我不会包含我的重置和规范化 CSS,因为这在如今大多数框架中都是给定的。
我的婴儿网格,带有一些类辅助工具。
/* 行 */
.wrapper { display: inline-block; width: 100%; }
/* 内容 */
.content { float: left; }
/* .content 媒体查询,适用于移动设备 */
.content { float: none; width: 100%; display: inline-block; }
/* .content 的大小类 */
.col-1 { width: 10%; }
.col-2 { width: 20%; }
.col-3 { width: 30%; }
.col-4 { width: 40%; }
.col-5 { width: 50%; }
.col-6 { width: 60%; }
.col-7 { width: 70%; }
.col-8 { width: 80%; }
.col-9 { width: 90%; }
.col-10 { width: 100%; }
/* 全局布局辅助工具 */
.left { float: left; }
.right { float: right; }
.clear { clear: both; }
我认为“不要过度思考网格”是最棒的,我终于理解了。我已经完成了自己的版本。
http://codepen.io/riwakawebsitedesigns/pen/iCEsu
http://codepen.io/riwakawebsitedesigns/full/iCEsu
带有内容后的类,用于设备测试。
试图理解 Chris 代码中 grid-pad 的右侧填充
/* 选择加入外部填充 /
.grid-pad {
padding: 20px 0 20px 20px;
}
.grid-pad [class=’col-‘]:last-of-type {
padding-right: 20px;
}
为什么不使用一行代码来实现相同的结果?
/* 选择外部填充 */
.grid-pad {
padding: 20px;
}
我是不是漏掉了什么?谢谢
嗨,前端人员,以及其他所有人;)
我重新阅读了这篇文章,试图解决自己使用流体列的 3 列解决方案的难题。
我的难题是,第三列变得更宽了...所以我回到这里偷了一些代码。但是没有用。
在你的代码中,使用 3 列“col-1-3”会让最后一个 div 的宽度比另外两个三分之一更大。
你可以在这里查看我演示的 fork
但是通过上面所有这些评论,我还是觉得这个问题应该得到解决?
没关系。我已经弄明白了,我只需要把头从屁股里拔出来,它就正常工作了,现在有空白区域,就像我想要的那样。
向网格添加背景颜色的最简洁方法是什么?在网格 div 中添加第二个类,还是放在另一个元素上?
我之所以这样问,是因为我认为将所有这些类型的样式保存在模块中会更干净,但我不确定如何将背景颜色应用到理想情况下应该放置在网格 div 上的元素。