“我应该选择哪个 CSS 预处理器语言?” 近期成为热门话题。 我被亲自问过几次,而且似乎每隔几天就会出现一次在线辩论。 很高兴讨论已经从是否预处理是一个好主意转变为哪种语言是最好的。 让我们开始吧。
非常简短的答案:Sass
稍长一些的答案:Sass 在许多方面都更好,但是如果您已经习惯使用 Less,那就很酷了,至少您通过预处理对自己有所帮助。
更长的答案:继续阅读。
更长的答案
使用 Ruby、命令行等的学习曲线
唯一的学习曲线是语法。 您应该使用 CodeKit、LiveReload 或 Mixture 等应用程序来监视和编译您创作的文件。 您不需要了解有关 Ruby、命令行或其他任何内容的任何信息。 也许您应该知道,但您不必知道,所以这里不是一个因素。 Sass 使用 Ruby 以及 Less 使用 JavaScript 对于大多数潜在用户来说意义不大。
获胜者:没有
帮助使用 CSS3
使用任何一种语言,您都可以编写自己的 mixin 来帮助使用供应商前缀。 那里没有获胜者。 但是您知道您不会返回并更新您在所有项目中使用的前缀吗?(您不会。)您也不会更新手工制作的 mixin 文件。(可能不会。)
在 Sass 中,您可以使用 Compass,而 Compass 会保持自身更新,因此前缀情况将为您处理。 Bourbon 也不错。 这些项目中哪个“领先”将有一些来回。
在 Less 中,也有一些 mixin 库 在争夺最佳位置。 它们如今比过去看起来好多了。 尽管它们有营销支持图表,但我认为它们不如 Sass 版本健壮。 我过去了解到 Less 本身的语言无法在它之上构建同样健壮的库。 我们将在下一部分中讨论其中一些内容。
在这两种情况下,您都需要负责保持预处理器软件本身以及这些库的更新。 我也发现 Sass 通常更容易。 例如,Compass 更新将自动出现在 CodeKit 中,或者您使用易于更新的 Gem,而对于 Less mixin,您需要手动更新文件。
获胜者:勉强 Sass
语言能力:逻辑/循环
Less 能够执行“受保护的 mixin”。 这些 mixin 仅在某个条件为真时才生效。 也许您想根据模块中当前的文本颜色设置背景颜色。 如果文本颜色为“很浅”,则可能需要深色背景。 如果它为“很深”,则可能需要浅色背景。 因此,您有一个分成两部分的 mixin,这些 mixin 带有保护程序,以确保其中只有一个生效。
.set-bg-color (@text-color) when (lightness(@text-color) >= 50%) {
background: black;
}
.set-bg-color (@text-color) when (lightness(@text-color) < 50%) {
background: #ccc;
}
因此,当您使用它时,您将获得正确的背景
.box-1 {
color: #BADA55;
.set-bg-color(#BADA55);
}
这过于简单化,但您可能明白了。 您可以使用它完成一些花哨的事情。 Less 还可以执行自引用递归,其中 mixin 可以使用更新的值调用自身,从而创建一个循环。
.loop (@index) when (@index > 0) {
.myclass {
z-index: @index;
}
// Call itself
.loopingClass(@index - 1);
}
// Stop loop
.loopingClass (0) {}
// Outputs stuff
.loopingClass (10);
但 Less 的逻辑/循环能力到此为止。 Sass 在语言中具有实际的逻辑和循环运算符。 if/then/else 语句、for 循环、while 循环和 each 循环。 没有技巧,只有适当的编程。 虽然受保护的 mixin 是一个非常酷的自然概念,但语言健壮性归功于 Sass。 这种语言健壮性是 Compass 成为可能的根本原因。
例如,Compass 有一个名为 background
的 mixin。 它非常健壮,您可以将几乎任何内容传递给它,它都会输出您需要的内容。 图像、渐变以及它们以逗号分隔的任何组合,您将获得您需要的内容(包括供应商前缀)。
此简洁易懂的代码
.bam {
@include background(
image-url("foo.png"),
linear-gradient(top left, #333, #0c0),
radial-gradient(#c00, #fff 100px)
);
}
转变为这个怪物(不幸的是,我们需要它才能与尽可能好的浏览器支持一起使用)
.bam {
background: url('/foo.png'), -webkit-gradient(linear, 0% 0%, 100% 100%, color-stop(0%, #333333), color-stop(100%, #00cc00)), -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 100, color-stop(0%, #cc0000), color-stop(100%, #ffffff));
background: url('/foo.png'), -webkit-linear-gradient(top left, #333333, #00cc00), -webkit-radial-gradient(#cc0000, #ffffff 100px);
background: url('/foo.png'), -moz-linear-gradient(top left, #333333, #00cc00), -moz-radial-gradient(#cc0000, #ffffff 100px);
background: url('/foo.png'), -o-linear-gradient(top left, #333333, #00cc00), -o-radial-gradient(#cc0000, #ffffff 100px);
background: url('/foo.png'), -ms-linear-gradient(top left, #333333, #00cc00), -ms-radial-gradient(#cc0000, #ffffff 100px);
background: url('/foo.png'), linear-gradient(top left, #333333, #00cc00), radial-gradient(#cc0000, #ffffff 100px);
}
获胜者:Sass
网站友好度
Less 拥有一个更友好、更易于使用的网站。 Sass 文档 并不糟糕。 它很完整,您可以找到您需要的内容。 但在争夺前端人员的关注时,Less 占有优势。 我毫不怀疑,这在 Less 目前赢得人气竞赛中发挥了重要作用。
我知道 Sass 网站正在进行重大改革,并且许多优秀的人员正在努力完成它。 但在我看来,进展非常缓慢。
获胜者:LESS
@extend 概念
假设您声明一个具有少量样式的类。 然后您希望另一个类几乎做同样的事情,只是有一些额外的内容。 在 Less 中,您可能
.module-b {
.module-a(); /* Copies everything from .module-a down here */
border: 1px solid red;
}
这实质上是一个“包含”。 在两种语言中都是 mixin。 您也可以使用包含在 Sass 中执行此操作,但最好使用 @extend
。 使用 @extend
,.module-a
中的样式不会仅仅在 .mobule-b 中复制(这可能被视为膨胀),而是 .module-a 的选择器在编译的 CSS 中被更改为 .module-a, .module-b
(这更有效)。
.module-a {
/* A bunch of stuff */
}
.module-b {
/* Some unique styling */
@extend .module-a;
}
编译为
.module-a, .module-b {
/* A bunch of stuff */
}
.module-b {
/* Some unique styling */
}
看到了吗? 它重写了选择器,效率更高。
在 Less 中,每个类也是一个 mixin,在编程方面会混淆水域,但在开始时更容易理解。
从 Less 1.4 开始,它也支持 extend。 您可以查看 升级到它时在 CodePen 上的一些示例。 它有点奇怪,因为它不会扩展嵌套在原始类中的选择器,除非您使用额外的 all
关键字。 对我来说,拥有两种方式似乎实际上更强大,但也担心幕后发生的事情。
Sass 还有扩展“占位符”类别的能力。 实质上是不可见的类别,格式为 %placeholder { }
。 这对于使用内部命名很有用,这些命名在那里有意义,但在实际类名中却没有意义。
获胜者:Sass
变量处理
Less 使用 @,Sass 使用 $。 美元符号在 CSS 中没有内在含义,而 @ 符号有。 它用于声明 @keyframes
或 @media
查询块。 您可能会认为这只是一个个人喜好问题,无关紧要,但我认为 Sass 占优势,因为它不会混淆现有的概念。
Sass 在变量作用域方面有一些奇怪之处。 如果您在“本地”覆盖“全局”变量,“全局”变量将采用本地值。 这感觉有点奇怪。
$color: black;
.scoped {
$color: white;
color: $color;
}
.unscoped {
// LESS = black (global)
// Sass = white (overwritten by local)
color: $color;
}
我听说它可能有用,但它不直观,特别是如果您编写 JavaScript。
获胜者:平局
使用媒体查询
我们大多数人开始使用 @media
查询的方式是在主样式表底部添加它们的块。 这可行,但会导致原始样式与响应式样式之间的脱节。 比如
.some-class {
/* Default styling */
}
/* Hundreds of lines of CSS */
@media (max-width: 800px) {
.some-class {
/* Responsive styles */
}
}
使用 Sass 或 Less,我们可以通过嵌套将这些样式整合在一起。
.some-class {
/* Default styling */
@media (max-width: 800px) {
/* Responsive styles */
}
}
您可以使用 Sass 获取更酷炫的功能。 有一个非常酷的“respond-to”技术(请查看 Chris Eppstein、Ben Schwarz 和 Jeff Croft 编写的代码)用于命名/使用断点。
=respond-to($name)
@if $name == small-screen
@media only screen and (min-width: 320px)
@content
@if $name == large-screen
@media only screen and (min-width: 800px)
@content
然后,您可以简洁、语义化地使用它们
.column
width: 25%
+respond-to(small-screen)
width: 100%
嵌套媒体查询是一种很棒的工作方式。有传言说 Sass 3.3 将拥有更多功能来使它更加有用,包括一种在媒体查询中使用 extend 的方法,这在 Less 和 Sass 中目前都是不可能的。
获胜者:Sass
数学
在大多数情况下,数学是相似的,但单位的处理方式有一些奇怪之处。例如,Less 会假设你使用的第一个单位是你想要的单位,忽略其他的单位。
div {
width: 100px + 2em; // == 102px (weird)
}
在 Sass 中,你会得到一个明确的错误:不兼容的单位:’em’ 和 ‘px’。我想,是否应该报错还是错误,这可能是有争议的,但我个人更倾向于报错。特别是当你处理的是变量而不是直接的单位时,更难追踪。
Sass 还允许你在“未知”单位上进行数学运算,这使得它在未来更具可扩展性,如果在他们能够更新之前出现了一些新的单位,Sass 可以处理。Less 则不行。还有一些更奇怪的差异,比如 Sass 如何处理同时具有单位的两个值的乘法,但这已经很深奥了,不值得一提。
获胜者:勉强 Sass
积极开发
05/16/12 | 01/12/13 | 06/25/13 | |
---|---|---|---|
LESS 上的开放问题数量 | 392 | 112 | 142 |
Sass 上的开放问题数量 | 84 | 83 | 110 |
LESS 上的待处理拉取请求 | 86 | 10 | 5 |
Sass 上的待处理拉取请求 | 3 | 7 | 11 |
LESS 上过去一个月内的提交数量 | 11 | 84 | 2 |
Sass 上过去一个月内的提交数量 | 35 | 14 | 14 |
这些数据都不能证明哪个项目更活跃,但查看这些统计数据还是很有趣的。据我所知,这两个项目的主导者都在他们的空闲时间里维护着这些语言,因为他们都有其他正在进行的大型新项目。
Less 最近一直很活跃,但现在 Sass 也变得更加活跃,因为有一位核心成员可以直接专注于它。
获胜者:平局
更多阅读
- Chris Eppstein: Sass/LESS 对比
- Jeremy Hixon: LESS 简介,以及与 Sass 的对比
- Ken Collins: 太 LESS 了?你是否应该使用 Sass?
- Johnathan Croom: Sass vs. LESS vs. Stylus:预处理器对决
对于像我这样还没有使用过其中任何一个的人来说,这是一个很棒的对比。如果我最终选择使用预处理器,就知道该使用哪一个了。
Chris,你的工作太棒了。我开始使用 LESS,而 SASS 感觉对我来说更强大。
你对 Stylus 有什么看法吗?
我只使用过一点点 Stylus。我故意把它从文章中删除了,因为为了简洁起见,以及我认为它目前还没有比它的“大哥”们做得更好。如果我错了,请纠正我。
说到 Stylus——它与它的“老大哥”们不同。实际上,它在很多方面都更胜一筹
1. 它拥有那些透明的 mixin,所以你可以直接使用它们,比如 `box-sizing: border-box`,并且会自动为你添加所有前缀。
2. 它拥有与 SASS 相同的逻辑/循环能力,但提供了一些快捷方式,因此你可以编写 `width: 100px if foo` 等等。
3. 在嵌套规则和父级引用方面,Stylus 比 SASS 灵活得多。在 Stylus 中,你可以做 `&__element`、`.foo:not(&)`、`ul&` 等等。在 SASS 中,这些事情是不可能的,因为它甚至不支持插值中的 `&`。
4. Stylus 拥有属性查找功能,这非常有用。
5. Stylus 还有很多其他功能,其中很多是 SASS 或 Less 所没有的。
说到缺点,Stylus 最不明确的问题是它的语法。虽然它可以非常灵活,但在某些情况下也会有局限性,因为它采用了基于缩进的语法。
然而,语言的灵活性能弥补它语法上的问题,所以我选择了 Stylus。
我还没有被 Stylus 说服。
我最近使用 Stylus 的经验是,它的编译器有点不可靠。有时它会静默失败,有时它会输出混乱的 CSS(例如,声明作为选择器)而不是报错。
我个人不喜欢透明 mixin,因为我更喜欢知道文件中的哪些部分是原生 CSS,哪些部分由预处理器额外功能处理。
没错,编译器现在有点反复无常,但嘿!Stylus 现在没有 Sass 和 Less 那么受欢迎,所以那里的开发者和错误报告者不多。我希望它的开发能使编译器变得更加稳定。
说到 mixin:虽然你可以使用透明的 mixin,但也可以将它们作为函数调用,所以这是一个可选项。
我喜欢你指出了 SASS 中 @extend 的优势,尽管我更喜欢 LESS 在这种情况下的简洁性。我还非常喜欢 SASS 开始处理媒体查询的方式,我希望 LESS 很快也能加入类似的功能。
另外,我一直没有使用 SASS 的原因之一是我不知道 Compass 是什么,以及为什么它与 SASS 相关联。
一旦你使用过 Compass,你就会难以置信它有多么强大,以及为什么你之前没有使用它!我强烈建议你尝试一下...
Compass 本质上是一组 CSS3 mixin 和辅助程序。如果你想了解更多,可以查看他们的网站。相信我,SASS 有 Compass 本身就是一个优势。
对于那些不想再文章中搜索链接的人:http://compass-style.org.
我必须承认,我一开始选择 SASS 是因为我想要 Compass(这是一个很好的理由!),而且从那以后我还没有真正使用过 LESS,因为我已经配置好了 SASS。看到一个好的、有理有据的对比,真是太好了。
我真的很喜欢 Stylus 中的 CSS 语法与 Sass 相比有多么简单。很多额外的东西,比如 `@mixin` 和 `@include` 都被省略了。
相比于
Stylus 还拥有一个类似于 Compass 的强大的 mixin 插件,名为 nib.
最终,这只是个人喜好,但我越来越喜欢 Stylus 了。
如果你不喜欢声明和调用 mixin 的 SCSS 语法,你也可以使用 SASS 语法。
你的 Stylus 还可以更简洁
或者更简单(没有分号!)
*不是没有冒号。
另外,SASS 中的调试比 LESS 中容易得多。
那是什么?只是好奇。你更喜欢错误信息还是类似的东西?
Anas 可能是指 FireSass 吗?https://addons.mozilla.org/en-US/firefox/addon/firesass-for-firebug/
Compass 会将文件和行号写入编译后的 CSS 文件中,这样你就可以看到样式最初编写的位置。它不需要运行其他浏览器插件,就可以实现 FireSass 的功能。
写得很好。我还在尝试决定走哪条路。
一方面,如果我想从你那里学习有关 CSS 预处理的任何知识,我应该学习 SASS。
另一方面,我真的很想在新项目中使用 320 及以上版本,但还没有找到合适的 SASS 移植版本。有谁知道吗?
顺便说一句,Codekit 非常棒。感谢你的提示。
祝你在下一个冒险中好运!
-雅各布
Jina Bolton 制作了新版 320 and Up 的 SASS 移植版本。 https://github.com/jina/Sass320andup
Jina 已将 SASS/Compass 支持添加到 320 and Up,有兴趣的人可以试试。 https://github.com/jina/Sass320andup
正在等待 Malarkey 合并拉取请求。
-J
我认为两者都有另一个重要的优势。
雪碧 - SASS(通过 compass)
简洁性 - LESS(无需定义 include、extend 等)
我同意。在这一点上,LESS 的语法更直观。
但没有理由不学习两者。我个人使用 SASS/compass。但有很多项目只使用 LESS,比如 Twitter Bootstrap。
所以,我个人认为最好的选择是学习两者。还有很多其他的预处理器,如 Stylus。我一直主张至少尝试我所有的工具。这不仅有助于我进一步了解不同的语法,而且当我已经了解了语法时,让我更容易在其他项目上工作,因为我主动学习了它。这适用于我所有的开发工具,而不仅仅是 CSS 预处理器。
我一直在使用 SASS(+Compass)一段时间(2 个月) - 非常棒!
看起来 LESS 在人气竞赛中获胜了......这并不一定是好是坏。出于私心,我确实希望 Compass/SASS 能与 LESS 平起平坐,而不是被视为第二名。如果你以前没有使用过 SASS,LESS 也是一个不错的选择。但是,在尝试使用 LESS 的过程中,我更加欣赏 Compass。我不会在没有先配置 Compass 的情况下开始任何项目。
我认为清晰的教程展示如何使用产品(尤其是在终端方面)将有助于克服第一个障碍。
我最珍视和最有帮助的视频教程之一是在很久以前录制的,它让我对长期使用 Compass 而不是其他预处理器产生了兴趣。 http://wp.me/P28635-1JE
我见过的其他很棒的视频是 Chris Eppstein 和 David Kaneda 为 Sencha Touch 制作的演示。(题外话 - 我希望 jQTouch 能得到更多关注。GUI 是使用 Compass/SASS 皮肤的,看起来超级性感。IMO)
要安装 Compass,只需将从这里复制粘贴的两行代码 http://compass-style.org/install/ 粘贴到任何人都可以处理的神秘终端中 - 特别是前端开发人员。如果你使用的是 Coda,终端就在那里!
对于那些仍然害怕终端的人来说,市场上有 Compass 和 Sass 的 GUI 可用。其中之一是...... http://compass.handlino.com/
试试吧!
我目前没有做 web 开发(我之前做过),但我有点好奇为什么不把预处理的 CSS 做成“CSS 加一个简短的 shell 脚本以扩展浏览器支持”。
也就是说,我在所有这些例子中看到的最大节省空间的地方是线性渐变被扩展为 [-o-linear-gradient, -webkit-linear-gradient, -moz-linear-gradient, etc]。但是简单的“linear-gradient”是完全有效的 CSS3,而且编写一个脚本将它扩展到适用于每个单个遗留浏览器的变体非常容易。
使用现代浏览器,你可以编写和测试,甚至不需要运行预处理器。而且从你的脚本中删除这些向后兼容的钩子也很容易,因为这些浏览器不再使用。
当然,它并不能解决所有这些问题,但我认为这是一个很好的方法,可以以 10% 的解决方案复杂性获得 95% 的效果。也许只是我,但我宁愿花时间学习一项将长期存在的技术(CSS),而不是学习那些现在有用(LESS、SASS)的工具,因为它们大多是临时的解决方案。
我认为你可以看看使用 LESS 或 SASS 比使用原生 CSS 更值得的原因。对我来说,最大的好处就是编写速度更快。我使用 LESS 已经几年了(可能会在这篇文章之后切换到 SASS),一旦你意识到节省了多少时间,我认为你会明白它为什么好。
SASS 和 LESS 已经存在几年了,它们并不是真正的变通方法,而是提高生产力的工具。最终结果是一样的,编译后的 CSS(或手写的),所以为什么不走捷径呢?
在我开始使用 LESS 之后(实际上我之前在 PHP 中使用过 CSScaffold),我意识到它有多强大,而且我实际上认为用这种方式编写比直接编写 CSS 更合理。mixin(或 include)、嵌套和变量是非常强大但简单的概念,我认为 CSS 应该在原生中处理(这可能在将来成为现实)。你只需要这些就能减少大量代码冗余。
John,试试 Prefix-free:http://leaverou.github.com/prefixfree/
供应商前缀问题是我见过的唯一使用预处理器的令人信服的理由,而 Prefix-free 解决了这个问题。
我最近用过的例子是使用纯 CSS 定义一组彩色球体。你可以通过结合圆角和非中心径向渐变来做到这一点。
要定义不同的颜色,你可以使用预处理器使用一组基本颜色为你编写渐变,这些基本颜色会按预设的量变暗。
我从未使用过 LESS 来判断它,但我喜欢 SASS。
Chris,很棒的文章,一如既往!
我刚开始涉足 CSS 预处理的世界,所以对我来说这非常有见地;读完这篇文章后,你已经说服我去使用 SASS 了。
SASS vs. LESS?Stylus。
这已经成为每个人心中的问题,感谢 Chris 的文章。看看在这个月底在 Yelp 进行的预处理器演讲中会讨论什么将会很有趣。
我个人只是因为第一次接触预处理器是在使用 Twitter 的 Bootstrap 时才最终使用了 LESS。
关于处理 CSS3 前缀的主题,为什么不直接使用 -prefix-free.js 并停止担心它呢?
对于快速演示 -prefix-free.js(或 LESS js 文件)就可以了。但你绝不应该依赖 javascript 在生产环境中输出你的前缀。它不仅在 JS 关闭的情况下不起作用,而且还会在前端添加不必要的处理。
使用 CodeKit、LiveReload 或简单的“compass watch”......
感谢你的建议,帕特。
我研究过并使用过两者,更喜欢 LESS 的简洁性和易用性:它本质上是更酷的 CSS。
但现在我已经听说 COMPASS 真的很好,我想更多地尝试 SASS。但我并不了解它到底是什么。
你能发一篇关于 COMPASS 是什么以及如何最好地使用它的文章吗?
我最近开始重新设计我的网站,虽然我对 web 设计不太擅长,但我越来越喜欢 Stylus。
在我看来,没有分号和括号是一个优点。
从上面的评论来看,Stylus 有一些非常令人信服的东西。但是,如果你唯一喜欢的就是没有分号和括号,你始终可以使用 .sass 语法
我个人没有使用过 Stylus,所以这不是我试图劝阻你使用它,事实上我认为我会在之后尝试一下。
但是,如果简洁性是你最关心的问题之一,那么原始的 Sass 语法也省去了分号和括号。它还有其他简洁的优点,比如使用“+”代替“@include”。我当然更喜欢原始的语法,但我感觉自己像是最后几个这样的人。
我个人使用一种作为 CSS 语法本身的 *扩展* 的语法,对我来说感觉更舒服。这意味着并非所有 LESS 或 SASS 都是有效的 CSS,但所有 CSS 都是有效的 SASS/LESS。看起来优化工作流有比不键入括号和分号更好的方法。
关于“帮助 CSS3”部分,可能值得一提的是由非常活跃的 Bootstrap 项目提供的 mixin。
以防万一有人不知道,Bootstrap 完全使用 LESS 构建。
所以你可以说 LESS 可能更容易让人上手(你在文档部分提到了这一点),尤其是它与 Bootstrap 的联系——这再次帮助了刚接触网页设计的人。
对我们来说 LESS 是明显的赢家。它轻量级且易于定制。我们在每个项目中都使用相同的 LESS 混合器,所以它真的加快了开发速度。没有 LESS 的 CSS 感觉就像黑暗时代。
你真的应该试试 Sass——你会发现它有很多好处,它真的改善了你的工作方式,而且语法比 LESS 更“合理”——LESS 似乎在所有不同的参数方面都落后了,尽管这条评论已经 2 年了,但我认为它值得改用 Sass!或者我更喜欢 scss——因为如果你在写代码时不严格,Sass 会产生很多语法错误。
评论很有趣,大多数人因为 Compass 而选择 SaSS。
在我们的 CMS 中我们选择了 LESS
– 因为 Twitter Bootstrap
– 因为 JavaScript 可以用于任何地方(如 jsFiddle、iPad、Dropbox 等,用于调试/编码目的),ruby 在大公司中并不为人所知。
现在有几个 Twitter Bootstrap 的 Sass 移植版本。
Chris,我必须说我完全同意你的结论。我已经使用这两个一段时间了,SASS 感觉更稳固、更成熟。
嗨,各位
有人可以给我一个关于为什么 CSS 预处理是一个好方法的详细文章链接吗?它不会减慢页面速度吗?
你可以将你的 Sass、Scss 或 Less 编译成样式表,并像平常一样使用它。你不需要在页面加载时编译。
如果你使用 Sass,你可以使用 Watch 自动将你的 Sass 编译并压缩成一个标准的 css 文件,你像平常一样包含它 :)
通常情况下,这是你在部署之前要做的事情,所以它不会在每个实时页面加载时都被处理。
如果你使用 LESS.js(js 版本),它会在页面加载时编译 LESS,这可能会导致速度变慢。但是,SASS 文件在开发过程中被转换为 CSS。LESS 也可以配置为这样做。
很棒的文章,但我惊讶的是你没有提到任何编译应用程序,因为两者都有一些不错的编译应用程序。
还有不同的 Sass 语法。据我所知,有两种,Scss 和 Sass。虽然我认为你不能真正比较它们,但我确实认为从初学者的角度来看,Sass 中这两种语法的混淆可能会让人困惑。我实际上更喜欢 Sass 而不是 Scss,因为你没有花括号!万岁。
好文章。我同意你所有观点,虽然我还没有尝试过那些新的 SASS 媒体功能——这是我第一次听说它们!
我一直不太喜欢 LESS 的一点是,虽然开发者很容易简单地使用 JS 版本并立即开始使用,但我担心网络上会充斥着依赖脚本解释其样式的页面,因为学习开发者很容易就此止步。
无论出于什么原因,人们都无法区分开发和生产,使用 SASS,如果你忘记为生产重新编译它,你得到的只是一个充满了你的注释和空格的臃肿文件,但使用 LESS,你得到的东西可能无法在所有人的浏览器上正常工作。
Bryan 在这里。CodeKit 背后的那个人。
Chris,你的文章确实说服了我将来要仔细看看 Sass!我认为你漏掉的一点是速度。
Sass(和 Compass)是用 Ruby 编写的,Ruby 是一种非常慢的语言。如果你的样式表大小合理,这并不重要。但是,如果你正在处理非常大的项目,编译 Sass 的时间可能比编译 Less 或 Stylus 要长得多。因此,如果你是一个经常修改代码然后点击“保存”查看浏览器效果的人,你可能会发现自己经常要等待 Sass/Compass 赶上来。
不过,还是有希望的!Sass 正在被移植到 C 中。C 实现的速度提高了 100 倍(注意:是 100 倍,而不是 100%)。
缓存很大程度上抵消了编译速度对于我使用预处理器的任何东西的影响。
我不熟悉 SASS 缓存,但如果它能正确地做到这一点,那么它应该始终在生产环境中提供缓存文件。
上个月在 RailsConf 上,Hampton Catlin(Haml/Sass 背后的家伙)宣布了“libsass”,一个用 C++ 编写的 Sass 版本(https://github.com/hcatlin/libsass),所以可能值得一试。它应该快很多。
我是一个愚蠢的人,显然没有读到评论的结尾。我道歉:/
你还有关于这个 C 移植的更多信息吗?
如果你和我一样,LESS 可能是更好的选择。我使用一种简单的 CSS 样式,并添加了变量、基本数学运算和混合器(仅用于前缀),就好像我模拟的模块规范是最终版本一样。我避免使用嵌套规则或语法上不熟悉的代码。在这种情况下,两者都没有优势(据我所知,Stylus 在处理这种样式方面并不出色,至少在写作时是这样),除了处理它的工具之外。在考虑可用的工具时,我认为 LESS 具有优势,因为它有几个跨平台的应用程序,重要的是这意味着在 Windows 上有不错的可用性。
有什么好的 Windows SASS 预处理器,像 CodeKit 那样吗?
Compass.app 有 Windows 版本。我使用 Mac 版本而不是 CodeKit。
http://compass.handlino.com/
LiveReload 2 虽然仍在开发中(“预发布”),但对于 Windows 来说,它看起来很有希望:http://livereload.com/
还有 Scout:http://mhs.github.com/scout-app/
SASS 因为 Compass 很好,LESS 因为 Twitter Bootstrap 很好。
Sass 还因为 Susy 和 Zurb Foundation 很好
http://susy.oddbird.net/
https://github.com/zurb/foundation/tree/3.0-scss
我不能说 SASS 与 LESS 之间存在非常大的差距。SASS 因为 Compass 扩展了它而变得很棒。所以,基本上,只有在易用性方面,LESS 才能胜过 SASS。除此之外,SASS 更好。
我使用 LESS 一段时间了,但想把它与 SASS 进行比较(看看 Compass 的炒作)。唯一阻碍我的是 Ruby。当然,正如你所说,我需要了解它,但我仍然需要安装它!而且在 Windows 上,这既不容易也不受欢迎。为什么我需要安装一个完整的语言及其所有功能,仅仅为了使用一个小的预编译器?给我一个独立的程序吧!这个程序不存在的事实让我质疑 SASS 在日渐衰落的 Ruby 社区之外的受欢迎程度。
安装 Ruby 比你想象的要容易得多。在 Windows 上,你只需要从 https://rubyinstaller.ruby-lang.org.cn/ 下载并安装 Ruby 安装程序。安装 Ruby、Sass 和 Compass 的整个过程大约需要 10 分钟,而且不需要了解 Ruby 语言。顺便说一下,Ruby 并没有那么可怕;)
值得注意的是,LESS 不需要 Ruby,这对某些人来说似乎是一个重要的因素。我个人更喜欢能够在 5 分钟内使用 lessphp 设置一个 LESS 项目,而无需费心处理 gems 等(公平地说,我还没有真正学会。但时间就是金钱,所有这些)。
你试过 Stylus 吗?它几乎和 Sass 一样强大,而且建立在 nodeJS 之上。
写得很好!作为一名 Sass 粉丝,我很高兴我们最终胜出,虽然这不是什么意外。
不过,LESS 确实值得称赞,媒体冒泡实际上是在 Sass 引入之后不久才被引入的。
LESS 的功能确实比 Sass 弱,但 Stylus 是一个值得竞争的对手。它几乎拥有 Sass 的所有功能,据我所知,它最初是 Sass 的一个 JS 分支,但包含了一些非常独特的语法功能,允许你随意省略标点符号。
在我看来,带有自定义函数的 Sass 在数学方面胜出。创建自定义函数的能力可以极大地提高数学能力。在构建网格逻辑或制作自定义计算器时,自定义函数非常棒。
在变量方面,Sass 中的列表函数允许列表充当变量数组。还可以使用空格或逗号创建和使用多维列表。这有点在突破极限,但这种功能在某些函数中可以非常有用。我使用带有列表的变量作为内存来存储计算结果,以便在复杂函数中使用。
Sass 的深层部分非常深。大量强大的功能和语言能力可以利用。
此比较中缺少的一个主要考虑因素是,这两种工具与持续集成和自动化构建流程的集成难易程度。在 Sass 移植到 C 之前,LESS 是明显的赢家,因为 LESS 原生支持纯 JavaScript、Node.js 和 Java(通过 Rhino),并且已经移植到 PHP 和其他一些语言。Sass 目前对 Ruby 的依赖是许多开发者的一个严重的致命弱点。
我同意对 ruby 的依赖令人却步。我使用 Handlino 的 fire.app (http://handlino.com/) 通过 GUI 处理 ruby 相关内容,但能够在我的预发布服务器上使用 SASS 会很不错(它不支持通过 ruby 的 SASS,因为它是旧的 PowerPC mac)。曾经有一个旧的 PHP 移植版本正在开发中,但据我所知,它还没有更新。
我还没有深入研究 CI 或此类系统。但是,LESS/SASS 生成的 CSS 文件不应该是开发过程中已经编译好的,远在进入任何自动化测试/构建/部署流程之前就完成了么?
你们是否要等待很长的构建过程才能更改字体颜色?在我看来,这似乎很麻烦。:|
现在我在想为什么我使用(并且喜欢)LESS 而不是 SASS。
以下是我想到的:
设置
设置 LESS 大约需要 15 秒。只需将你的 .css 文件重命名为 .less 文件即可。对于旧网站来说非常棒。
它可以在 PHP 或任何你想要的平台上轻松工作。
假设你开始使用它后就停不下来了。
此外,像Codekit 这样的程序可以极大地优化你的生活。真的很多。
语法
使用 LESS 无需学习任何东西。要创建函数,只需声明一个类即可。这很酷。
已经有很多混合器可供使用(一个可以满足所有需求:LESS 元素)。
文档
我已经说过你无需任何知识就可以开始使用 LESS 了吗?如果你需要,LESS 文档已经是你所能找到的最好的文档了。
很棒的文章,感谢分享。
有没有办法在 PHP 预处理器中使用 SASS 语法?
我一直以为在 Windows 环境下安装 SASS 很困难……我不确定我从哪里得到的这个想法。我花了不到 5 分钟的时间下载了 Ruby,安装了它并让 SASS 运行。
它看起来确实很棒,也许是时候开始使用它了。
感谢你写了这篇文章!
为什么没有提到 Bootstrap?Compass 比它好很多吗?
一个是苹果,一个是橘子,我怕你会误会。
Bootstrap 是一个框架,Compass 是一个元框架。这基本上意味着 Compass 是一个用于构建框架的框架。例如,有许多 Twitter Bootstrap 的 Compass 分支。
Bootstrap 实际上只是另一个样式框架,比如 Zurb Foundation 和 Blueprint。就像 Chris 所说的,这些框架就像苹果和橘子一样。
很棒的帖子!我也想看你的 Compass 屏幕录制。
嗨,Chris
你肯定错过了一个重要的地方。那就是进入这两者的方式。对于 SASS,你需要 ruby 和各种安装,但是对于 LESS,它是一个 javascript 文件包含,每个人都习惯于使用插件。我还没有使用过其中任何一个,但我打算从 LESS 开始(尤其是我每天都在 osx 和 win 上开发)。我相信这对许多其他人来说也是一个重要的考虑因素。
为了记录,我从未安装过 Ruby 或者使用命令行来处理预处理。是的,SASS 依赖于 Ruby,但这对我来说是完全透明的,因为我使用一个应用程序来处理它。
还有一个快速说明,*请*不要通过在页面上使用 `
DigitalOcean
CSS-Tricks
社交