CSS预处理器的出现大大的提高了前端开发的效率和逼格,它让CSS可编程化。LESSSass/SCSS是两种最为常见的预处理器,拥有大量的用户基数,数目庞杂的第三方库。然而,还有一种预处理器并未引起足够的重视,Stylus

现在,我们来说说为什么Stylus很棒,为什么使用它,为什么它将会变成你的首选预处理器。


LESS、Sass很棒

具体介绍Stylus如何工作之前,我们先说说LESS、Sass给CSS带来了什么好处,然而却为什么不选择它们。

预处理器的基石

每种预处理器都包含了变量、混写(mixins)、嵌套和扩展,以及不同的度量单位、逻辑运算符和函数。通过这些你可以抽象出许多关键不疯,并重复使用,良好的逻辑和更少的代码能让你从书写CSS中获得前所未有的体验。

然而,最终促使我选择使用哪个预处理器原因就是它们之间细微的不同。

LESS:很棒

除了一些基本功能外,LESS外围的社区环境以及社区成员提供的大量资源是它的最大优势。想必没有一个前端工程没听说过Twitter Bootstrap的框架,这或许也是导致大部分人用LESS的原因之一。

另外一个使LESS脱颖而出的原因就是LESS的第三方库,LESShat,它提供了一系列针对CSS3效果的混写规则,并且还拥有针对Photoshop的配套插件CSShat,能够方便的识别PSD文件并生成LESS代码。假如你的Photoshop文件很复杂,那么这两个工具将会给你的工作流程提供强有力的支持。

还有一个重要因素或许是许多人发现它非常容易上手且易于使用。你可以仅用一个简单的Javascript文件编译它,也可以用IDE内置的编译器,还可以用nodejs在任何机器上编译它。

LESS:为什么不用

首先,我更倾向于写自己的代码而不是用第三方框架,并且我现在正在设计更简单的Photoshop,同时尽可能在浏览器中动态的设计,这有利于实时查看效果。所以,对我来说,上述提到的优势还不足以促使我去选择使用它。

但是最重要的原因其实是,LESS在逻辑处理上与另外两个预处理器相比真是大相径庭。

LESS只提供了少量的逻辑处理特性,以至于我们不得不为实现某些逻辑而增加代码的书写,这进一步导致了开发变缓以及后期维护成本的增加。

虽然LESS提供了一些逻辑处理,但是相比Stylus和Sass/Scss而言实在是太有限了。接下来我就会告诉你有限在哪里。

Sass:非常棒

Sass同样拥有活跃的社区,优质的资源。LESS有Twitter Bootstrap,Sass有Gumby和Foundation。LESS有LESShat,Sass有Compass和Bourbon。

但是相比LESS的逻辑处理能力而言,Sass简直就是神。在逻辑处理上,LESS勉强只能称得上为CSS增强写法,而Sass完全像一个复杂的编程语言。

举个例子,Sass能让你写出有效的条件检查,这很有用,尤其是在混写中。

@mixin border_and_bg( $border_on, $border_color, $bg_on, $bg_color ){
@if $border_on == true {
border: 1px solid $border_color;
} @else {
border: 0;
}
@if $bg_on == true {
background-color: $bg_color;
} @else {
background-color: transparent;
}
}

这段代码检测$border_on是否为true,为true则输出的border颜色属性值为$border_color的值。如果为false则设置border属性为0

同时它还检测了$bg_on是否为true,为true则输出background-color值为$bg_color的值。为false的话设置background-colortransparent

这样,根据输入的值,我们就可以输出四种不同的样式。

然而,在LESS里面没有if/else判断,所以上面的代码就无法实现。你最多能用用所谓“Guarded Mixins”的方法,基于单条表达式的判断,就像这样:

.border_and_bg ( @border_on, @border_color, @bg_on, @bg_color ) when (@border_on = true) {
border: 1px solid @border_color;
}

由于没有if/else函数,也就对随后检查@bg_on的值无能为力,也就不能在同一个混写当中根据可变的值设置border属性。

如果要实现Sass中同样的功能,你需要用LESS创建四条不同的混写,就像这样:

.border_and_bg ( @border_on, @border_color, @bg_on, @bg_color ) when (@border_on = true) and (@bg_on = true) {
border: 1px solid $border_color;
background-color: @bg_color;
}
.border_and_bg ( @border_on, @border_color, @bg_on, @bg_color ) when (@border_on = false) and (@bg_on = false) {
border: 0;
background-color: transparent;
}
.border_and_bg ( @border_on, @border_color, @bg_on, @bg_color ) when (@border_on = false) and (@bg_on = true) {
border: 0;
background-color: @bg_color;
}
.border_and_bg ( @border_on, @border_color, @bg_on, @bg_color ) when (@border_on = true) and (@bg_on = false) {
border: 1px solid @border_color;
background-color: transparent;
}

这仅仅只是检查两个值,当你的代码越来越复杂,需检查的值越来越多,这种写法将会变得非常丑陋。处理好每条规则的顺序并一眼分辨它们也变得难上加难。

对比Sass,有木有发现Sass的逻辑处理能让你coding更加轻松,生活更加美好。Sass同样提供了超赞的流程控制,像:@for@each@while

最后,在LESS中令人称赞的函数,同样能方便的Sass化。像这样:

@function function-name($parameter) {
@return $dosomething + $parameter / $somethingelse;
}

这些逻辑函数让你有可能创建自己的布局引擎,用em而不是px,颜色定义,以及把大量的定义用法从一个项目转移到另一个项目,等等。

从我看到的听到的,以及我个人的使用经验来判断,人们使用Sass而不是LESS的很大原因就在于,它拥有强大逻辑处理能力。

Sass:还是不用

显然,LESS由于逻辑处理能力弱出局了,剩下Sass和Stylus,这两个都有一系列强有力的特性支撑。

然而,我选择Stylus,因为它既有Sass的强大,也具有LESS的易用性。

Stylues能做到所有Sass能做的,或许还更简单,却仅需要Javascript或者Node.js就能编译。它有的使用方法非常顺滑且简单,并且它优美简洁的语法也是我所钟爱的。

对我来说,最大的痛点就是用Sass的话必须运行Ruby on Rails并且和gems打交道。我的任何项目中都不会用到Ruby,我要为了使用Sass冒着装Ruby而导致的连接错误或者安装错误并去解决它显然有点得不偿失。

我非常好奇那么非Rubyer,为了使用Sass而装Ruby,真是有Geek精神。

假如我为了使用Sass而装了Ruby,但我的工作依然需要Node.js,依然需要NPM安装Glup,去监视文件的变化,压缩静态文件等等,依然需要安装Bower来管理其它的包。

所以,如果一个编译器像Stylus拥有强大的逻辑处理能力,并且与我平时所用的工具高度配合,这就是我选择它的原因。

很多人发现使用Sass需要历经复杂的Ruby安装,从而导致了它们使用LESS。现在,Stylus在给你强大逻辑处理的同时,也给了你像LESS一样简单易用的安装和编译方式。

抛开Ruby复杂的安装方式,仅就Sass强大的逻辑处理能力而言我可能也不会选择它。Stylus特别的工作方式以及易读的语法,相比LESS和Sass而言更加简洁、灵活和顺畅。

现在,我来告诉你为什么我选择Stylus,并且你也会乐意去选择。

用Stylus,现在

正如上所说,我选择Stylus因为:

  • 强大的逻辑处理能力
  • 仅仅用Node.js / JavaScript (no Ruby)就能编译
  • 用Glup和Bower用到Nodejs,同样Stylus也需要,不会增加而外的负担
  • 精简、灵活的语法
  • 方便易用的特性

那么我来介绍一点stylus的用法,来作证为什么选择它。

很大一部分原因是因为我能用到平时项目中已经存在的工具处理Stylus,这些工具包括Stylus也能很好的与我所用的IDE协同。

Stylus语法

Stylus灵活的语法简直让我爱不释手。

在LESS里面你必须按照传统的方式书写,{}一个都不能少

Sass/SCSS给了你更多的选择:

  • SCSS编译时提供给你更多的选择,那么你就可以用常规的CSS写法或者上面的写法
  • Sass里面可以完全抛弃{},但是在这个文件里你也不能用常规的写法了

Stylus相对而言就灵活很多,不必去设置任何编译选项就能够兼容这两种写法

  • 只要你觉得舒服完全可以用{}
  • 当你不用的时候,只要使用适当的缩进就能达到效果
  • 你也可以在同一个文件中混合使用这两种方式

以下写法都是合法的:

.my-style{
color: #000;
background-color: #fff;
border: 1px solid #ccc;
} .my-style
color #000;
background-color #fff;
border 1px solid #ccc; .my-style
color: #000
background-color: #fff
border: 1px solid #ccc .my-style
color #000
background-color #fff
border 1px solid #ccc

只有Stylus能完全省略这些标点符号,尽情发挥你的想象力,想怎么写就怎么写吧。

当你省略掉这些标点符号后,你会惊奇的发现你的代码会变得如此美妙。coding过程中,思维也变得无比的顺畅,高亮提示也进一步提高代码的可读性。

同时,编译器也是很人性滴。你可能出于某种理由要用常规的CSS写法,来让你的代码更有组织性,尽管用吧。假如你不慎漏写了一个分号,OK,没问题,没人会知道的。

Stylus变量,混写,流程控制和函数

你已经看到在LESS和Sass中,变量、混写、流程控制和函数是怎么样的。在我看来,Stylus中的方式更加可看、可读、可用。

在LESS里面,变量必须加上@前缀。在Sass里面,必须加上$前缀。在Stylus里面,不用加任何前缀。当然如果你喜欢你可以随便用$,但是@是内置的保留字,所以不能用它。

同样,混写、流程控制和函数不用加任何前缀。

在LESS里,一个混写必须按照像常规CSS的写法去写,并且LESS还没有流程控制和自定义函数。

在Sass里,混写必须以@mixin开头,并且使用的时候要用@include,条件控制用@if@else,函数要以@function开头,并在函数内部有一行@return

这些条条框框在stylus里面通通没有,你可以很自然的写这些,就像写常规代码一样。早期我用Sass的时候这样写。

@mixin border_and_bg( $border_on, $border_color, $bg_on, $bg_color ){
@if $border_on == true {
border: 1px solid $border_color;
} @else {
border: 0;
}
@if $bg_on == true {
background-color: 1px solid $bg_color;
} @else {
background-color: transparent;
}
}
@function function-name($parameter) {
@return $dosomething + $parameter / $somethingelse;
}

使用的时候这样:

.callem {
@include border_and_bg(true, #000, true, #fff);
font-size: function-name( 6 );
}

现在,在Stylus中这样写:

border_and_bg(border_on, border_color, bg_on, bg_color)
if border_on == true
border 1px solid border_color
else
border 0
if bg_on == true
background-color bg_color
else
background-color transparent function-name(parameter)
dosomething + parameter /somethingelse .callem
border_and_bg true #000 false #fff
font-size function-name(6)

有木有感觉看起来和读起来都非常随意,并且编译后生成的代码也保持着简单易读。

当调用border_and_bg的时候,就像通常写CSS的方法,不用大括号、分号、冒号。当然你也可以使用这些标点符号,这取决于你。

一些妙招

Stylus拥有成吨的超赞特性,需要你自己去发现。

http://learnboost.github.io/stylus/

在此,有两个特性我必须要说说。

参数省略法

参数省略法允许你传入未定义个数的参数。你可以先传入一些确定的值参数,然后通过使用args...args.获取剩余的值。例如:


padded_box(box_sizing,args...)
box-sizing box_sizing
padding args .abox
padded_box border-box 5px 10px .anotherbox
padded_box content-box 20px //编译后 .abox {
box-sizing: border-box;
padding: 5px 10px;
}
.anotherbox {
box-sizing: content-box;
padding: 20px;
}

属性引用

有时候你可能会在一段CSS代码内重复使用某个值,如果专门为此设置一个变量,未免有点浪费资源。

我们有个大宝剑,通过它你可以方便的获取已经声明属性的值。例如:

.onemorepaddedbox
padding-left 20px
padding-right 30px
width 1200px - @padding-left - @padding-right //编译后 .onemorepaddedbox {
padding-left: 20px;
padding-right: 30px;
width: 1150px;
}

你所需要做的只是用一个@标记符就行,Stylus会自动在本样式中寻找声明,找不到的话就去向上查找父元素,找不到继续向上,当查到根节点依然没有的话就返回“null”

总结

总而言之使用Stylus,不会让你后悔。

为什么使用Stylus的更多相关文章

  1. PostCSS深入学习: PostCSS和Sass、Stylus或LESS一起使用

    如果你喜欢使用PostCSS,但又不想抛弃你最喜欢的预处理器.不用担心,你不需要作出二选一的选择,你可以把PostCSS和预处理器(Sass.Stylus或LESS)结合起来使用. 有几个PostCS ...

  2. CSS预处器的对比——Sass、Less和Stylus

    预处器的对比--Sass.LESS和Stylus 转载: 英文原文:http://net.tutsplus.com/tutorials/html-css-techniques/sass-vs-less ...

  3. 【前端开发】优化代码之减少引入,css预编译语言的优点,stylus的使用

    前言:我必须得承认在最最最开始的时候,我对于css的预编译是非常不以为然的,这是错误的.一般在页面编写过程中,我会将需要reset的css放在reset.css中,讲会需要重复用到的放置到public ...

  4. sass/less/stylus css编译

    早上来了听一同事说stylus如何才能编译成css文件,瞬时间有点蒙,一听感觉和less是差不多的功能,随着就上网去查,然后发现这个文章,介绍了这三种sass/less/stylus的安装和语法,贴在 ...

  5. CSS预处理器Sass、LESS 和 Stylus

    CSS 预处理器技术已经非常的成熟,而且也涌现出了越来越多的 CSS 的预处理器框架.本文向你介绍使用最为普遍的三款 CSS 预处理器框架,分别是 Sass.Less CSS.Stylus. 首先我们 ...

  6. sass、less和stylus的安装使用和入门实践

    刚 开始的时候,说实话,我很反感使用css预处理器这种新玩意的,因为其中涉及到了编程的东西,私以为很复杂,而且考虑到项目不是一天能够完成的,也很少是 一个人完成的,对于这种团队的项目开发,前端实践用c ...

  7. CSS预编译器配置-------LESS Sass Stylus webstorm

    预编译器配置说明 开头语,发挥CSS预处器的作用是一种很有挑战性的事情.CSS预处器有不同的语言,就有不同的语法和功能. 语法 在使用CSS预处器之前最重要的是对语法的理解,幸运的是,这三种CSS预处 ...

  8. CSS 预处理器(框架)初探:Sass、LESS 和 Stylus

    现在最为普遍的三款 CSS 预处理器框架,分别是 Sass.Less CSS.Stylus. 拿less来说,可以在页面上直接使用less文件,但要引用less.js进行解析:同时也可以直接将less ...

  9. 为您详细比较三个 CSS 预处理器(框架):Sass、LESS 和 Stylus

    CSS 预处理器技术已经非常的成熟,而且也涌现出了越来越多的 CSS 的预处理器框架.本文向你介绍使用最为普遍的三款 CSS 预处理器框架,分别是 Sass.Less CSS.Stylus. 首先我们 ...

  10. less,sass,stylus配置和应用教程及三者比较

    less,sass,stylus配置和应用教程及三者比较  Less 1. 定义: Less是CSS预处理语言,在css基础之上增加了诸如变量,混合(mix),继承,运算,函数等功能,LESS既可以运 ...

随机推荐

  1. Intel HEX文件解析

    近期有一个需求就是为Arduino开发板做一个基于蓝牙的无线烧录程序.眼下的Arduino程序都是通过USB线连接到电脑的主机上,实际的传输过程是基于USB协议的,这个过程还是比較麻烦的.由于每次的编 ...

  2. Cocos2d-x 精灵碰撞检測(方法一)

    声明函数碰撞检測函数,两个精灵和重写update bool isCollision( CCPoint p1,CCPoint p2,int w1,int h1,int w2,int h2 ); CCSp ...

  3. POJ 3414:Pots

    Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11661   Accepted: 4940   Special J ...

  4. 【iOS开发系列】cell切割线置顶

    废话不多说,直接上代码: /** * tableViewCell切割线左側置顶 < 1 > */ -(void)viewDidLayoutSubviews { if ([_tableVie ...

  5. Page Design for Sexable Forum

    Design Demo 1. Home of Sexable Forum 1.1  home page not logined. 1,2 home page logined. 2. Pages wit ...

  6. ditaa - 把ascii图形转成图片

    ditaa ditaa是一个把ascii图形转成图片的工具. 在查看zguide时看到这个文档是用gitdown生成的.zguide文档格式排版非常不错,以后要抽时间好好学习一下. 每章写一个txt文 ...

  7. Java Management Extensions (JMX) Flume

    Lesson: Overview of the JMX Technology (The Java™ Tutorials > Java Management Extensions (JMX)) h ...

  8. UVAlive 6611 Alice's Print Service 二分

    Alice is providing print service, while the pricing doesn't seem to be reasonable, so people using h ...

  9. sublime text2 相关插件及其应用

    一.常见的插件 1.Emmet 'ctrl+up':切换文件: "ctrl+alt+enter":创建新的div标签: "shift+ctrl+." :查找相同 ...

  10. Linux内核中工作队列的使用work_struct,delayed_work【转】

    本文转载自:http://blog.csdn.net/zahuopuboss/article/details/43268983 初始化工作队列 调度工作队列 取消工作队列 #include <l ...