概览

Less(Leaner Style Sheets 的缩写)是一门向后兼容的CSS扩展语言。这里呈现的是Less的官方文档(中文版),包含了Less语言以及利用JavaScript开发的用于将Less样式转换成CSS样式的Less.js工具。因为 Less 和 CSS 非常像,因此很容易学习。而且 Less 仅对 CSS 语言增加了少许方便的扩展,这就是 Less 如此易学的原因之一。Less支持变量、嵌套、混合方法、继承、注释、函数等特点。

  • Less官网
  • Bootstrap网站的 less 文档

less的语法

一、变量

声明less变量,只需在属性名前加“@”,使用时用@+变量名即可。例子如下:

main.less

@width: 10px;
@height: @width + 10px;

#header {
  width: @width;
  height: @height;
}

编译成css文件如下:

main.css

#header {
  width: 10px;
  height: 20px;
}

二、嵌套

Less 提供了使用嵌套(nesting)代替层叠或与层叠结合使用的能力。假设我们有以下 CSS 代码:

#header {
  color: black;
}
#header .navigation {
  font-size: 12px;
}
#header .logo {
  width: 300px;
}

用Less语言我们可以这样书写代码:

#header {
  color: black;
  .navigation {
    font-size: 12px;
  }
  .logo {
    width: 300px;
  }
}

三、混合

无参数方法

混合(Mixin)是一种将一组属性从一个规则集包含(或混入)到另一个规则集的方法。假设我们定义了一个类(class)如下:

.conter {
  width: 100px;
  height: 100px;

  .conterWap {
    border-radius: 50%;
    box-shadow: 0 0 10px rgba(red, green, blue, .3);
  }
}

如果我们希望在其它规则集中使用这些属性呢?没问题,我们只需像下面这样输入所需属性的类(class)名称即可,如下所示:

.test {
  .conter;
  //.conter();括号可加可不加
}

生成的.css文件代码如下:

.conter {
  width: 100px;
  height: 100px;
}
.conter .conterWap {
  border-radius: 50%;
  box-shadow: 0 0 10px rgba(red, green, blue, 0.3);
}
.test {
  width: 100px;
  height: 100px;
}
.test .conterWap {
  border-radius: 50%;
  box-shadow: 0 0 10px rgba(red, green, blue, 0.3);
}
默认参数方法

.less文件代码如下:

.border(@a: 2px, @b: 2px, @c: 10px, @coloe: #555) {
  border: @a @coloe solid;
  // @arguments指代传进来的全部参数
  box-shadow: @arguments;
}

.wrap1 {
  .border();
}

生成的.css文件代码如下:

.wrap1 {
  border: 2px #555 solid;
  box-shadow: 2px 2px 10px #555;
}
方法的匹配模式

.less文件代码如下:

//方法的匹配模式
.trangle(top, @color: #555, @width: 50px) {
  border-color: transparent transparent @color transparent
}

.trangle(left, @color: #555, @width: 50px) {
  border-color: transparent @color transparent transparent
}

.trangle(bottom, @color: #555, @width: 50px) {
  border-color: @color transparent transparent transparent
}

.trangle(right, @color: #555, @width: 50px) {
  border-color: transparent transparent transparent @color
}

.trangle(@_, @color, @width) {
  border-width: @width;
  border-style: solid
}

.wrap2 {
  .trangle(bottom, #333, 20px);
}

生成的.css文件代码如下:

.wrap2 {
  border-color: #333 transparent transparent transparent;
  border-width: 20px;
  border-style: solid;
}
数量不定的参数

.less文件代码如下:

//数量不定的参数
.boxShadow(...) {
  box-shadow: @arguments;
}

.wrap3 {
  .boxShadow(0 0 10px #666)
}

生成的.css文件代码如下:

.wrap3 {
  box-shadow: 0 0 10px #666;
}
循环方法

.less文件示例代码如下:

.xunhuan(4);

.xunhuan(@n, @i: 1) when (@i <=@n) {
  .test@{i} {
    width: (@i*100% / @n);
  }

  .xunhuan(@n, (@i+1))
}

生成的.css文件代码如下:

.test1 {
  width: 25%;
}
.test2 {
  width: 50%;
}
.test3 {
  width: 75%;
}
.test4 {
  width: 100%;
}

四、继承

extend关键字的使用

extend是Less的一个伪类。它可继承所匹配声明中的全部样式。

从表面来看,extend和方法最大的差别,就是extend是同个选择器共用一个声明,而方法是使用自己的声明,这无疑增加了代码的重复性。

下面是方法和extend之间的比较(.less文件):

.conter {
  width: 100px;
  height: 100px;

  .conterWap {
    border-radius: 50%;
    box-shadow: 0 0 10px rgba(red, green, blue, .3);
  }
}
//  方法
.test {
  .conter();
}

//  使用extend
.test {
  &:extend(.conter all);
}

生成的.css文件代码如下:

//  方法生成的.css文件
.conter {
  width: 100px;
  height: 100px;
}
.conter .conterWap {
  border-radius: 50%;
  box-shadow: 0 0 10px rgba(red, green, blue, 0.3);
}
.test {
  width: 100px;
  height: 100px;
}
.test .conterWap {
  border-radius: 50%;
  box-shadow: 0 0 10px rgba(red, green, blue, 0.3);
}

//  extend生成的.css文件
.conter,
.test {
  width: 100px;
  height: 100px;
}
.conter .conterWap,
.test .conterWap {
  border-radius: 50%;
  box-shadow: 0 0 10px rgba(red, green, blue, 0.3);
}
&在less中的含义

表示当前层级(.clearfix)

.clearfix {
  &::after,
  &::before {
    content: '';
    display: table;
    clear: both;
  }
}

生成的.css文件如下:

.clearfix::after,
.clearfix::before {
  content: '';
  display: table;
  clear: both;
}

五、注释

块注释和行注释都可以使用:

块注释会保留在生成的.css文件中,而行注释将不被保留,只存在于.less文件中。

/* 一个块注释
 * style comment! */
@var: red;

// 这一行被注释掉了!
@var: white;

六、函数

Less 内置了多种函数用于转换颜色、处理字符串、算术运算等。这些函数在Less 函数手册中有详细介绍。

函数的用法非常简单。下面这个例子将介绍如何利用 percentage 函数将 0.5 转换为 50%,将颜色饱和度增加 5%,以及颜色亮度降低 25% 并且色相值增加 8 等用法:

@base: #f04615;
@width: 0.5;

.class {
  width: percentage(@width); // returns `50%`
  color: saturate(@base, 5%);
  background-color: spin(lighten(@base, 25%), 8);
}