David 最近重新设计了他的博客,并邀请了一系列嘉宾为他的网站撰写文章。我们决定以交叉的方式进行:他为 CSS-Tricks 撰写一篇文章,而我则为 David Walsh 博客撰写一篇文章。他在重构中使用了 Sass,以下是他关于这种体验的文章。我使用它已经快一年了,所以 我在他网站上的文章也是关于这种体验的。
创建一个不使用 CSS 预处理器的网站似乎是一个糟糕的决定。即使只是为了快速修改一些颜色或元素尺寸,或者仅仅是为了轻松地合并和压缩 CSS 文件,CSS 预处理器也变得越来越重要。为了最近对 David Walsh 博客 进行的重构,我决定现在是深入研究 CSS 预处理器的时候了。以下是我关于这种体验的一些想法,希望您能从中获得一些提示。
决定使用 Sass
关于是否使用像 Sass 或 LESS 这样的工具,并没有多少需要决定的问题,更多的问题是应该使用哪一个。最后,我选择了 Sass,因为
- 我使用 LESS 的体验... 并不那么令人满意;这个工具似乎... 维护得不太好
- 像 Compass 这样的工具,一个包含更新器的混合集合,非常宝贵
extend()
API 看起来很棒- 将媒体查询样式嵌入到选择器中可以提高组织性
- 雪碧生成是一个巨大的省时工具
- Chris Coyier 告诉我应该这么做!
当您编写像 David Walsh 博客或 CSS-Tricks 这样的博客时,学习一个新的 CSS 工具也提供了撰写另一个有用主题的绝佳机会。在这个项目中使用 Sass 显然是最佳选择。
有用的代码片段
以下是我在网站上经常使用的一些 Sass 代码片段
供应商前缀
@mixin vendorize($property, $value) {
-webkit-#{$property}: $value;
-moz-#{$property}: $value;
-ms-#{$property}: $value;
-o-#{$property}: $value;
#{$property}: $value;
}
浮动清除
@mixin clear() {
&:before, &:after {
content: "\0020";
display: block;
height: 0;
overflow: hidden;
}
&:after {
clear: both;
}
}
屏幕外文本
@mixin linkTextOffscreen() {
text-indent: -9999px;
overflow: hidden;
text-decoration: none;
display: block;
font-size: 0;
text-align: start;
}
:hover、:active、:focus 样式
@mixin hoverActiveFocus($property, $value) {
&:hover, &:active, &:focus {
#{$property}: $value;
}
}
我在代码中大量使用了这些混合。我的一些代码片段模拟了 Compass 提供的功能,但我喜欢看到混合提供的具体样式。
错误,错误
就像第一次使用任何工具一样,我犯了不少错误。不过,犯错是件好事——您可以从中吸取教训,并写下来,这样其他人就不会再犯同样的错误了。我犯的错误包括
- 嵌套 == 膨胀:迄今为止,我在 Sass 中犯的最大错误是在不需要嵌套的情况下嵌套了样式。在发布时,我的主要 CSS 文件是一个令人作呕的 59k!我仍在努力缩减样式的大小,现在网站已经发布,这是一项更加困难的任务,因为...
- ...特异性冲突:由于我在不需要的情况下嵌套样式的问题,我遇到了很多特异性冲突,导致我的 CSS 文件膨胀得更厉害。当涉及到屏幕尺寸媒体查询 CSS 时,我需要将所有内容标记为 !important。由于不正确地使用 SASS 选择器嵌套,这导致了大量的 CSS 膨胀和麻烦。
- 雪碧生成... 太迟了:我选择 SASS 的一大原因是我知道 SASS 会管理雪碧生成。多么省时啊,对吧?嗯,只有在你一开始就知道如何格式化它们的情况下才如此。我的问题是我创建了带有普通 background-image 声明的 CSS,没有注意 SASS 的期望格式。当我创建雪碧后才发现正确的格式,然后就说“WTF FML”。最后,我创建了自己的雪碧,因为我一开始没有正确编写 SASS。非常令人懊恼的错误。
- 复制 Compass 提供的助手:我无需提及它们... 我非常确定我复制了 Compass 提供的功能。如果我不更新代码,并注意浏览器功能,我以后可能会为此付出代价。
提示和最后印象
我想给大家留下一些关于如何开始使用 SASS 的提示,并分享一些关于 Sass 开发的最后印象
- 尽管我复制了 Sass 提供的功能,并且遇到了嵌套问题,但 Sass 仍然是一个很棒的工具,它与 Compass 结合,提供了可用的最佳工具+更新环境。
- 在嵌套选择器时,问问自己这样做是否真的必要。当然,嵌套也有助于更好地组织代码,但膨胀的样式表会让所有用户都感到痛苦。
- 为 CSS 动画属性创建变量,尤其是持续时间和延迟。一致的动画时间可以确保令人赏心悦目的 UI 效果。
- 为块填充创建变量,并使用简单的公式($blockPadding/2)来计算较小的块。这可以确保一致的元素间距。
- 您可以在选择器中嵌套媒体查询,但我更喜欢为移动/媒体查询特定的样式创建一个单独的文件;这样可以让我一目了然地看到所有移动样式。我的打印样式也是如此。
- 我使用 这些说明 将 Sass 语法高亮添加到 Sublime Text 2 中。
- 在您编写代码时,跟踪您的 CSS 文件大小,并定期审查您的嵌套策略,以避免样式膨胀。
- 尽可能地使用 CSS 动画——它们可以为您节省很多将来 JavaScript 代码。
最后,我对决定使用 Sass 作为我的 CSS 预处理器的决定感到非常满意。文档很有帮助,您可以在几分钟内上手使用,而 Compass 在很多方面都是一个宝贵的工具。我使用 Sass 的唯一问题都是我自己造成的,下次就可以轻松避免了。在您的下一个网站或重构项目中尝试一下 Sass——它非常有用,并且会在整个项目中发挥作用。
我使用 Sublime Text 2 作为我的编辑器,发现这是一个很棒的插件:http://wbond.net/sublime_packages/prefixr
它可以为您节省不需要添加前缀的操作,从而减少额外的膨胀。
Chris 谈到了使用 Compass 添加前缀——Prefixr 是否更好,更新?也就是说,是否有理由选择 Prefixr 而不是已经与 SASS 一起安装的 Compass?
Prefixr 已经被证明对我很有用,但是的,如果您只是使用像 SASS 或 LESS 这样的预处理器,您只需要创建几个混合;除非您选择不使用它们,否则 Prefixr 并不是必需的。您甚至不需要重新编写混合(复制粘贴的乐趣)。
Prefixr 很棒,但是当您在 .scss 文件中工作时,您可以使用
对比
前者在整洁性方面比后者具有更大的优势。
很棒的东西。我仍然面临的一个挑战是与可能需要维护以后的 CSS 的团队/客户合作。还没有机会将项目提交到 100% 的 SASS 解决方案。
很棒的帖子!
我最初对嵌套的痴迷肯定使我的 CSS 膨胀了……希望我能在开始变得狂妄之前读到这些警告。
与其使用你的 vendorize 版本,我使用
它具有以下优点,你可以像这样使用它
太(你甚至可以使用多个属性,如下所示
太棒了 Peter!我将……借用……它!:D
Compass 有一个内置功能来避免不必要的前缀……因此,你不需要编写自己的自定义 mixin ;)
http://compass-style.org/help/tutorials/exclude_vendor_prefixes/
稍作改进
总体重新设计很好。不过,我有一个问题。当我按住向下箭头滚动时,一旦松开,它就会滚动回每个下一个博客文章。我认为对 UX 不利!
使用 @extends 来清除浮动和文本不可见性是否更有意义?
David……看了你的新博客,读了 Chris 的文章,然后试图给你留言——你的链接不起作用。试图提交错误报告——但不会只为了告诉你一个你最终可能会发现的错误而注册 git。所以,也许你会看到这些评论。
喜欢你网站的新皮肤——我注意到一件事。在狭窄的尺寸(即移动设备)中查看时,特别是这篇文章(Chris 的),只显示标题,并且需要滚动很长时间。?可能一个媒体查询来减小标题标签的字体大小看起来会很好?只是一个想法。
使用
hoverActiveFocus
mixin,如果你需要多个规则,最终会产生大量代码膨胀,因为 SASS 还没有对等效的选择器进行分组。相反,你只需尝试用@content
语句替换规则语句。 了解更多@DavidWalsh,不要使用你正在使用的当前 linkTextOffscreen() mixin,看看这个 更新的图像替换版本。
在使用 Bones(一个 WordPress HTML5 启动主题) 时遇到了它,也强烈推荐。
看看你发布的 更新的图像替换版本 文章中的最后一条评论,你就会明白为什么你不应该将其用作 -9999px 解决方案的解决方法。
嗯。这位皇帝确实有衣服,但它们是相当破旧的服装,在集成方面。
例如
(1) 世界上最有用的调试功能 Firebug 对 SCSS 文件编号一无所知(……我知道……有一些笨拙的插件可以提供一些帮助等等)使使用 Firebug 调试 css 实际上毫无用处
(2) 几乎所有宇宙中最好的 IDE 都对 css 具有相当不错的代码着色和代码完成,但似乎对 SCSS 或 LESS 一无所知(当然……早期……插件即将推出等等)
(3) CSS 的预处理器,嗯。也许接下来是 javascript 预编译器,多么混乱。
也许一直都是这样——标准发展得太慢,hacky 的解决方法,更好的标准,重复……好吧。
没错,我也是使用 CSS 预处理器的主要罪魁祸首。它几乎在一开始就让我却步,但过了一段时间,它就不那么糟糕了。我会美化编译后的 CSS,并在调试时将其粘贴到浏览器中。从那里,很容易(更)找到我的 LESS/SASS 中的对应行。
并不完全正确!WebStorm 对此提供了相当不错的支持,并且更多支持即将到来。将其与 CodeKit 配合使用,你将获得一个非常棒的设置!
希望 Source Maps 也会包含在 CSS 中(我们在 JS 中有它们——将压缩/混淆的文件与源文件链接起来),然后所有这些问题都将消失。
1.) Firesass
2.) ST2 带 SCSS 插件(安装需要 10 秒)
如果你太懒得做这件事,那么你将很难使用 Sass……否则它会极大地简化你的生活(当然,最终取决于你,但至少不要只是重复陈词滥调)
哈哈,普通的 CSS 更简单、更整洁,不需要膨胀你的样式表。除非你是全职编码网站的业务,否则学习 sass 或 less 太荒谬了……太荒谬了
@nick——除非你全职构建网站,否则为什么要使用 CSS?作为爱好?是的,那么预处理器可能有点过分了。这里大多数人都在讨论的不是爱好。
我们很多人全职做这件事,也没有用它。
有趣的是,人们用它来减少 CSS 文件的大小……完全是疯狂。
从维护的角度来看,嵌套媒体查询是一个杀手级功能。你不能让 sass 将这些查询编译到一个单独的文件吗?这似乎是预处理器的完美选择。
@David——你有特别的理由不使用 HTML5 Boilerplate 中的屏幕外文本“修复”吗?iPad 1(至少)在将东西放置在页面之外时存在问题。
/* 仅在视觉上隐藏,但对屏幕阅读器可用:h5bp.com/v */
.visuallyhidden { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; }
hoverActiveFocus 可以用 @content 编写
我很高兴越来越多的人开始使用 SASS。
但是,我对你的文章有两点说明
我认为“供应商前缀”代码段有点过分。如今,只有极少数属性需要全部前缀。由于 Firefox 不需要动画、过渡和变换的前缀,而 IE10 使用几乎所有无前缀属性(而 WebKit 肯定会很快效仿),在我看来,没有必要使用如此庞大的代码段。
而且,由于你提到了媒体查询的嵌入:不要这样做(或建议这样做),因为那将是代码膨胀的真正原因。想象一下,如果将每个属性/元素的媒体查询直接嵌套在它下面。将所有媒体查询附加在一起放在 CSS 的末尾仍然是最好的方法,直到 SASS 为我们自动执行此操作为止。
那么你如何应对旧版本的浏览器呢?
你真的不希望你的所有访问者都使用最新版本吗?
当然,你可以为每个浏览器和版本创建单独的样式表,但这在我看来并不干净——恰恰相反……
SASS 将无法将媒体查询分组到 CSS 文件的末尾,因为这将影响选择器的特异性。
正如 Chris Coyer 在最近一期的 Shop Talk Show 中指出的那样,使用 GZIP 压缩你的文件将解决嵌入式媒体查询导致的所有重复问题。从代码组织的角度来看,这也是更好的选择,因为你可以看到一个元素的所有样式,而不管媒体查询如何。
我刚刚跃跃欲试,安装了 Code Kit,并开始在我的最新项目中使用预处理器。
我只有一个问题,在 SASS 网站上,他们提到了 SASS 和 SCSS。在我看来,SCSS 是 SASS 的最新版本。当你提到 SASS 时,你是指 SCSS 吗?
@sebastian——sass 和 scss 是同一个东西。它们只是写法不同:)
实际上,它们不是同一个东西。语法不同。
只是好奇人们是用 SASS 语法还是 SCSS 语法。
有一种更好的通用前缀方法:示例。这允许根据属性设置正确的前缀。例如,
border-radius
从来没有-o-
前缀。我有一个想法,你可以将清晰的 @mixin 转换为 %placeholder,以减少重复的代码行。使用起来和 @mixin 一样简单。
“@extend clear;”
修复了拼写错误
“@extend %clear;”
嵌套过深会导致麻烦的特殊性。是的,我也是通过艰苦的教训学到的!
我一直对预处理器感兴趣,但从未真正尝试过。读完这篇文章后,我认为它说服我终于尝试一下了!
Sass 绝对是一个更好的工具,因为它易于使用。此外,Compass 是一个很棒的 mixin 收集器。
我已经在几个项目中使用过 Sass,我最大的失望是嵌套选择器使用后代组合器 (E F) 而不是子组合器 (E > F)。
我很少使用后代组合器,所以我最终在每个地方都使用“& > F”。
哦,你见过http://www.zeldman.com/2012/03/01/replacing-the-9999px-hack-new-image-replacement/ 用于屏幕外文本吗?
只需以
>
、~
或+
开头你的嵌套选择器,就是这样。应该输出
我在 LESS 中使用了很多,根据http://stackoverflow.com/questions/7345763/sass-and-combined-child-selector,它应该在 SASS 中以相同的方式工作。
屏幕外文本 > 这种方法可能更好一些(我还没有测试过),但请参阅Paul Irish 的评论。
大约 8 个月前,我考虑过 SASS,看到了“ruby”这个词,然后选择了 LESS 和 WinLess。那可能是一个愚蠢的决定。LESS 始终困扰我的一件事是,它与 WinLess 结合使用时,构建 .css 文件的速度非常慢。
LESS 开发已经停滞了几个月(停留在 v1.3.0),github 上有 100 多个问题,人们变得焦躁不安,并谈论在开发者允许的情况下将其剥离。我最终加入了 SASS/Compass 的队伍,它更好。LESS 实际上是在昨天(10 月 18 日)在 github 上更新的,但我不会再回去。在 PC 上,你可以使用命令行自动构建你的文件。
两个我之前没有提到的提示
1) 在 Windows 上,如果你使用命令行“compass watch”与“config.rb”文件结合使用来监视并自动构建你的文件,它会打开一个命令行对话框。你必须一直保持它打开,这很烦人。我使用“HideIt”将其隐藏在托盘区域
http://vasanrulez.deviantart.com/art/HideIt-Hide-all-your-windows-206517834
2) Compass 具有一个名为“inline-image()”的杀手级功能
http://compass-style.org/reference/compass/helpers/inline-data/
它的作用是允许你直接在样式表中对图像进行 base64 编码,而不是引用服务器上的文件。可以节省下载量,有助于你的 Yslow/Page Speed 评分(如果你喜欢这种东西),并且可以作为缓存你图像的一种好方法,因为你实际上没有提供任何基于文件的真实图像。
如果你使用这种技术,它会使你的 CSS 变得非常庞大。Gzip 不会真正压缩 Base64 内容,因此请确保在“内联”图像之前优化你的图像。最后,如果你关心 IE7(因为许多网站仍然必须迎合此人群),你必须为其提供真实的图像文件,因为它不理解 Base64。类似于
非预处理器 CSS 是疯狂的。LESS 是一个好想法。SASS+Compass 是天才。感谢 David。
我已经使用 Sass 大约一年了,IMO,拥有更简洁的代码可以帮助你编写更好的 CSS。现在不会再回到过去了
以前使用过 LESS,它并没有真正激励我放弃传统的 CSS 技术。但是 Sass 看起来不错,可能会让我改变主意 :)
Compass 有大量的 CSS3 帮助器,你只需要导入它们,然后使用
@include border-radius(5px, 5px);
它会输出所有供应商前缀。它们还内置了其他帮助器,比如垂直节奏,可以使你的字体保持一致。我知道 Compass 也内置了 CSS Grid 框架,但我最近使用的是Susy,它是 Eric Meyer 创建的响应式网格框架,我很喜欢使用它,感觉它非常容易上手。
我之前使用过 less 和 sass。我认为目前 sass 有更多选项,但 less 也还不错。我知道它可以快速编译,我发现学习 less 比较容易,主要是因为它的文档更好。我希望有人能很快接手 less,并继续这项工作,但它仍然可以使用。最近人们一直在批评它,这似乎已经成为一种趋势。
至于前面关于与 css 相比只节省几秒的评论,这真的不正确。你节省的是分钟,这些分钟会随着时间的推移变成小时。自从我切换到 sass 以来,我的工作流程大大提高了。
Chris,你能写一篇关于 Sass + Compass 最佳实践的文章吗?我目前遇到了同样的问题。
我正在开发一个小型网站,CSS 文件大小非常大(大约 40KB,而且我刚开始)
嘿,我对 SASS 仍然比较陌生,所以这里可能漏掉了什么,但我想知道为什么你要使用 mixin 来清除而不是 extend?
在输出中,mixin 基本上会重复你在使用它的类上的清除代码,而 extend 只会将该类添加到代码中;从而导致更少的“膨胀”。此外,清除代码不太可能改变。
谢谢!
嗨 Chris,
关于 SASS 的好文章,
我在 css 文件编辑中有一个查询,在创建 sass 文件后,它会编译 css 文件,如果我在 css 文件中进行中间编辑,然后再次开始在 sass 文件上工作,现在它会覆盖我在 css 中的编辑,有没有办法忽略这种情况。
如果有的话,请告诉我。
此致,
Mufaddal
Mufaddal,如果你使用的是自动将 SASS 编译为 CSS 的东西,比如 Scout 或者一个“compass watch” .bat 文件,那么,没有,没有办法覆盖对你的 .CSS 的覆盖。
看起来你认为 SASS/CSS 应该像同步进行那样向前和向后同步。写入只能是单向的:从 SASS 到 CSS。但这正是使用 SASS 的意义所在。你不应该再深入到你的原始 .CSS 文件中了,你应该只编辑你的 .SASS 文件。
现在,如果你必须禁用它,那么你需要关闭任何正在轮询 .SASS 文件更改的东西,然后手动运行编译器。
但要知道,这样做会导致出现不一致。
@Mufaddal
我认为是“_partials”,然后只使用纯 CSS,因为 CSS 也是有效的 scss。因此,你所有的附加 css 都将被导入到编译后的主 css 中。阅读一下“partials”,它可能是你需求的一种解决方案。
我知道我的评论有点晚了,但可能对普通读者和偶然发现的人有所帮助。