Susy 为您提供构建自己的网格布局的工具,以满足您网站的需求。它让您能够自由灵活地构建任何您能想象到的设计。无论您的设计是 5 列、14 列还是 48 列,都没有关系。不均等宽度的列?Susy 都能满足您的需求。
为什么您要选择 Susy 而不是互联网上其他数百万个框架?您可能以前从未听说过它。如果它的美丽只是表面现象怎么办?
在过去几个月里,Susy 是我前端开发工作流程中发生的最棒的事情之一。它给了我如此大的帮助,以至于我决定写一本书来分享它的优点。这是一本关于 Susy 的深入指南,介绍了如何使用它轻松创建任何您想要的网站设计。
仍然不相信?好吧,我唯一的要求是您给我机会尝试通过本文改变您的想法。我们将了解 Susy 为什么如此特别,以及它如何帮助您。
正如人们所说,经验是无法替代的,因此我将引导您体验创建布局的 Susy 体验。您可以将其与手动创建相同布局的体验进行比较(这涉及自己计算像素……)。
我们将从简单的开始,一旦您对 Susy 有了一定的了解,我们将继续学习更花哨的布局。
在开始之前,您必须了解一些关于我们朋友 Susy 的事情。您**必须**为它使用 Sass 预处理器语言,这意味着您至少必须知道如何将 Sass 转换为 CSS。不,您不能使用 LESS。对不起,LESS 粉丝们!
创建非常简单的布局
CSS-Tricks 拥有一个非常直观的布局,所以让我们用它作为我们的第一个示例。
查看该博客,您会发现 CSS-Tricks 由两个内容区域组成:主要内容和侧边栏区域。
我们将假设 CSS-Tricks 为整个站点使用 12 列布局,其内容区域占据 12 列中的 8 列,而侧边栏占据 12 列中的 4 列。如果您之前使用过网格,这都是非常标准的内容。

如果您之前使用过 Bootstrap 或 Foundation,则此站点布局的标记将如下所示
<div class="wrap">
<div class="content col-md-8"></div>
<div class="content col-md-4"></div>
</div>
很简单,是的。但是 Bootstrap 和 Foundation 也附带了许多包袱,很多时候我们根本不想处理它们。如果您不需要 Bootstrap 和 Foundation 附带的大多数其他内容,那么 Susy 将更适合您。
一个从头开始手动编写所有站点代码,没有框架或装饰的坚定的开发者可能会这样编写他的标记
<div class="wrap">
<div class="content">Content</div>
<div class="sidebar">Sidebar</div>
</div>
要创建 8 列内容和 4 列侧边栏,您必须测量内容、间隙和侧边栏的宽度。响应式网页开发的一条规则是使用百分比输出这些宽度,因此您必须相应地进行转换。

因此,相应的 CSS 可能如下所示
/* I tend to use border-box sizing for all my web layouts. */
*, *:before, *:after {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.wrap {
max-width: 1120px;
}
/* Clearfix for floated children */
.wrap:after {
content: " ";
clear: both;
display: block;
}
.content {
float: left;
width: 66.071429%; /* 740px / 1120px */
margin-right: 1.6964286%; /* 19px/1120px */
}
.sidebar {
float: right;
width: 32.2321429%; /* 361px / 1120px */
}
在我们继续之前,快速说明一点:我喜欢将所有网页元素的box-sizing
属性设置为border-box
,我强烈建议您也这样做。Chris 已经在这里详细介绍了 box-sizing。
无论如何,如果要处理多个布局,从头开始手动编码的方法可能会变得乏味。想象一下,每次都计算所有这些百分比!
这正是 Susy 帮助您的地方。它为您完成了数学运算。
使用 Susy 创建简单的布局
使用 Susy 创建任何布局时,您首先必须让它知道您希望它使用哪些设置。Susy 使用许多默认设置来启动每个项目。
我假设这是您第一次使用 Susy,因此我们现在将坚持使用大多数默认设置。不过,您确实需要更改三个属性,您可以通过在$susy
映射上声明它们来更改它们。
同时,让我们也像上面一样应用border-box
属性。
@import "susy"
/* Changing Susy default global settings */
$susy: (
/* Tells Susy to use 12 columns */
columns: 12,
/* Tells Susy that the container has a max-width of 1120px */
container: 1120px,
/* Tells Susy to use border-box */
global-box-sizing: border-box
);
/* Makes border-box properties */
@include border-box-sizing;
建议您在使用 Susy 时使用container
mixin 创建网站的容器。在我们的例子中,此容器是.wrap
.wrap {
@include container;
}
这一次,我们将不再手动计算布局的精确像素和百分比,而是告诉 Susy 为我们计算。为此,**您只需告诉 Susy content
是 8 列,sidebar
是 4 列即可**。
我们确实必须让 Susy 知道sidebar
是行上的最后一个项目,以便它可以进行必要的调整。
/* Tells Susy there's 8 columns in the content */
.content {
@include span(8);
}
/* Tells Susy there's 4 columns in the sidebar, and its the last item on the row. */
.sidebar {
@include span(4 last);
}
这编译成
*, *:before, *:after {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.wrap {
max-width: 1120px;
margin-left: auto;
margin-right: auto;
}
.wrap:after {
content: " ";
display: block;
clear: both;
}
.content {
width: 66.10169%;
float: left;
margin-right: 1.69492%;
}
.sidebar {
width: 32.20339%;
float: right;
margin-right: 0;
}
**您是否注意到 CSS 输出正是我们需要的?**Susy 确实为我们节省了很多时间。
但是我们还没有完成 CSS-Tricks 布局。如果您向下滚动到站点的底部,您会发现社交媒体区域,您还可以看到此区域中有 10 个社交媒体项目

如果您在设计中使用传统的网格框架,那么您就遇到了麻烦。据我所知,在不影响其余布局的情况下,使用 Bootstrap 或 Foundation 等框架将列数从 12 快速更改为 10 实际上没有简单的方法。
Susy 不会用此类规则束缚您。您可以自由创建自己的规则。毕竟,这是您的网格。
您的网格,您的规则
当您创建自己的网格时,一切皆有可能。在我们继续 CSS 之前,让我们首先将标记正确化。它应该如下所示
<div class="wrap">
<div class="content"></div>
<div class="sidebar"></div>
<div class="social">
<ul>
<li class="social__list-item"></li> <!-- repeat 10x -->
</ul>
</div>
</div>
现在我们可以开始处理 CSS 了。使用手动编码方法,您可能已经意识到您将不得不再次计算每个项目和间隙的宽度。

.social {
padding: 1.6964286% /* 19px / 1120px */
}
/* Adds clearfix to social to prevent the float collapse */
.social:after {
content: " ";
clear: both;
display: block;
}
.social__list-item {
float: left;
width: 9.1497227; /* 99px / 1082px */
margin-right: 1.0166359; /* 11px / 1082px */
}
/* And the last item cannot have any right margins */
/* It is also good to float it right to mitigate subpixel rounding errors */
.social__list-item:last-child {
float: right;
margin-right: 0;
}
如果您问我,这感觉就像一项相当乏味的工作。
如果我们让 Susy 为我们做这件事,那就简单多了。您只需告诉 Susy 总共有 10 列(而不是 12 列),并且每个社交项目占据一列。
.social {
/* Adds a padding of 19px to each side of the .social container */
padding: gutter();
/* Adding a clearfix because all children elements are floated */
@include clearfix;
.social__list-item {
/* Telling Susy that there are 10 items, and each takes up 1 row */
@include span(1 of 10);
/* Another way to tell Susy that this is the last item in the row */
&:last-child {
@include last;
}
}
}
Susy 生成了我们网格所需的完全相同的 CSS 属性!
.social {
padding: 1.69492%;
}
.social:after {
content: "";
display: table;
clear: both;
}
.social .social__list-item {
width: 8.16327%;
float: left;
margin-right: 2.04082%;
}
.social .social__list-item:last-child {
float: right;
margin-right: 0;
}
使用 Susy 可以如此简单。无需数学技能。**只要您知道如何使用原生 CSS 创建网格,您就会知道如何使用 Susy。**
使用百分比的一件事是不可避免的事实,即您的输出将包含子像素,例如 10.4px。这长期以来一直是布局的主要问题,因为不同的浏览器对这些子像素的处理方式不同。
例如,webkit 浏览器会向下舍入这些像素,并且 10.4px 将向下舍入到 10px。布局中项目的数量越多,每个舍入错误出现的次数就越多。因此,我们的 10 个项目错误在 webkit 浏览器中清晰可见。

此类错误是不雅观的,我们绝对不能容忍。
处理子像素舍入错误
一种方法是确保百分比根本不会生成子像素。但是
这不是一个好主意,因为您将要么被困在一个非响应式网站,要么被困在一个会捕捉到不同网格宽度的网站。
还有另一种方法,我称之为**隔离技术**。
此方法稍微高级一些,需要您更多地了解使用隔离技术布局元素,该技术由Jamie Hill开发。此技术已在经过实战检验的zen 网格中使用了很长时间。如果您熟悉 Zen 网格,您就会知道我在说什么。
如果不是,让我们看看如何使用此技术。
隔离技术
隔离技术的原理是通过使用特定的边距将舍入错误放置在它们应该在的位置,从而减少舍入错误的累积效应。
使用此技术的要求是
- 每个元素都必须具有
margin-left
属性才能将其放置在正确的位置。 - 每个元素都必须具有
margin-right
属性为-100%,以便将下一个项目拉到容器的最左边缘。
如果您不熟悉负边距,这种技巧可能会令人困惑。让我们逐步详细解释一下它是如何工作的。
假设您需要创建一个3列布局

我们将逐个介绍每个项目的定位。项目1非常简单。
- 它的
margin left
为0,所以它位于起始线。 - 然后它使用
margin-right
为-100%将下一个项目(项目2)拉回到起始线。

在项目2自己的CSS属性生效之前,它已经被项目1拉到了起始线。

然后,项目2使用margin-left
属性将其自身定位到2列和2个间距的百分比值,使其正好位于第三列。

项目2也具有margin-right
属性,它将下一个项目(项目3)拉到起始线。

在项目3自己的CSS属性生效之前,它已经被项目2拉到了起始线。

然后,它通过margin-left
属性(其值为4列和4个间距的百分比)定位到第5列。

它将下一个项目拉到起始线,并且对于总项目数,此模式重复。
如果任何项目需要在新行开始,则必须使用clear: left
属性清除其前一个项目的浮动。

为了将其与第一列对齐(位于起始线),它必须将其margin-left属性更改回0以将其放置在那里。

这就是隔离技术的工作原理。现在您已经了解了它,我们可以用它来解决亚像素舍入问题。
解决亚像素舍入错误
我们必须使用隔离技术手动定位每个项目,而Susy可以帮助我们做到这一点。
Susy有一个便捷函数可以帮助您跳过所有手动操作。它被称为gallery
混合。
.social__list-item {
@include gallery(1 of 10);
}
它输出的CSS使用了上面提到的隔离技术。
.social__list-item:nth-child(10n + 1) {
margin-left: 0;
margin-right: -100%;
clear: both;
margin-left: 0;
}
.social__list-item:nth-child(10n + 2) {
margin-left: 10.20408%;
margin-right: -100%;
clear: none;
}
.social__list-item:nth-child(10n + 3) {
margin-left: 20.40816%;
margin-right: -100%;
clear: none;
}
.social__list-item:nth-child(10n + 4) {
margin-left: 30.61224%;
margin-right: -100%;
clear: none;
}
.social__list-item:nth-child(10n + 5) {
margin-left: 40.81633%;
margin-right: -100%;
clear: none;
}
.social__list-item:nth-child(10n + 6) {
margin-left: 51.02041%;
margin-right: -100%;
clear: none;
}
.social__list-item:nth-child(10n + 7) {
margin-left: 61.22449%;
margin-right: -100%;
clear: none;
}
.social__list-item:nth-child(10n + 8) {
margin-left: 71.42857%;
margin-right: -100%;
clear: none;
}
.social__list-item:nth-child(10n + 9) {
margin-left: 81.63265%;
margin-right: -100%;
clear: none;
}
.social__list-item:nth-child(10n + 10) {
margin-left: 91.83673%;
margin-right: -100%;
clear: none;
}
社交媒体区域恢复正常!

现在我们已经积累了一些动力,让我们更上一层楼,使布局响应式。
使布局响应式
响应式网站变得越来越重要,如果我不谈谈如何使用Susy创建响应式布局,那我就亏欠你了。
创建响应式布局的第一步是确保您熟悉媒体查询的工作原理。请特别注意文章中的移动优先媒体查询,因为我们将使用它们。
为简单起见,我们只创建一个具有两个断点的布局——一个用于从0px开始到700px结束的移动视图;另一个用于从700px开始的桌面视图。
在移动视图中,.content
和.sidebar
部分都占据视口100%的宽度。700px之后,.content
和.sidebar
将分别分成8列和4列。
如果您手动编写代码,它可能如下所示(使用Sass)
.content {
/* Styles for mobile view go here */
/* Styles for desktop view go here */
@media (min-width: 700px) {
width: 66.10169%;
float: left;
margin-right: 1.69492%;
}
}
.sidebar {
/* Styles for mobile view go here */
/* Styles for desktop view go here */
@media (min-width: 700px) {
width: 32.20339%;
float: right;
margin-right: 0;
}
}
您无需为移动视图创建任何样式,因为<div>
块默认占用100%的宽度。但是,您需要确保一旦视口达到700px,桌面布局就会生效。
手动编写响应式布局与使用Susy编写响应式布局相同,只是Susy使事情变得更快。您使用完全相同的技术和媒体查询。
.content {
/* Styles for mobile view go here */
/* Styles for desktop view go here */
@media (min-width: 700px) {
@include span(8);
}
}
.sidebar {
/* Styles for mobile view go here */
/* Styles for desktop view go here */
@media (min-width: 700px) {
@include span(4 last);
}
}
这就是.content
和.sidebar
的内容。
接下来是社交媒体部分。这是它在移动视图中的样子。

每个项目不再占用10列中的1列,而是在移动视图中占用10列中的2列,您可以使用span(2 of 10)
来实现这一点。
注意:您可能想知道为什么不使用1 of 5列。span(1 of 5)
和span(2 of 10)
之间存在细微差别,图片可以更好地解释这一点

由于涉及的间距数量不同,这些从根本上来说是不同的布局。您始终可以使用1 of 5选项,但我将坚持使用10,因为间距的大小将更接近12。
我们将再次调用gallery混合,并在每个项目下方添加一个间距,以在行之间提供一些分隔。
.social {
/* ... Same styles as above */
.social__list-item {
@include gallery(2 of 10);
margin-bottom: gutter(10);
}
@media (min-width: 700px) {
@include gallery(1 of 10);
margin-bottom: 0;
}
}
以下是我们到目前为止所做工作的示例
查看Zell Liew在CodePen上的笔 eidcj (@zellwk)。
使用Susy就像使用原生CSS一样。**关键区别在于Susy是一个数学天才。**
Susy非常擅长数学,它可以让您创建具有不同大小列的古怪非对称网格。
让我们尝试使用非对称网格创建CSS-Tricks的布局。
使用非对称网格创建布局
使用非对称网格时,声明列的方式略有不同。您使用Sass列表告诉Susy列数及其大小的比例。由于CSS-Tricks的内容宽度是侧边栏的两倍,因此列可以用2 1
列表表示。这意味着有两列,其中一列是另一列的两倍宽。
您还需要在Susy的全局设置中将输出模式设置为isolate
$susy : (
columns: 2 1,
output: isolate,
)
现在,我们不再说内容有8列,而是说内容有1列。如果您告诉Susy其位置,Susy就能智能地知道列的大小。在这种情况下,内容是第一个项目。
.content {
@include span(1 first);
}
同样,您需要让Susy知道侧边栏占用了多少列以及它位于何处。在这种情况下,侧边栏占据第二列,碰巧也是该行中的最后一项。
.sidebar {
@include span(1 last);
}
它看起来会是这样的

非对称网格还有很多内容,需要一整篇文章才能向您展示如何使用Susy构建它们。我在我的博客上创建了一个简单的设计来解释非对称网格的概念,它使用以下内容作为示例。

此外,我在Learning Susy中全面介绍了如何创建非对称布局,并提供了一个更真实的示例,该示例基于Nathan Ford的设计。如果您想了解更多信息,可以购买这本书。

结论
好吧,我们已经完成了Susy的入门介绍,以及一些外围(但重要)的事项,如亚像素舍入错误。我希望您至少有点相信可以尝试使用Susy。
事实上,Susy的功能远不止我这里介绍的这些。因此,我将向您推荐我的书Learning Susy中的5个示例章节。阅读一下,您将了解如何使用Susy做更多的事情。此外,如果您有任何关于Susy或前端开发方面的问题,请随时与我联系。
真的很喜欢Susy。
不喜欢它与libsass的不兼容性。
编译速度似乎很慢。我编写了一个非常简单的网格系统,它需要大约10秒才能完全编译完成。
希望libsass很快就能支持原生映射,因为Susy绝对是我想要使用的工具列表中的一个。
是的,当Libsass出现时,它会变得更加强大。我也在等待它。不过,对我来说,Susy的编译速度很快。
在我开始使用Flexbox之前,我可能会觉得这很酷,Flexbox解决了所有这些问题,包括对隔离技术的需要。我错过了什么吗?
取决于您的兼容性需求。
https://caniuse.cn/#search=flexbox
简而言之,IE支持不佳,在其他地方也存在问题。但是,如果您不关心这些问题,那么Flexbox非常棒。
Susy更多地关注传统的网页设计流程,其中设计师使用真实的列和比例(而不是Flexbox稍微更灵活的方法)。
Flexbox 非常好,如果你可以不用考虑有限的支持范围的话。在我不用支持 IE9 之前,Flexbox 都无法使用。
Flexbox 很好,虽然我记得我读到过一个问题,但现在找不到链接了。
我读到 Flexbox 会先显示内容,然后再进行弹性布局,所以在网站加载速度稍微慢一点的情况下,布局可能会最初出现混乱,然后在运行完成后突然恢复正常。
不确定这是否只发生在旧版本的 Flexbox 上,可能需要进一步研究。否则,Flexbox 也是很棒的。
我完全同意 Jonathan 的观点,使用 Flexbox,很难做到列和间距比例,这是传统网页设计流程中的一部分,这让我很难使用它。
Suzy 能否流畅地处理根据浏览器宽度变化而变化的列数的布局?例如,在社交图标中,假设有 100 个这样的图标,它们最初每行 10 个,然后逐渐减少到 9、8、7……一直到低分辨率下的 4 个?
是否需要为每当每行列数发生变化时手动添加媒体查询断点?
为此,你只需在 Susy 中设置列的静态宽度即可。我认为这类似于每列使用 span(200px) 或其他值。
是的,你可以像 Jonathan 提到的那样,将社交图标的宽度设置为固定宽度,例如 200px。在这种情况下,你可能还想使用普通的浮动而不是隔离技术。
有趣。
我通常只是将容器设置为固定的像素或百分比宽度,并使用百分比表示网格,无论是 Bootstrap 还是其他网格系统。
网格位于它自己的 CSS 文件中。然后,与网格不同的自定义元素是手动编码的。总的来说,我发现这并不太繁琐。在大多数情况下,我不必偏离网格。
如果这对你有用,那就很酷 :)
我更喜欢手动编写网格,因为它为开发过程带来了更大的灵活性。
我在输出中看到了很多 last-child 和 nth-child 选择器,它们不受 IE8 支持。那么常规的 Susy 用户在这种情况下使用什么?
我使用 justified inline-blocks 和 Susy 的 span() 函数来控制宽度。
例如:width: span(3) 而不是 @include span(3)。
有两种方法可以解决这个问题。
选项 1
你可以将 gutter-position 设置切换为 before、inside 或 split。
如果你切换到 before,则必须使用 :first-child 代替。
如果你切换到 split 或 inside,则无需使用 :nth-child 或 :last-child。
你可以在此处了解更多关于间距位置的信息:http://www.zell-weekeat.com/susy-gutter-positions/
选项 2
第二个选项是为 IE8 使用 polyfill。如果你在响应式网站上工作,则需要添加媒体查询 polyfill。只需将 Selectivizr polyfill 也添加到其中即可。
你可以在此处了解更多信息:http://www.zell-weekeat.com/support-for-older-browsers/
我还没有太多使用 Susy,所以看起来我需要更多地了解间距位置,尽管 Mitch 的想法听起来很有趣。
顺便说一句,你并不一定需要为旧版 IE 提供媒体查询支持的 polyfill:http://jakearchibald.github.io/sass-ie/(这是我使用的方法)。
啊,我的意思是如果你也希望 IE8 具有响应性,则需要 polyfill,但这是处理 IE8 的另一种好方法! :)
是的,在使用 Susy 时我也经常使用 span() 函数,这在你想要创建一些使用 @include span() 的默认输出不太好的独特布局时很有帮助。
通常情况下,我只是使用 span() 函数获取列宽来进行 margin/padding 推拉。
我认为“解决亚像素四舍五入错误”部分有一个错别字。它应该是
是的,你说得对。感谢你发现这一点!
隔离技术图像中所有边距的尺寸都是 **-100** 而不是 **-100%**。
很棒的文章!Susy 确实看起来非常好。与 Bourbon 的 Neat 相比,你有什么想说的吗?
你的意思是“隔离技术图像中所有边距的尺寸都是 -100 而不是 -100%.”?
我还没有对 Neat 与 Susy 进行完整的讨论,我将在几周内进行这方面的工作。
我总是将 Bourbon 与 Neat 一起使用。Neat 文档非常完善,并且易于自定义。
在响应式环境中它是如何工作的,你需要在每个断点处计算出哪个项目将是最后一个吗?
另外,只是好奇,你选择浮动而不是内联块的原因是什么?
不过,文章写得很好!
谢谢 Brendan! :)
有几种方法可以与 Susy 协同工作。在我上面选择的方法中,你必须计算出在每个断点处哪个项目是最后一个。在其他方法中,例如使用 inside 或 split 的 gutter-position,则不需要这样做。
查看此页面以了解其他间距位置的简介:http://www.zell-weekeat.com/susy-gutter-positions/
我选择使用浮动,因为它更容易。内联块会在内容的侧面和底部引入这些奇怪的小间隙,并且(在我看来)很难在没有像 margin-right: -3px 这样的 hack 的情况下使其完美。我个人不喜欢在我的 CSS 中使用 hack :)
Susy 的演示很棒!
我需要在我的工作流程中检查一下。
PS。请更改最后一段中的链接 - 学习 Susy :)
知道了,我会告诉 Chris 的 :)
你的工作流程怎么样?
只是指出,此输出 CSS 仍然可以通过将
.social__list-item
类中的公共属性分组来极大地改进,如下所示只有
margin-left
会改变。除此之外,这是一篇非常有趣的文章。
代码略有偏差。对于不在最左侧的任何项目,你必须使用
clear:none
。如果只需要考虑一种布局,这会减少输出代码并且效果很好。如果你的布局在不同的断点处发生变化,则需要确保
clear: none
能够在每个断点处覆盖clear:both
。这可能很难做到,因为 :nth-child 会为 CSS 添加特异性。并且需要付出更多努力才能确保代码正确。
如果你有任何好的解决方案,那就太好了 :)
非常感谢。好文章。
这真的太棒了,但是 Foundation 5 在 block grid 的伪装下也有一些相同的功能。
Foundation 5具有一些与创建图库相同的功能。然而,整个网格系统却大不相同。
Foundation在添加断点时非常依赖HTML,而在Susy中,你可以用任何一种方式实现。选择权在你手里。
如果你使用SASS版本,你可以将grid-row和grid-column混合宏与媒体查询结合起来,对很多东西进行微调,而无需依赖HTML。
但是Susy中的网格看起来确实更强大,尤其是gutter的位置。你可以在Foundation中折叠gutter,去除边距和填充,但之后可能会遇到其他问题。看起来Susy处理得更好,还有其他方面。
关于Suzy的精彩文章……绝对需要深入研究一下。
好文章。我之前用过Susy,到目前为止真的很喜欢它。我唯一不喜欢的是,Susy输出的代码距离DRY原则很远。每次使用span()混合宏(或者任何其他混合宏)时,都会生成相同的代码(当然)。如果Susy能“知道”这一点,并在尽可能多的情况下使用extends,那就太好了。
虽然我确实不太喜欢框架,但我认为框架处理得更好,因为使用了简单的类,这使得代码更DRY。但缺点当然是你不能在一个响应式网站中将“grid_4”元素更改为“grid_2”。我认为这是一个巨大的缺点。
你对此怎么看?
抱歉回复晚了!
是的,我同意Susy有可能变得更加DRY,而且可能有很多方法可以做到这一点。也许我们应该深入研究代码并提交改进建议 :)
不过,很难想到所有可能的@extend场景。
这个缺点对我来说是无法接受的。仅仅想象一下在HTML中放置所有这些类并在之后更改它们,就让我感到恐惧!最重要的是,我发现原型设计过程中布局很可能发生很大变化,而Susy使事情变得更容易。
我认为Susy有一个真正的缺点。那就是你必须真正了解CSS才能很好地使用它。这对许多其他人来说将是一个障碍。
你对此怎么看?
是否要遵循DRY原则,更多的是个人喜好和工作方式的问题。因此,如果你有一个基本布局,没有很多不同的布局,那么无论如何你的代码都会相当DRY,但更重要的是,你的样式表中不会充斥着未使用的规则。
框架(通常是Bootstrap和Foundation)本质上包含大量未使用的网格类。
至于在响应式网站上无法更改元素,你有点误解了。例如,Bootstrap在一个块上使用4种可能的屏幕尺寸/布局组合:col-lg-*、col-md-*等等,允许你在任何断点处将x列更改为你想要的任何列。
我肯定也会尝试使用Susy。我更喜欢编写.blog-article而不是.col-lg*之类的东西。它使你的sass更清晰易用,并赋予你绝对的控制权,而不是受制于他人的感知。
是否可以在sass中混合使用susy和boostrap 3?这会造成什么问题吗?
是的,Paul,
可以一起使用Susy和Bootstrap。我没有深入研究过同时使用这两者的方式,但据我所知,应该不会有什么大问题。
确实很有趣,但正如Christian Krammer所说,它不是非常DRY。不过,当你想到一个系统时,我们到底需要多少声明?据我所见,你可以简单地为文章、图库、页眉、页脚、全局布局等创建几个类,然后在整个项目中(重新)使用它们。
坦率地说,当涉及到DRY与在开发过程中更改设计关键部分的可能性时,我总是选择后者。就像我现在在日常工作中遇到的问题——我们有一个包含六个块的字段,但现在设计师决定我们需要七个块。而且,由于我们使用的是bootstrap,所以我们遇到了问题。看看Susy,这将是一个更改一行代码的问题。
哈哈,我完全理解你的感受!
我不介意Susy不是超级DRY。Susy可能为所有布局创建的代码行数与CSS其余部分的代码行数相比,可能微不足道。
非常感谢这篇文章!期待在你的博客上看到更多关于Susy的内容!
在我的最后一个应用程序中,我使用了基于以下技术的方法:
(http://http://webdesign.tutsplus.com/tutorials/a-simple-mixin-alternative-to-standard-css-grids–webdesign-16958 “less混合宏”)
如前所述,如果你只有一个像示例中那样的页面,那么DRY方法非常好,但在一个包含许多页面且在列数方面具有不同布局的站点中,你可以
#在一个文件中定义许多类;
或者你可以为每个页面创建一个样式文件
你对此怎么看?
此致
我相信无论你试图创建什么类型的网站,都应该将不同布局的数量限制到最少。不同的布局模式越多,网站设计不一致的可能性就越大。如果你使用相同的布局,那么根本就没有问题。
我肯定会为所有内容使用一个样式文件。
你好,
不用费心发布这条评论;我只是认为你在发布的代码中忘记了一些百分号,在以下选择器中:.social__list-item
不过文章不错
谢谢你的分享。我正处于学习网页开发的初期阶段……我还有很多东西要学。Squarespace博客文章中是否有自动将所有图像调整为最大高度/宽度的代码?
我从未使用过Squarespace,但我相信你在寻找类似这样的东西
img {
max-width: 100%;
height: auto;
}
试试看,看看是否有效
我认为在“以下是我们迄今为止所做工作的示例”部分上方有一个错别字。.social__list-item的大括号过早关闭了。不过在最终代码中是正确的。
我认为现在市面上有太多的变体和技术,已经到了使水变得浑浊的地步……实际上并没有改进任何东西……而且由于没有人能真正了解所有这些技术……我们很快就会遇到重新运行的场景……那时人们只是做自己的事情,因为他们不知道更好的方法……但这一次,我们将吸取过去的教训,拒绝重蹈覆辙,这一次我们将有数百种不同的方法来制作网站(应用程序),而一个被交给代码并被要求修复或改进的程序员……唯一能做的就是挠头,因为他们毕竟是人……
Susy、Neat和Singularity(在Susy 2发布之前,它要好得多)在处理网格灵活性的方法上非常相似。
我之前考虑过切换到susy,但仍然对Singularity(与Breakpoint结合使用)非常满意。我认为它的输出甚至比Susy更DRY。
无论如何:关于Susy的深刻见解,谢谢!
我之前从未听说过Susy,也从未使用过。但我认为它比其他的更容易使用。感谢分享。
我喜欢你写的这篇文章!谢谢。
我无法在Windows 8上使用susy。我安装了Ruby和susy,但它不起作用?有谁知道为什么吗?如何解决?
我的错误
“错误:找不到或无法读取要导入的文件:susy。
加载路径
…”
你是否查看过Scout?它是一个类似于winLess但用于SCSS的工具:你启动它,它会监控所选文件夹中的所有SCCS文件,并在保存时编译它们,因此无需Ruby、gem等。
或者你可以使用Bracket编辑器,在那里你可以安装一个插件来编译LESS和/或SCSS文件
此致
你对profound grid与susy的看法如何?这是一篇非常有趣的文章,但我仍然无法决定是使用susy还是profound。
http://www.profoundgrid.com/
Profound grid 看起来很有趣!我还没有深入研究,所以我的观点可能有点偏颇。
我认为 Susy 更加灵活,可以在更多场景下使用。当然,如果你想学习所有内容,它也稍微复杂一些 :)
.wrap {
max-width: 1120px;
margin-left: auto;
margin-right: auto;
}
.wrap:after {
content: " ";
display: block;
clear: both;
}
任何帮助表示感谢。
哇,刚刚意识到我忘记在文章中添加
container()
混合。你需要添加以下代码行:
嗨,Zell,
我也收到了一条关于缺少混合 @cf 的错误消息
这是因为以下代码行:
/* 添加 clearfix,因为所有子元素都浮动 */
@include cf;
我在我的代码中添加了以下内容(但我知道还有其他 clearfix 方法) - 这合适吗?
@mixin cf {
&:after {
content: “”;
display: table;
clear: both;
}
}
哦,天哪,我真是太粗心了。
是的,你完全正确。这是一个标准的 clearfix 混合。感谢你指出这一点!
谢谢,Zell!