为什么选择less
CSS代码开发与维护都比较困难,特别是CSS中的各种尺寸颜色,看多了绝对想吐。所以就有了便于开发以及维护管理的CSS预处理语言,可以由它们编译生成CSS。
作为一个搞后端的Javer,我所了解的CSS预处理语言大致有三种LESS, SASS, Stylus。这几种预处理语言都提供了变量(variables),混合书写(mixins),函数(functions),运算(operations)等功能,这些功能大大降低了CSS的编写难度。在这几种语言中SASS基于Ruby,LESS、Stylus基于Node.js。Ruby接触的不多,为了节约学习成本果断舍弃SASS。Stylus属于后起之秀,目前在github上活跃度不如LESS和SASS。另外,LESS语法完全兼容CSS,学习周期更短(SASS 3后也改版成了兼容CSS的SCSS语法),并且Bootstrap框架也使用LESS语言。权衡利弊,最终我还是选择了LESS。
Less官网列出了使用了less的框架:http://lesscss.org/usage/#frameworks-using-less
安装LESS
less是基于node开发的,所以安装前确保已经有Node.js的开发环境。
使用node.js的包管理器全局安装:
1 | npm install -g less |
全局安装会装在Node全局目录,如果全局目录已设环境变量,则可以在任何目录下使用
安装完成后即可使用Less编译器将less源文件编译成css:
1 | lessc styles.less styles.css |
lessc命令内部提供了-x
选项用于生成压缩的CSS。在V3版本后lessc提供了将压缩功能抽离成了一个clean-css
插件,安装clean-css
命令如下:
1 | npm install -g less-plugin-clean-css |
插件安装后使用以下命令,lessc会自动调用插件:
1 | lessc --clean-css styles.less styles.min.css |
除了命令行的编译方式,less官方还提供了
- 在线编译环境:http://less2css.org/,
- 第三方GUI编译环境:http://lesscss.org/usage/#guis-for-less
使用less.js进行前端开发
less和less.js适用于开发阶段的调试,实际发布为了能得到更好的性能应该使用使用编译后的css
将less样式文件链入对应的html文件中:
1 | <link rel="stylesheet/less" type="text/css" href="styles.less" /> |
下载less.js,并在html文件中引入:
1 | <script src="less.js" type="text/javascript"></script> |
注意:1. 确保样式文件在脚本文件前;2. 每个
.less
都是单独编译的,所以里面的变量或混合选项等都不能共享;3. 由于浏览器的同源策略所以加载外部资源要求开启跨域请求。
可选项:可以在加载less.js文件之前为less进行相应的配置
1 | <!-- 需要在 less.js 脚本之前设置 --> |
点击这里有该配置的相关解释
变量:variables
变量定义
对于CSS中经常出现的共用属性值,我们可以使用变量来统一管理:
1 | a, .link { color: #428bca; } |
使用LESS变量统一管理:
1 | // 定义变量 |
LESS中的变量和编程语言中的变量不同,我们并不能修改变量的值,只能在相应的地方引用该变量。所以更准确的定义应该叫“常量”。
变量插值语句
上面的例子是将变量用作“属性值”,事实上变量也能用在其他地方,比如选择器、属性名、URL或@import指令。
1 | // 定义变量 |
变量用作选择器和属性名时必须要以
@{ }
的方式引用变量,否则编译不通过。在url和@import指令中使用也需要@{ }
,否则会被当成字符串的一部分。
变量用作变量名
这句话可能有点绕,我觉的看例子最直接:
1 | @fnord: "I am fnord."; |
最终会被编译成:
1 | content: "I am fnord."; |
变量的惰性加载
可以在变量的定义之前使用变量
1 | .lazy-eval { |
最终编译成:
1 | .lazy-eval-scope { |
你甚至可以这样:
1 | .lazy-eval-scope { |
同一作用域内,后定义的变量会覆盖先定义的变量,所以:
1 | @var: @a; |
会被编译成:
1 | .lazy-eval-scope { |
不同作用域则采用就近原则:
1 | @var: @a; |
会被编译成:
1 | .lazy-eval-scope { |
默认变量的覆盖
使用第三方框架时,我们可能需要修改里面的一些变量属性值,根据上面变量惰性加载的原理,我们可以这样使用:
1 | // 第三方框架中的变量 |
继承:extend
extend是less中的一个伪类选择器,用于合并共用CSS样式。
less中的extend被设计成了伪类选择器,相对于sass,这也是less被诟病的地方。
1 | nav ul { |
会被编译成:
1 | nav ul { |
当被继承的类选择器(这里是
.inline
)不存在,或者选择器中没有任何CSS属性,则该继承类在编译时会被删除。
继承的语法规则
1 | //////////////// |
extend只能放在选择器的末尾,
a:hover:extend(.link).nth-child(odd)
这种写法是不被允许的。
样式混合:mixins
样式混合就是把已有的样式插入到选择器中
1 | .a, #b { |
将会编译成:
1 | .a, #b { |
注意样式混合与样式继承的关系,不要混淆。
无输出的样式混合:
1 | .my-mixin { |
会被编译成:
1 | .my-mixin { |
带参数的mixins
1 | // 定义mixins |
mixins默认参数
1 | .border-radius(@radius: 5px) { |
多参mixins
1 | // 多个变量之间也使用","隔开 |
推荐使用”;”分隔参数,因为”,”还可能是多个css属性值的分隔符
@arguments变量
@arguments变量类似于JS中的arguments,用来表示mixins的所有输入参数。
1 | // 定义mixins |
被编译成:
1 | .big-block { |
可变参数
像编程语言一样可以使用...
表示可变参数:
1 | .mixin(...) { /* 匹配 0-N 个参数 */ } |
示例:
1 | .mixin(@a; @rest...) { |
LESS文档地址:http://lesscss.org/