less
less是一种动态样式语言,属于css预处理器的范畴,它扩展了 CSS 语言,增加了变量、Mixin、函数等特性,使 CSS 更易维护和扩展。
LESS 做为 CSS 的一种形式的扩展,它并没有阉割 CSS 的功能,而是在现有的 CSS 语法上,添加了很多额外的功能。
less的中文官网:http://lesscss.cn/
bootstrap中关于less的介绍:http://www.bootcss.com/p/lesscss/#docs
Less编译工具
koala 官网: www.koala-app.com
less中的注释
- 以 // 开头的注释,不会被编译到css文件中
- 以 /**/ 包裹的注释,会被编译到css文件中
less中的变量
使用 @ 来申明一个变量:@变量名:变量值;
作为普通属性值来使用:直接使用
1
2
3
4@pink: pink;
.box{
background: @pink;
}作为选择器和属性名:@{ 变量名 } 的形式
1
2
3
4
5
6
7@wrap: #wrap;
@w: width;
@{wrap}{
@{w}: 400px;
height: 300px;
}作为 URL:@{url}
1
2
3
4
5@imgUrl: "../img/zdy.jpg";
@{wrap}{
background: url("@{imgUrl}") no-repeat;
}
请注意 LESS 中的变量为完全的 ‘常量’ ,所以只能定义一次.
less中的嵌套规则
LESS 可以用嵌套的方式编写层叠样式.
基本嵌套规则
如下 CSS 代码:1
2
3
4
5
6
7
8#list {
width: 200px;
background: pink;
}
#list span {
float: right;
}
使用 LESS 可以写为:1
2
3
4
5
6
7
8#list{
width: 200px;
background: pink;
span{
float: right;
}
}
& 的使用
如果你想写串联选择器,而不是写后代选择器,就可以用到 & 了。这点对伪类尤其有用,如 :hover 和 :focus.
如下 CSS 代码:1
2
3
4
5
6#list a {
float: left;
}
#list a:hover {
color: red;
}
使用 LESS 可以写为:1
2
3
4
5
6
7
8#list{
a{
float: left;
&:hover{
color: red;
}
}
}
less中的混合
在 LESS 中我们可以定义一些通用的属性集为一个class,然后在另一个 class 中去调用这些属性。
混合就是将一系列属性从一个规则集引入到另一个规则集的方式。
任何 CSS class, _id_ 或者 _元素_ 属性集都可以以同样的方式引入.
普通混合
定义一个通用属性集,实现子元素垂直水平居中,在需要居中的子元素上调用该属性集:1
2
3
4
5
6
7
8
9
10
11
12
13
14.middle{
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
}
#wrap{
position: relative;
#inner1{
.middle;
}
}
不带输出的混合
使用普通混合方式,在 LESS 中定义的通用属性集会被编译到 CSS 文件中,如果想隐藏通用属性集,不让它暴露到 CSS 中,可以定义不带参数的属性集合。1
2
3
4
5
6
7
8
9
10
11
12
13
14.middle() {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
}
#wrap{
position: relative;
#inner1{
.middle;
}
}
带参数的混合
在 LESS 中,还可以像函数一样定义一个带参数的属性集合。1
2
3
4
5
6
7
8.border-radius (@radius) {
border-radius: @radius;
-moz-border-radius: @radius;
-webkit-border-radius: @radius;
}
#header {
.border-radius(4px);
}
带参数并且有默认值的混合
参数可以设置默认值,调用时如果不传参数,则使用默认值1
2
3
4
5
6
7
8.border-radius (@radius: 5px) {
border-radius: @radius;
-moz-border-radius: @radius;
-webkit-border-radius: @radius;
}
#header {
.border-radius;
}
带多个参数的混合
参数可以传多个,传入的实参与形参从左往右进行匹配。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17.middle (@w:100px, @h:100px, @c:pink) {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
width: @w;
height:@h;
background: @c;
}
#wrap{
position: relative;
#inner1{
.middle(50px, 50px);
}
}
命名参数
在上面的示例代码中,传入的参数会从左往右与形参进行匹配,如果希望 @w 使用默认值,只传入 @h、@c,则实参与形参不能按照默认方式匹配,这时可以使用命名参数传参。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17.middle ( @w: 100px, @h: 100px, @c: pink) {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
width: @w;
height:@h;
background: @c;
}
#wrap{
position: relative;
#inner2{
.middle( @h: 200px; @c: deeppink);
}
}
匹配模式
混合的参数不一定是变量,也可以是固定值。
变量可以匹配任意的传入值,而固定值就仅仅匹配与其相等的传入值。
只有被匹配的混合才会被使用。
如下代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14.triangle( @_, @w:10px){
width: 100px;
height: 100px;
}
.triangle(top, @w:10px){
border-width: @w;
position: absolute;
top: 50px;
}
.triangle(bottom, @w:10px){
border-width: @w;
position: absolute;
bottom: 50px;
}
如果这样运行:1
2
3#box1{
.triangle(top);
}
则会得到:1
2
3
4
5
6
7#box1 {
width: 100px;
height: 100px;
border-width: 10px;
position: absolute;
top: 50px;
}
具体实现如下:
- 第一个混合定义被成功匹配,因为它接受任意值
- 第二个混合定义被成功匹配,因为它只接受 top 作为首参
- 第三个混合定义未被匹配,因为它只接受 bottom 作为首参
我们也可以匹配多个参数1
2
3
4.mixin (@a) {
}
.mixin (@a, @b) {
}
当调用 .mixin 时,如果只传入一个参数,则会匹配到第一个 .mixin 混合,如果传入两个参数,则匹配第二个。
@arguments变量
@arguments包含了所有传递进来的参数。如果你不想单独处理每一个参数的话就可以像这样写:1
2
3
4
5
6
7
8
9.border(@w:20px, @c:black, @style:solid){
width: 100px;
height: 100px;
background: pink;
border: @arguments;
}
#wrap{
.border(10px, deeppink, solid);
}
将输出:1
2
3
4
5
6#wrap {
width: 100px;
height: 100px;
background: pink;
border: 10px #ff1493 solid;
}
less运算
在 less 中可以进行加减乘除的运算。
任何 _数字_、_颜色_ 或者 _变量_ 都可以参与运算。
如下 LESS 代码:1
2
3
4
5
6
7
8@base: 5%;
@filler: @base * 2;
@other: @base + @filler;
.box{
color: #888 / 4;
background-color: @base - @other + #111;
height: 100% / 2 + @filler;
}
运行后得到:1
2
3
4
5.box {
color: #222222;
background-color: #070707;
height: 60%;
}
LESS 的运算已经超出了我们的期望,它能够分辨出颜色和单位。如果像下面这样单位运算的话:
@var: 1px + 5;
LESS 会输出 6px
.
括号也同样允许使用:
@width: (@var + 5) * 2;
可以在复合属性中进行运算:
border: (@width * 2) solid black;
作用域
LESS 中的作用域跟其他编程语言非常类似,首先会从本地查找变量或者混合模块,如果没找到的话会去父级作用域中查找,直到找到为止。
内层声明块作用域中的变量,在父级作用域中无法获取。
变量延迟加载
同一个作用域中,变量的使用会在变量被全部赋值后执行。
如下代码中,.inner 内定义了两次 @test 变量,less 编译时,会在 .inner 作用域中先将变量定义的代码全部执行,然后才使用该变量,所以在 .inner 使用 @test 变量,得到的结果为 3。
1 | .wrap{ |
命名空间
有时候,为了更好组织 CSS 或者单纯是为了更好的封装,将一些变量或者混合模块打包起来, 可以像下面这样在 #bundle 中定义一些属性集之后可以重复使用:1
2
3
4
5
6
7
8
9
10#bundle {
.button() {
display: block;
border: 1px solid black;
background-color: grey;
&:hover { background-color: white;}
}
.tab { ... }
.citation { ... }
}
只需要这样调用:1
2
3
4#header a {
color: orange;
#bundle > .button;
}
Importing
可以在main文件中通过下面的形式引入 .less 文件, .less 后缀可带可不带:1
2@import "lib.less";
@import "lib";
如果想导入一个CSS文件而且不想LESS对它进行处理,只需要使用.css后缀就可以:1
@import "lib.css";
这样LESS就会跳过它不去处理它.
字符串插值
变量可以嵌入到字符串中。
上面介绍过的变量作为 URL 使用的方式,就是将变量插入到字符串中。1
2@base-url: "http://assets.fnord.com";
background-image: url("@{base-url}/images/bg.png");
避免编译
有时候我们需要输出一些不正确的 CSS 语法或者使用一些 LESS 不认识的专有语法。
要输出这样的值我们可以将避免编译的值用 ""
包含起来,并在字符串前加上一个 ~
, 例如:1
2
3.class {
filter: ~"ms:alwaysHasItsOwnSyntax.For.Stuff()";
}
输出结果为:1
2
3.class {
filter: ms:alwaysHasItsOwnSyntax.For.Stuff();
}