首页 > 网站 > WEB开发 > 正文

初步认识 LESS,我要开始学习LESS啦!

2024-04-27 14:30:38
字体:
来源:转载
供稿:网友
初步认识 LESS,我要开始学习LESS啦!

LESS 是一个流行的样式表语言,它提供了 CSS3 也未曾实现的多种功能,让您编写 CSS 更加方便,更加直观。LESS 已经被广泛使用在多种框架中 ( 例如:BootStrap)。本文将介绍 LESS 产生的背景、优势、演化与 CSS 之间的转化,及其典型的应用场景,并将其与其他样式表语言进行比较。相信前端开发工程师会喜欢 LESS,灵活运用 LESS 以提高开发效率。

LESS 背景介绍

LESS 提供了多种方式能平滑的将写好的代码转化成标准 CSS 代码,在很多流行的框架和工具盒中已经能经常看到 LESS 的身影了(例如 Twitter 提供的 bootstrap 库就使用了 LESS)。那么,LESS 是从何而来呢?它和 SASS 等样式表语言又有何区别呢?

图 1.LESS 的官网介绍

图 1.LESS 的官网介绍

根 据维基百科上的介绍,其实 LESS 是 Alexis Sellier 受 SASS 的影响创建的开源项目。当时 SASS 采用了缩进作为分隔符来区分代码块,而不是 CSS 中广为使用的括号。为了让 CSS 现有用户使用起来更为方便,Alexis 开发了 LESS 并提供了类似的功能。在一开始,LESS 的解释器也同样是由 Ruby 编写,后来才转而采用了 javaScript. LESS 代码既可以运行在客户端,也可以运行在服务器端。在客户端只要把 LESS 代码和相应的 Javascript 解释器在同一页面引用即可;而在服务器端,LESS 可以运行在 Node.js 上,也可以运行在 Rhino 这样的 JavaScript 引擎上。

说一点题外话,其实现在的 SASS 已经有了两套语法规则:一个依旧是用缩进作为分隔符来区分代码块的;另一套规则和 CSS 一样采用了大括弧作为风格符。后一种语法规则又名 SCSS,在 SASS 3 之后的版本都支持这种语法规则。SCSS 和 LESS 已经越来越像了,它俩之间更详细的对比可以参考此链接。

LESS 高级特性

我 们知道 LESS 拥有四大特性:变量、混入、嵌套、函数。这些特性在其他文章中已经有所介绍,这里就不复述了。其实,LESS 还拥有一些很有趣的特性有助于我们的开发,例如模式匹配、条件表达式、命名空间和作用域,以及 JavaScript 赋值等等。让我们来逐一看看这些特性吧。

模式匹配:

相信大家对 LESS 四大特性中的混入 (mixin) 依然印象深刻吧,您用它能够定义一堆属性,然后轻松的在多个样式集中重用。甚至在定义混入时加入参数使得这些属性根据调用的参数不同而生成不同的属性。那 么,让我们更进一步,来了解一下 LESS 对混入的更高级支持:模式匹配和条件表达式。

首先,让我们来回顾一下普通的带参数的混入方式:

清单 1. 带参数(及参数缺省值)的混入

Html代码收藏代码
  1. .border-radius(@radius:3px){
  2. border-radius:@radius;
  3. -moz-border-radius:@radius;
  4. -webkit-border-radius:@radius;
  5. }
  6. .button{
  7. .border-radius(6px);
  8. }
  9. .button2{
  10. .border-radius();
  11. }

清单 2. 混入生成的 CSS 代码

Html代码收藏代码
  1. .button{
  2. border-radius:6px;
  3. -moz-border-radius:6px;
  4. -webkit-border-radius:6px;
  5. }
  6. .button2{
  7. border-radius:3px;
  8. -moz-border-radius:3px;
  9. -webkit-border-radius:3px;
  10. }

从上面这个例子可以看出,在混入我们可以定义参数,同时也可以为这个参数指定一个缺省值。这样我们在调用这个混入时如果指定了参数.border-radius(6px),LESS 就会用6px来替换,如果不指定参数来调用.border-radius(),LESS 就会用缺省的3px来替换。现在,我们更近一步,不仅仅通过参数值来更改最终结果,而是通过传入不同的参数个数来匹配不同的混入。

清单 3. 利用不同的参数个数来匹配不同的混入

Html代码收藏代码
  1. .mixin(@a){
  2. color:@a;
  3. width:10px;
  4. }
  5. .mixin(@a,@b){
  6. color:fade(@a,@b);
  7. }
  8. .header{
  9. .mixin(red);
  10. }
  11. .footer{
  12. .mixin(blue,50%);
  13. }

清单 4. 不同参数个数调用后生成的 CSS 代码

Html代码收藏代码
  1. .header{
  2. color:#ff0000;
  3. width:10px;
  4. }
  5. .footer{
  6. color:rgba(0,0,255,0.5);
  7. }

这个例子有些像 Java 语言中的方法调用有些类似,LESS 可以根据调用参数的个数来选择正确的混入来带入。现在,我们了解到通过传入参数的值,以及传入不同的参数个数能够选择不同的混入及改变它的最终代码。这两 个例子的模式匹配都是非常容易理解的,让我们换个思路,上面的例子中参数都是由变量构成的,其实在 LESS 中定义参数是可以用常量的!模式匹配时匹配的方式也会发生相应的变化,让我们看个实例。

清单 5. 用常量参数来控制混入的模式匹配

Html代码收藏代码
  1. .mixin(dark,@color){
  2. color:darken(@color,10%);
  3. }
  4. .mixin(light,@color){
  5. color:lighten(@color,10%);
  6. }
  7. .mixin(@zzz,@color){
  8. display:block;
  9. weight:@zzz;
  10. }
  11. .header{
  12. .mixin(dark,red);
  13. }
  14. .footer{
  15. .mixin(light,blue);
  16. }
  17. .body{
  18. .mixin(none,blue);
  19. }

清单 6. 常量参数生成的 CSS 代码

Html代码收藏代码
  1. .header{
  2. color:#cc0000;
  3. display:block;
  4. weight:dark;
  5. }
  6. .footer{
  7. color:#3333ff;
  8. display:block;
  9. weight:light;
  10. }
  11. .body{
  12. display:block;
  13. weight:none;
  14. }

通过这个例子我们可以看出,当我们定义的是变量参数时,因为 LESS 中对变量并没有类型的概念,所以它只会根据参数的个数来选择相应的混入来替换。而定义常量参数就不同了,这时候不仅参数的个数要对应的上,而且常量参数的 值和调用时的值也要一样才会匹配的上。值得注意的是我们在 body 中的调用,它调用时指定的第一个参数 none 并不能匹配上前两个混入,而第三个混入.mixin (@zzz, @color)就不同了,由于它的两个参数都是变量,所以它接受任何值,因此它对三个调用都能匹配成功,因此我们在最终的 CSS 代码中看到每次调用的结果中都包含了第三个混入的属性。

最后,我们把清单 1 中的代码做略微改动,增加一个无参的混入和一个常量参数的混入,您猜猜看最终的匹配结果会发生什么变化么?

清单 7. 无参和常量参数的模式匹配

Html代码收藏代码
  1. .border-radius(@radius:3px){
  2. border-radius:@radius;
  3. -moz-border-radius:@radius;
  4. -webkit-border-radius:@radius;
  5. }
  6. .border-radius(7px){
  7. border-radius:7px;
  8. -moz-border-radius:7px;
  9. }
  10. .border-radius(){
  11. border-radius:4px;
  12. -moz-border-radius:4px;
  13. -webkit-border-radius:4px;
  14. }
  15. .button{
  16. .border-radius(6px);
  17. }
  18. .button2{
  19. .border-radius(7px);
  20. }
  21. .button3{
  22. .border-radius();
  23. }

下面的结果可能会出乎您的意料,无参的混入是能够匹配任何调用,而常量参数非常严格,必须保证参数的值(7px)和调用的值(7px)一致才会匹配。

清单 8. 加入了无参混入后生成的 CSS 代码

Html代码收藏代码
  1. .button{
  2. border-radius:6px;
  3. -moz-border-radius:6px;
  4. -webkit-border-radius:6px;
  5. border-radius:4px;
  6. -moz-border-radius:4px;
  7. -webkit-border-radius:4px;
  8. }
  9. .button2{
  10. border-radius:7px;
  11. -moz-border-radius:7px;
  12. -webkit-border-radius:7px;
  13. border-radius:7px;
  14. -moz-border-radius:7px;
  15. border-radius:4px;
  16. -moz-border-radius:4px;
  17. -webkit-border-radius:4px;
  18. }
  19. .button3{
  20. border-radius:3px;
  21. -moz-border-radius:3px;
  22. -webkit-border-radius:3px;
  23. border-radius:4px;
  24. -moz-border-radius:4px;
  25. -webkit-border-radius:4px;
  26. }

条件表达式

有了模式匹配之后是方便了很多,我们能根据不同的需求来匹配不同的混入,但更进一步的就是利用条件表达式来更加准确,更加严格的来限制混入的匹配,实现的方式就是利用了when这个关键词。

清单 9. 利用条件表达式来控制模式匹配

Html代码收藏代码
  1. .mixin(@a)when(@a>=10){
  2. black;
  3. }
  4. .mixin(@a)when(@a<10){
  5. white;
  6. }
  7. .class1{.mixin(12)}
  8. .class2{.mixin(6)}

清单 10. 条件表达式生成的 CSS 代码

Html代码收藏代码
  1. .class1{
  2. black;
  3. }
  4. .class2{
  5. white;
  6. }

利用 When 以及 <, >, =, <=, >= 是十分简单和方便的。LESS 并没有停留在这里,而且提供了很多类型检查函数来辅助条件表达式,例如iscolorisnumberisstringiskeyWordisurl等等。

清单 11. 条件表达式中支持的类型检查函数

Html代码收藏代码
  1. .mixin(@a)when(iscolor(@a)){
  2. black;
  3. }
  4. .mixin(@a)when(isnumber(@a)){
  5. white;
  6. }
  7. .class1{.mixin(red)}
  8. .class2{.mixin(6)}

清单 12. 类型检查匹配后生成的 CSS 代码

Html代码收藏代码
  1. .class1{
  2. black;
  3. }
  4. .class2{
  5. white;
  6. }
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表