Appearance
less 的简介
- Less 是一门 CSS 预处理语言,它扩展了 CSS 语言,增加了变量、Mixin、函数等特性,使 CSS 更易维护和扩展。Less 可以运行在 Node 或浏览器端;
- less 官方文档 http://lesscss.org/
- less 中文文档 https: /less.bootcss.com/
- less 文件后缀为。Less,例如:index.less
less 的安装
- $ npm install -g less
less 的编译方法
在 nodejs 环境中使用 less
- 在命令行中运行 less: lessc styles..less styles..css
- 编译成生产环境下的 css 文件:lessc-x styles.less styles.css
在浏览器环境中使用 less
<link rel="stylesheet/less"type="text/css"href="styles.less"/>
<script src="http://cdnjs.cloudflare.com/ajax/libs/less.js/2.5.3/less.min.js"></script>
工具编译
变量
变量正常用法(variables)
在一个位置控制常用值 .less 文件中
less
// Variables
@link-color: #428bca; // sea blue
@link-color-hover: darken(@link-color, 10%);
// Usage
a,
.link {
color: @link-color;
}
a:hover {
color: @link-color-hover;
}
.widget {
color: #fff;
background: @link-color;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.css 文件中对应的 css 代码:
css
a,
.link {
color: #428bca;
}
.widget {
color: #fff;
background: #428bca;
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
变量作为选择器名称使用
语法:变量声明:@变量:值 -------------- 使用:.@{变量} .less 文件中代码:
less
@my-selector: bananer;
// Usage
.@{my-selector} {
font-weight: bold;
color: lightblue;
}
// .css 文件中对应的 css 代码:
.bananer {
font-weight: bold;
color: lightblue;
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
变量作为属性名称使用
使用方法与作为选择器名称使用一样: .less 文件中代码:
less
// Properties
@property: color;
.@{property} {
@{property}: red;
background-@{property}: green;
}
.css 文件中对应的 css 代码:
.color {
color: red;
background-color: green;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
变量作为 URL 使用
语法:@变量:值 ----------- URL 使用:url("@{变量}/ 图片名称")(注:变量即路径) 直接在变量中直接写入完整的路径也是可以的 .less 文件中的代码:
less
//URLs
@images: "../img";
body {
background-image: url("@{images}/white-sand.png");
}
// .css 文件中对应的 css 代码:
body {
background-image: url("../img/white-sand.png");
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
变量作为 @import 语句使用
用法跟 URL 一样
less
// Variables
@themes: "../test";
// Usage
@import "@{themes}/test.less";
1
2
3
4
2
3
4
在。css 文件中输出的即为 tess.less 中所对应的 css 代码,而不是 @import 语句
变量作为变量名使用
在。less 文件中,可以使用变量定义另一个变量的名称 .less 文件中的代码:
less
// Variable Variables
@primary: lightblue;
@secondary: lightyellow;
.section {
@color: primary;
.element {
color: @@color;
}
p {
color: @secondary;
}
}
// .css 文件中对应的 css 代码:
.section .element {
color: lightblue;
}
.section p {
color: lightyellow;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
变量的 Lazy Evaluation
变量在使用之前可以不必声明,可以在使用之后声明 如果存在局部变量,那么该作用域的属性会引用局部变量,如果不存在局部变量,那么后面声明的变量会覆盖前面声明的变量(如果声明了两个局部变量,同理) .less 文件中的代码:
less
// Lazy Evaluation
.lazy-eval {
width: @var;
@a: 100px;
}
@var: @a;
@a: 80px;
@a: 40px;
.css 文件中对应的 css 代码:
.lazy-eval {
width: 100px;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
属性作为变量
使用 $prop 语法将属性当作变量来使用 .less 文件中的代码:
less
// Properties as Variables
.widget {
color: #dafafb;
background-color: $color;
}
.ul {
height: 20px;
.li {
padding: $height;
}
height: 40px;
}
// .css 文件中对应的 css 代码:
.widget {
color: #dafafb;
background-color: #dafafb;
}
.ul {
height: 20px;
height: 40px;
}
.ul .li {
padding: 40px;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
默认变量
默认变量使得可以通过在后面放置定义来覆盖变量 .less 文件中的代码:
less
// Default Variables
@base-color: green;
@dark-color: darken(@base-color, 20%); // 深绿色
.footer {
@base-color: red;
color: @dark-color;
}
<!-- .css 文件中所对应的 css 代码: -->
.footer {
color: #990000; // 深红色
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
由于延迟加载, @base-color 已被覆盖并且 @dark-color 为深红色
less
@color: red;
@size: 14px;
.container{
background: @color;
font-size: @size;
}
/* 编译后的css代码 */
.container {
background: red;
font-size:14px
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
嵌套(Nesting)
嵌套类
less
#header {
color: black;
.navigation{
font-size:12px;
}
.logo{
width:300px;
}
}
/* 编译后的css代码 */
#header.navigation{}
#header.logo{}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
Parent Selector 正常用法
使用 & 运算符来引用父选择器。嵌套规则的父选择器由 & 运算符表示,并在将修改类或伪类应用于现有选择器时使用。
less
// .less文件中的代码:
a {
color: lightblue;
&:hover {
color: lightcoral;
}
&:visited {
color: lightseagreen;
}
&:focus {
color: lime;
}
}
// .css文件中对应的css代码:
a {
color: lightblue;
}
a:hover {
color: lightcoral;
}
a:visited {
color: lightseagreen;
}
a:focus {
color: lime;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
通过 Parent Selector 产生重复的类名
less
// .less 文件中的代码:
.button {
&-ok {
background-image: url("ok.png");
}
&-delete {
background-image: url("delete.png");
}
&-add {
background-image: url("add.png");
}
}
// .css 文件中对应的 css 代码:
.button-ok {
background-image: url("ok.png");
}
.button-delete {
background-image: url("delete.png");
}
.button-add {
background-image: url("add.png");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Multiple &
通过使用 & 运算符,可以重复引用父选择器,而不用使用其名称,直接使用 & 运算符引用即可。
less
// .less 文件中的代码:
// Multiple Parents `在这里插入代码片`
.nav {
& + & {
margin: 10px;
}
& & {
padding: 10px;
}
&& {
width: 20px;
}
&>& {
border: 1px solid red;
}
& , &bar {
position: relative;
}
}
// .css 文件中对应的 css 代码:
.nav + .nav {
margin: 10px;
}
.nav .nav {
padding: 10px;
}
.nav.nav {
width: 20px;
}
.nav > .nav {
border: 1px solid red;
}
.nav,
.navbar {
position: relative;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
注:& 运算符代表的是所有父选择器,不仅仅是上一级的父选择器,eg:
less
// .less 文件中的代码:
//& 是代表所有父选择器,而不仅仅是指上一级祖先
.grandfather {
.father {
& {
color: lightgoldenrodyellow;
}
}
}
// .css 文件中对应的 css 代码:
.grandfather .father {
color: lightgoldenrodyellow;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
父选择器的顺序
在选择器排序更改时,将选择器预留到继承(父)选择器器很有用,可以把 & 运算符放置在当前选择器之后来完成,eg:
less
// .less 文件中的代码:
// Change Selector Order
.header {
.menu {
border-radius: 5px;
.no-border & {
background-image: url("border.png");
}
}
}
// .css 文件中对应的 css 代码:
.header .menu {
border-radius: 5px;
}
.no-border .header .menu {
background-image: url("border.png");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
父选择器之间的组合
& 可以产生列表中的选择器的所有可能的排列,用逗号分隔,eg:
less
// .less 文件中的代码:
// Combinatorial Explosion
p , a , li , span {
margin-top: 10px;
& + & {
padding: 5px;
}
}
// .css 文件中对应的 css 代码:
p,
a,
li,
span {
margin-top: 10px;
}
p + p,
p + a,
p + li,
p + span,
a + p,
a + a,
a + li,
a + span,
li + p,
li + a,
li + li,
li + span,
span + p,
span + a,
span + li,
span + span {
padding: 5px;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Merge
Merge 将多个属性中的值聚合到单个属性下的逗号或空格分隔的列表中,对于背景和变换等属性很有作用。
用逗号附加属性
在属性后面加上 “+” 来标记,eg:
less
// .less 文件中的代码:
.mixin() {
box-shadow+: inset 0 0 10px #666;
font+: 16px, red;
}
.myClass {
.mixin();
box-shadow+: 10px 10px 20px 5px black;
font+: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
font+: 600;
}
// .css 文件中对应的 css 代码:
.myClass {
box-shadow: inset 0 0 10px #666, 10px 10px 20px 5px black;
font: 16px, red, 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif, 600;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
用空格附加属性
在属性后面加上 “+_” 来标记,eg: .less 文件中的代码:
.mixin1() { transform+: scale(2); } .start { .mixin1(); transform+: rotate(15deg); }
.css 文件中对应的 css 代码:
.start { transform: scale(2) rotate(15deg); }
extend 的用法
Extend 是一个 Less 伪类,通过:extend 在一个选择器中扩展其他选择器样式,从而与匹配其引用的选择器合并。
Extend 的简单使用
.less 文件中的代码:
less
// Extend
nav ul {
&:extend(.line);
background-color: lightgray;
}
.line {
color: maroon;
}
// .css文件中对应的css代码:
nav ul {
background-color: lightgray;
}
.line,
nav ul {
color: maroon;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
在上述设定的规则中,只要
.line
这个选择器出现,:extend 将会把 nav ul 应用到。line 上
Extend 语法
extend 可以附加到选择器,也可以放置在规则集中
less
// Extend Syntax
.a:extend(.f){}
.b {
&:extend(.g);
} // 两种语法都可以实现对选择器的 Extend
.c:extend(.f all) {} // 加了关键字 all, 可以匹配所有带有".f"的选择器,eg:".f.x"
.c:extend(.f, .g) {} // 可以包含一个或者多个要扩展的类
.f {
height: 30px;
}
.g {
color: green;
}
.f.x {
padding: 10px;
}
// .css 文件中对应的 css 代码:
.f,
.a,
.c,
.c {
height: 30px;
}
.g,
.b,
.c {
color: green;
}
.f.x,
.c.x {
padding: 10px;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Extend 附加到选择器
一个选择器可以包含多个 extend 子句,但是所有扩展都必须在选择器的末尾,任何一个选择器都可以具有 extend 关键字:
- 是在选择器之后扩展:eg、 .big-division:extend(.f);
- 选择器和 extend 之间允许有空格:eg、.big-division :extend(.f);
- 允许多个扩展,eg、.big-division:extend(.f):extend(.g); 也可以写成: .big-division:extend(.f , .g);
- 扩展必须是最后一个,eg、.big-division:extend(.f).nth-child(odd)
less
// .less 文件中的代码:
// Extend Attached to Selector
.big-division ,
.big-bag:extend(.f),
.big-bucket:extend(.g) {
float: left;
}
.f {
height: 30px;
}
.g {
color: green;
}
// .css 文件中对应的 css 代码:
.f,
.big-bag {
height: 30px;
}
.g,
.big-bucket {
color: green;
}
.big-division,
.big-bag,
.big-bucket {
float: left;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
extend 内部规则集
可以使用 &:extend 语法将 extend 放置在规则集的主体中,与每个选择器之后添加扩展名是一样的 .less 文件中的代码:
less
// Extend Inside Ruleset
.pre:hover, // 在内部使用 extend
.some-class {
&:extend(#pre);
}
#pre{
margin: auto;
}
.css 文件中对应的 css 代码:
#pre,
.pre:hover,
.some-class {
margin: auto;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
extend 嵌套选择器
extend 可以匹配嵌套的选择器 .less 文件中的代码:
less
// Extending Nested Selectors
.buck {
tr {
color: orange;
}
}
.some-class:extend(.buck tr) {}
.some-one {
&:extend(.buck tr);
}
.css 文件中对应的 css 代码:
.buck tr,
.some-class,
.some-one {
color: orange;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
精确匹配与 extend
默认情况下 extend 是查找与选择器之间的精确匹配,选择器是否使用"*"并不重要,不管第 n 个表达式有没有相同的含义,都是需要有相同的形式才能匹配。唯一的例外是属性选择器中的引号,less 知道它们具有相同的含义并与之匹配。 .less 文件中的代码:
less
/* Exact Matching with Extend 即完全匹配 */
.class.a,
.a.class,
.a>.class,
.class>.a {
margin: 0 auto;
}
.test:extend(.class){} // 这两个 extend 不会与任何选择器匹配
.test1:extend(*.class){}
.match:extend(.class.a){}
// .css 文件中对应的 css 代码:
.class.a,
.a.class,
.a > .class,
.class > .a,
.match {
margin: 0 auto;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
伪类的顺序会影响选择器的精确匹配,eg、选择器 .a:hover:visited 与 .a:visited:hover 匹配相同的元素集,但 extend 将它们视为不同的元素:
less
// .less 文件中的代码:
.a:hover:visited {
text-decoration: palegoldenrod;
}
.selector:extend(.a:visited:hover){}
.selector1:extend(.a:hover:visited){}
// .css 文件中对应的 css 代码:
.a:hover:visited,
.selector1 {
text-decoration: palegoldenrod;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
nth 表达式
nth 表达式是比较重要的。表达式 1n+3 和 n+3 是等效的,但是 extend 与它们不匹配
less
// .less 文件中的代码:
:nth(1n+5) {
padding: 30px;
}
.child:extend(:nth(n+5)) {}
.child1:extend(:nth(1n+5)){}
// .css 文件中对应的 css 代码:
:nth(1n+5),
.child1 {
padding: 30px;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
属性选择器中的引用类型不区分,以下所有都是等效的
less
// .less 文件中的代码:
// 属性选择器中的引用类型没有区别,以下所有都是等效的
[title=identifier] {
color: red;
}
[title='identifier'] {
color: green;
}
[title="identifier"] {
color: blue;
}
.single {
&:extend([title="identifier"]);
}
// .css 文件中对应的 css 代码:
[title=identifier],
.single {
color: red;
}
[title='identifier'],
.single {
color: green;
}
[title="identifier"],
.single {
color: blue;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
extend “all”
当在使用 extend 时指定了"all" 关键字,它将会与该选择器作为另一个选择器的一部分进行匹配。选择器将会被复制,并且只有选择器的匹配部分将被替换为 extend, 从而生成一个新选择器
less
// .less 文件中的代码:
// Extend "all"
.test.a .b,
.test.c {
border: 1px solid lightgray;
&:hover {
stroke-width: initial;
}
}
.test {
&:visited {
color: bisque;
}
}
.replacement:extend(.test all){}
// .css 文件中对应的 css 代码:
.test.a .b,
.test.c,
.replacement.a .b,
.replacement.c {
border: 1px solid lightgray;
}
.test.a .b:hover,
.test.c:hover,
.replacement.a .b:hover,
.replacement.c:hover {
stroke-width: initial;
}
.test:visited,
.replacement:visited {
color: bisque;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
带 extend 的插值选择器
extend 无法将选择器与变量进行匹配。如果选择器包含变量,extend 将会忽略,不可以将 extend 附加到插值选择器中(注:官网说可以将 extend 附加到插值选择器中,经检测是不可以的)
less
// .less 文件中对应的代码:
// Selector Interpolation with Extend
@base: .bucket;
@{base} {
font: outline;
}
.mark:extend(.bucket) {}
.mark1:extend(@{base}) {} // 使用带有变量的 extend,该选择器将不匹配
// .css 文件中对应的代码:
.bucket,
.mark {
font: outline;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
不可以将:extend 附加到插值选择器中
less
// .less 文件中的代码:
.ground {
box-sizing: initial;
}
@{form}:extend(.ground){}
@form: #ground;
// 把:extend 附加到插值选择器不可以实现
.visit {
color: red;
}
@{font}:extend(.visit) {}
@font: .meta;
.before {
color: blue;
}
@{variable}:extend(.before) {}
@variable: .selector;
// .css 文件中对应的 css 代码:
.ground {
box-sizing: initial;
}
.visit {
color: red;
}
.before {
color: blue;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
在 @media 范围内 /extend
声明:extend 内的 @media 只与同一媒体声明中的选择器进行匹配
less
// .less 文件中的代码:
// Scoping / Extend Inside @media
// 在媒体声明内编写的扩展只与同一媒体声明内的选择器匹配
@media print {
.screenClass:extend(.second) {}
.second {
border-radius: unset;
}
}
.second {
columns: 3;
}
// .css 文件中的 css 代码:
@media print {
.second,
.screenClass {
border-radius: unset;
}
}
.second {
columns: 3;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
extend 与嵌套 @media 中的选择器不匹配
less
// .less 文件中的代码:
// 在媒体声明中编写的 extend 与嵌套声明中的选择器不匹配
@media screen {
.one:extend(.two) {}
@media (min-width: 768px) {
.two {
color: bisque;
}
}
}
// .css 文件中的代码:
@media screen and (min-width: 768px) {
.two {
color: bisque;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
顶级 extend 将匹配所有内容,包括嵌套 @media 中的选择器
less
.less 文件中的代码:
// 顶级扩展匹配所有内容,包括嵌套媒体中的选择器
@media screen {
.start {
bottom: unset;
}
@media (max-width: 1024px) {
.stop {
left: 12px;
}
}
}
.end:extend(.start, .stop) {}
// .css 文件中对应的 css 代码:
@media screen {
.start,
.end {
bottom: unset;
}
}
@media screen and (max-width: 1024px) {
.stop,
.end {
left: 12px;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
重复检测
extend 中不会进行重复检测
less
// .less 文件中的代码:
.alert-info,
.widget {
display: block;
}
.alert:extend(.alert-info, .widget) {}
// .css 文件中对应的 css 代码:
.alert-info,
.widget,
.alert,
.alert {
display: block;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
extend 的用例
经典用例:该用例是为了避免基类,eg、想要一个动物的子类型来替代背景,那么直接引用".bear"这个类就好了
less
// .less 文件中的代码:
.animal {
background-color: black;
color: white;
}
.bear {
&:extend(.animal);
background-color: brown;
}
.css 文件中对应的代码:
.animal,
.bear {
background-color: black;
color: white;
}
.bear {
background-color: brown;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
减少 css 大小:mixins 将所有的属性复制到选择器中,这可能导致不必要的重复。因此,可以使用 extend 来将选择器上移到要使用的属性,这可以减少 css 的次数 不带有扩展的
less
// .less 文件中的代码:
//Reducing CSS Size
// 使用扩展来将选择器上移到要使用的属性,从而减少生成的 CSS
.my-inline-block() {
display: inline-block;
font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
}
.thing1 {
.my-inline-block;
}
.thing2 {
.my-inline-block;
}
// .css 文件中的所对应的 css 代码:
.thing1 {
display: inline-block;
font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
}
.thing2 {
display: inline-block;
font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
带有扩展的
less
// .less 文件中的代码:
.my-inline-block {
display: inline-block;
font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
}
.thing3 {
&:extend(.my-inline-block);
}
.thing4 {
&:extend(.my-inline-block);
}
// .css 文件中对应的 css 代码:
.my-inline-block,
.thing3,
.thing4 {
display: inline-block;
font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
组合样式 / 更高级的 mixin: 如果有两个不同的 html 模块,但需要对两者应用相同的样式,则可以使用 extend 来关联两个区域
less
// .less 文件中的代码:
// 如果有两个不同的 html 块,但需要对两者应用相同的样式,则可以使用扩展来关联两个区域
li.list > a {
top: 12px;
}
button.list-style {
&:extend(li.list > a); // use the same list styles
}
// .css 文件中对应的 css 代码:
li.list > a,
button.list-style {
top: 12px;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Mixins 的用法
Mixins 类似于编程语言中的函数。Mixins 是一组 css 属性,可以将一个类的属性用于另一个类,并且包含类名作为其属性。在 less 中,可以使用类选择器或者 id 选择器以与 css 样式相同的方式声明 mixin.mixin 可以存储多个值,并且可以在必要的时候在代码中重复使用
在 mixin 中使用类选择器和 id 选择器
less
// .less文件中的代码:
.a, #b {
color: red;
}
.mixin-a {
.a();//括号是可选的
}
.mixin-b {
#b(); //括号是可选的
}
// .css文件中对应的css代码:
.a,
#b {
color: red;
}
.mixin-a {
color: red;
}
.mixin-b {
color: red;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
不在 css 中输出 mixin
当你要创建一个 mixin, 但是你又不希望 mixin 出现在 css 文件中,可以在 mixin 后面加个括号
less
// .less 文件中的代码:
// 不输出 mixin
.mixin-one {
font-size: 15px;
}
.mixin-two() {
font-weight: 700;
}
#one-two {
.mixin-one();
.mixin-two();
}
// .css 文件中对应的 css 代码:
.mixin-one {
font-size: 15px;
}
#one-two {
font-size: 15px;
font-weight: 700;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
mixin 中的选择器
mixin 中不仅可以包含属性,还可以包含选择器
less
// .less 文件中的代码:
// mixin 中的选择器
.mixin-three() {
&:hover {
border: 1px solid red;
}
}
#button {
.mixin-three();
}
// .css 文件中对应的 css 代码:
#button:hover {
border: 1px solid red;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mixin 命名空间
命名空间用于在通用名称下对 mixin 进行分组。使用命名空间可以避免名称冲突,并从外部封装 mixin
less
// .less 文件中的代码
// 命名空间
#mixin-four() {
.mixin-four-one() {
color: lightsalmon;
}
}
#light {
#mixin-four > .mixin-four-one;// 命名空间不可以带有括号
// #mixin-four .mixin-four-one;
// #mixin-four.mixin-four-one;
}
// 注:引用时两个 mixin 之间的空格和 ">"都是可选的,看个人习惯写法
// .css 文件中对应的 css 代码:
#light {
color: lightsalmon;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
受保护的命名空间
当 guard 应用于命名空间时,只有在 guard 条件返回 true 时才使用由命名空间定义的 mixin, 受保护的命名空间的评估方式与 mixin 的 guard 方式完全相同
less
// .less 文件中的代码:
// 受保护的命名空间
#namespace() when (@color=green) {
margin: 10px;
}
#namespace-one {
.mixin-namespace when (@color=green){
padding: 10px;;
}
}
@color: green;
// .css 文件中的代码:
#namespace {
margin: 10px;
}
#namespace-one .mixin-namespace {
padding: 10px;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
!important 关键字
!important 关键字用于覆盖特定属性,当它在 mixin 调用之后放置时,它会将所有继承的属性标记为!important .less 文件中的代码:
less
// !important 关键字
.mixin-five() {
color: lightseagreen;
margin: auto;
}
#unimportant {
.mixin-five();
}
#important {
.mixin-five()!important;
}
// .css 文件中对应的 css 代码:
#unimportant {
color: lightseagreen;
margin: auto;
}
#important {
color: lightseagreen !important;
margin: auto !important;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mixin 参数
mixin 可以接受参数,参数是 mixin 传递到选择器的变量。mixin 可以使用一个或者多个参数,通过参数和属性来扩展 less 的功能,以便在调用 mixin 时自定义 mixin 的输出
less
// mixin 中的参数
// .less 文件中的代码
.mixin-six(@color) {
border-color: @color;
}
.mixin-six-one(@font-weight: 700){ //mixin 可以具有参数的默认值
font-weight: @font-weight;
}
#six {
.mixin-six(skyblue);
.mixin-six-one();
}
// .css 文件中的 css 代码:
#six {
border-color: skyblue;
font-weight: 700;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
具有多个参数的 mixins
参数可以使用逗号或者分号分隔。使用逗号符号,可以将其解释为 mixin 参数分隔或者 css 列表分隔符。如果在 mixin 中使用了分号,那么分号则是参数分隔符,逗号则是 css 列表分隔符。注:当你使用了逗号作为 mixin 的分隔符时,则不可能创建以逗号分隔的列表作为参数,同时,如果在 mixin 调用或者声明中看到至少一个分号,则参数使用分号分隔,所有逗号都属于 css 列表 1)、两个参数:每一个包含逗号分隔的列表:.name(1,2,3;str1,str2); 2)、三个参数,并且每个包含一个数字:.name(1,2,3); 3)、使用分号创建 mixin 调用一个包含逗号分隔的 css 列表参数:.name(1,2,3;); 4)、逗号分隔的默认值:.name(@param1:red, blue;);
less
.less 文件中的代码:
// 多个参数的 mixin
.mixin-seven(@padding, @font) {
padding: @padding;
font: @font;
}
#mixin-seven-one {
.mixin-seven(10px, 20px);// 使用逗号作为 mixin 参数的分隔符
}
#mixin-seven-two {
.mixin-seven(10px,20px; 10px,green);// 使用分号作为 mixin 参数的分隔符
}
// .css 文件中的代码:
#mixin-seven-one {
padding: 10px;
font: 20px;
}
#mixin-seven-two {
padding: 10px, 20px;
font: 10px, green;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
可以定义具有相同名称和数量参数的 mixin,如果使用相同的 mixin 与一个相同参数,那么这个参数的属性将会传入到所有 mixin 中
less
// .less 文件中的代码:
.mixin-eight(@color) {
color-1: @color;
}
.mixin-eight (@color; @padding:2px) {
color-2: @color;
padding-2: @padding;
}
.mixin-eight (@color; @padding; @float:left) {
color-3: @color;
padding-3: @padding;
float: @float;
}
#mixin-eight {
.mixin-eight(green); //mixin 名字和参数相同,则会被传入到相同的 mixin 中
}
#mixin-eight-one {
.mixin-eight(red; 10px);
}
// .css 文件中对应的 css 代码:
#mixin-eight {
color-1: green;
color-2: green;
padding-2: 2px;
}
#mixin-eight-one {
color-2: red;
padding-2: 10px;
color-3: red;
padding-3: 10px;
float: left;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
命名参数
mixin 可以通过使用它们的名称提供参数而不是位置。参数没有放置值的任何顺序,它们可以通过名称引用,并切可以不必采用任何特殊顺序
less
// .less 文件中的代码:
// 命名参数
.mixin-nine (@color; @border; @margin) {
border-color: @color;
border: @border;
margin: @margin;
}
#mixin-nine-one {
.mixin-nine(@color:red; @margin: 10px; @border: 1px );
}
#mixin-nine-two {
.mixin-nine(#645574, @border: 2px, 20px);
}
// .css 文件中对应的 css 代码:
#mixin-nine-one {
border-color: red;
border: 1px;
margin: 10px;
}
#mixin-nine-two {
border-color: #645574;
border: 2px;
margin: 20px;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@arguments variable
@arguments 在 mixin 内部有特殊含义,当调用 mixin 时,@arguments 包括所有传递的参数。当不想使用单个参数时,@argument 参数将很有用
less
// .less 文件中的代码:
// @arguments 变量
.mixin-ten (@x; @y; @size; @color) {
box-shadow: @arguments;
}
#mixin-ten {
.mixin-ten(5px, 5px, 2px, red);
}
// .css 文件中对应的 css 代码:
#mixin-ten {
box-shadow: 5px 5px 2px red;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
十一、高级参数和 @rest variable mixin 通过使用…提供可变数量的参数,可以通过在变量名称后面放置…为变量赋值参数
less
// .less 文件中的代码:
// 高级参数和 @rest 变量
.mixin-eleven (@color; @rest...) {
color: @color;
margin: @rest;
padding: @rest;
}
#mixin-eleven {
.mixin-eleven(red;10px;20px);
}
// .css 文件中的代码:
#mixin-eleven {
color: red;
margin: 10px 20px;
padding: 10px 20px;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
模式匹配
可以通过向其传递参数来更改 mixin 的行为
less
// .less 文件中的代码:
// 模式匹配
.mixin-twelve (dark; @color: red) {
color: @color;
}
.mixin-twelve(light, @color: lightpink) {
color: @color;
}
.mixin-twelve(@_) {
display: inline;
}
#mixin-twelve {
.mixin-twelve(@select);
}
@select: light;
// .css 文件中的代码:
#mixin-twelve {
color: lightpink;
display: inline;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
如果 @select 的值为 dark, 则它会以 red 这个颜色显示结果,因为 mixin 定义与 dark 作为第一个参数匹配
第一个 mixin 定义不匹配,因为它应 dark 作为第一个参数。 第二个 mixin 定义匹配,因为它符合预期 light。 第三个 mixin 定义匹配,因为它期望任何值。
使用 mixin 作为函数
mixin 和函数的工作方式非常相似。类似于函数,mixins 可以嵌套,可以接受参数和返回值
less
// .less 文件中的代码:
//mixin 函数
.mixin-function(@x, @y) {
@average: (@x+@y)/2;
}
#mixin-function {
margin: .mixin-function(48, 12)[@average];
//.mixin-function(48, 12)[@average] 是一个返回值,要赋给对应的属性
}
// .css 文件中对应的 css 代码:
#mixin-function {
margin: 30;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
覆盖混合值:如果有多个匹配的 mixin,则将评估所有 mixin,并返回带有该标识符的最后一个匹配值,这类似于 css 中的层叠,它允许“覆盖”mixin 值
less
// .less 文件中的代码:
// 覆盖 mixin 值
.cover() {
.my() {
prop: left;
}
}
.cover() {
.my() {
prop: right;
}
}
#cover {
float: .cover.my()[prop];
}
// .css 文件中的 css 代码:
#cover {
float: right;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
未命名的查询:如果在调用 mixin 时没有指定查找的 [@lookup],而是直接在 mixin 或规则集调用之后写入 [], 则所有值将级联,最后一个声明的值将被选择
less
// .less 文件中的代码:
// 未命名的查询
.mixin-lookup(@x; @y) {
@add: @x + @y;
@multiply: @x * @y;
}
@lookup : { // 对于 mixin 调用规则集或者变量中,同样适用
@num1: 10px;
@num2: 20px;
}
#mixin-lookup {
margin: .mixin-lookup(5px; 10px)[]; // 不指定变量名,则匹配最后一个变量
padding: @lookup[];
}
// .css 文件中的 css 代码:
#mixin-lookup {
margin: 50px;
padding: 20px;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
将 mixin 和变量解锁到调用者作用域中:由变量和 mixin 组成的 mixin 可以在调用者的作用域中使用,并且是可见的。但是有一个例外,如果调用者包含具有相同名称的变量,那么该变量不会复制到调用者的作用域中。只有调用者范围内的变量被保护,并且继承的变量将被覆盖
less
// .less 文件中的代码:
// 在调用者作用域中直接定义的变量不能被覆盖。但是,在调用者父作用域中定义的变量不受保护,将被覆盖
.mixin() {
@size: in-mixin;
@definedOnlyInMixin: in-mixin;
}
.class {
@definedOnlyInMixin: globaly-defined-value;
margin: @size @definedOnlyInMixin; //@definedOnlyInMixin 被保护,继承的变量将会被覆盖
.mixin();
}
@size: globaly-defined-value;
.css 文件中的代码:
.class {
margin: in-mixin globaly-defined-value;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
每当一个 mixin 定义在另一个 mixin 中时,它也可以用作返回值
less
// .less 文件中的代码:
// 在 mixin 中定义的 mixin 充当返回值
.mixin-nine(@val) {
.mixin-nine1() {
declaration: @val;
}
}
#nine {
.mixin-nine(5);
.mixin-nine1();
}
// .css 文件中的 css 代码:
#nine {
declaration: 5;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
递归 mixins
在 less 中,mixin 可以与 Guard 表达式和模式匹配结合使用,可用于创建各种迭代或者循环结构
less
// .less 文件中的代码:
.for(@count) when (@count>0) {
.for(@count - 1);
height: @count * 10px;
}
#height {
.for(3);
}
// .css 文件中的 css 代码:
#height {
height: 10px;
height: 20px;
height: 30px;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
使用递归循环生成 css 网格类:
less
.less 文件中的代码:
.grid(@n, @i:1) when (@i <= @n) {
# column-@{i} {
height: @i * 100% / @n;
}
.grid(@n, @i+1);
}
.grid(5);
// .css 文件中的代码:
#column-1 {
height: 20%;
}
#column-2 {
height: 40%;
}
#column-3 {
height: 60%;
}
#column-4 {
height: 80%;
}
#column-5 {
height: 100%;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Mixin Guards
如果你想在表达式上匹配简单的值或者参数数量,可以使用 Guards。它与 mixin 声明相关联,并包括附加到 mixin 的条件。每个 mixin 将有一个或多个由逗号分隔的防护,并且 guard 必须包含在括号中。Less 使用 Guard 的 mixins 而不是 if/else 语句,并执行计算以指定匹配的 mixin,这与 @media 查询功能规范类似
less
// .less 文件中的代码:
// mixins 守卫
.mixin-ten(@z) when (lightness(@z)>50%) {
background-color: black;
}
.mixin-ten(@z) when (lightness(@z)<50%) {
background-color: white;
}
.mixin-ten(@z) when (@z=@z) {
color: @z;
}
.myClass-one {
.mixin-ten(red);
}
.myClass-two {
.mixin-ten(skyblue);
}
.css 文件中的 css 代码:
.myClass-one {
color: red;
}
.myClass-two {
background-color: black;
color: skyblue;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Guard 比较运算符:less 包含五个 guard 比较运算符:< , > , <= , >= 和 =。可以使用比较运算符(=) 来比较数字,字符串,标识符等,而剩余的运算符只能与数字一起使用
less
// .less 文件中的代码:
.max(@num1, @num2) when (@num1 > @num2) {
height: @num1;
}
.max(@num1, @num2) when (@num1 <@num2) {
height: @num2;
}
#max {
.max(5px, 10px);
}
// .css 文件中的 css 代码:
#max {
height: 10px;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Guard 逻辑运算符:可以使用关键字来解决 Guard 逻辑运算符。可以使用和关键字组合使用保护条件,并且可以使用 not 关键字取消条件
less
// .less 文件中的代码:
//Guard 逻辑运算符
.logic(@value) when (isnumber(@value)) and (@value>10) { // 使用 and 来组合 Guard
padding: @value;
}
#logic {
.logic(11px);
}
.logic-one(@value1) when (@value1<5) , (@value1>10) { // 逗号模仿 or 运算符
padding: @value1;
}
#logic-one {
.logic-one(-5px);
}
.logic-two(@value2) when not (@value2>0) { //not 关键字否定条件
padding: @value2;
}
#logic-two {
.logic-two(-10px);
}
// .css 文件中的 css 代码:
#logic {
padding: 11px;
}
#logic-one {
padding: -5px;
}
#logic-two {
padding: -10px;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
类型检查函数:可以使用类型检查内置函数来确定匹配 mixins 的值类型。可以使用 is 函数,包括以下功能: iscolor isnumber isstring iskeyword isurl 如果要检查是否为数字并且是否使用特定单位,可以使用以下方法: ispixel ispercentage isem isunit
less
// .less 文件中的代码:
// 类型检查函数
.cheat(@number; @color) when (isnumber(@number)) {
font-size: @number;
color: @color;
}
#cheat {
.cheat(13px, green);
}
.css 文件中的 css 代码:
#cheat {
font-size: 13px;
color: green;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Aliasing Mixins
将 mixin 调用分配给变量,即称为变量调用,也可以将其用于映射查找
less
.less 文件中的代码:
//Aliasing Mixins 将 mixinx 分配给变量称为变量调用
#large.dark.light {
.colors(dark) {
primary: skyblue;
secondary: lightgray;
}
.colors(light) {
primary: purple;
secondary: pink;
}
}
#large {
@color1: #large.dark.light.colors(light);
@color2: #large.dark.light.colors(dark);
color: @color1[secondary];
background-color: @color2[primary];
}
// .css 文件中的 css 代码:
#large {
color: pink;
background-color: skyblue;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Variable calls: 整个 mixin 可以被赋予别名,然后作为变量调用 .less 文件中的代码:
//Variable calls 整个 mixins 可以被赋予别名并作为变量调用
less
#call {
.mixin() {
font-size: 15px;
}
}
#alias {
@alias: #call.mixin();
@alias();
}
// .css 文件中的 css 代码:
#alias {
font-size: 15px;
}
mixin 赋予别名并作为选择器调用
// .less 文件中的代码:
```less
# alias-one {
@alias-one: #call.mixin;
@{alias-one} {
float: left;
}
}
// .css 文件中的 css 代码:
# alias-one #call.mixin {
float: left;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Detached Rulesets的用法
Detached Rulesets包含一个普通的规则集,例如属性、嵌套规则集、变量声明、媒体声明、mixins等。它存储在一个变量中,并包含在其他结构中,其中规则集的所有属性都将被复制到该结构。可以用作mixin参数,将其作为变量进行传递
Detached Rulesets的正常用法
.less文件中的代码:
less
//Detached Ruleset 将规则集分配给变量
@detached: {
border: 1px solid green;
@color: red;
};
# detached {
@detached(); // 必须带有括号,@detached 无效
color: @detached[@color]; // 后面带有查找值时,可以不需要括号
}
// Detached Rulesets 调用时的括号是强制性的(除非后面带有查找值),直接使用 @detached;是无效的
// .css 文件中的 css 代码:
# detached {
border: 1px solid green;
color: red;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
在@media查询中封装代码
当想要定义一个mixin时,它可以在媒体查询或者非支持的浏览器类名中封装一段代码。规则集可以传递给mixin,以便mixin可以包装内容
less
.desktop-and-old-ie(@rules) {
@media screen and (min-width: 1200px) {
@rules();
}
html.lt-ie9 & {
@rules();
}
} //.desktop-and-old-ie 定义了媒体查询和根类
# header {
background-color: blue;
.desktop-and-old-ie({
background-color: red;
});
}
// .css 文件中的 css 代码:
# header {
background-color: blue;
}
@media screen and (min-width: 1200px) {
# header {
background-color: red;
}
}
html.lt-ie9 #header {
background-color: red;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
将规则集分配给变量或传递给mixin
less
.less 文件中的代码:
// 将规则集传递给 mixin
@my-ruleset: {
// 加了括号则不会在 css 文件中出现,没有加括号将会在 css 文件中出现,和 mixin 规则一样
.my-selector() {
background-color: black;
}
@color: skyblue;// 将规则集分配给变量
};
# my-ruleset {
@my-ruleset();
.my-selector();
color: @my-ruleset[@color];
}
// .css 文件中的 css 代码:
# my-ruleset {
background-color: black;
color: skyblue;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@media查询冒泡
less
// .less 文件中的代码:
// 使用媒体查询起泡
@float: {
.float-l {
@media x {
@media z {
float: left;
}
}
}
}
@media y {
@float();
}
// .css 文件中的 css 代码:
@media y and x and z {
.float-l {
float: left;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
私有变量,不可以直接调用
less
.less 文件中的代码:
// 私有变量,是访问不到 @color 这个变量的
@private1: {
@color: skyblue;
}
# private1 {
// @private();
// color: @color; 直接调用规则集中的变量无效
color: @private1[@color];
}
.css 文件中的 css 代码:
# private1 {
color: skyblue;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Scoping
一个分离的规则集可以使用变量和mixin,在定义和调用方作用域都可以访问。否则,定义和调用方作用域对它都是可用的。如果两个作用域包含相同的变量或mixin函数,则声明范围值优先 声明范围: 声明范围是定义分离的规则集主体的范围。将分离的规则集从一个变量复制到另一个变量不能修改其作用域。规则集不能仅仅通过在那里被引用而获得对新作用域的访问权,分离的规则集可以通过被解锁(导入)到范围中来获得对范围的访问权 注:不赞成通过调用mixin将变量解锁到作用域中,应该使用属性或者变量访问器
less
// 分离的规则可以看到调用方的变量和 mixin
@private: {
color: @color;
.my-mixin();
};
# private {
@private();
@color: red;
.my-mixin() {
font-family: monospace;
}
}
// .css 文件中的 css 代码:
# private {
color: red;
font-family: monospace;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
调用方中的可访问的变量和mixin将会覆盖在定义中的 (官方文档有误)
less
// 调用方中的变量会覆盖在定义中可访问的变量和 mixin
// 官方文档错误
@value: left;
@excel: {
float: @value;
}
# excel {
@excel();
@value: right;
}
// .css 文件中的 css 代码:
# excel {
float: right;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
引用将会修改分离的规则集范围
通过给出引用,规则集是会访问到新的范围 (官方文档有误) .less文件中的代码:
less
// 规则集可以在其中引用而获得对新作用域的访问
@detached-1: { scope-detached: @one @two; };
.one {
@one: bottom;
.two {
@detached-2: @detached-1; // copying/renaming ruleset
@two: top; // ruleset can not see this variable
}
}
.use-place {
// .one > .two();
// .one();
// .two();
.one .two();
@detached-2();
}
.css 文件中的 css 代码:
.use-place {
scope-detached: bottom top;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
.less 文件中的代码:
less
.cheat {
.exam {
@cheat: {
position: @rela;
};
}
}
# cheat {
@rela: relative;
.cheat .exam;
@cheat();
}
.css 文件中的 css 代码:
# cheat {
position: relative;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
解锁将修改分离的规则集范围 (个人觉得其实引用可以修改范围的话,这个可以不看)
less
// 解锁将修改分离的规则集范围
# space {
.importer-1() {
@detached: { scope-detached: @variable1; }; // define detached ruleset
}
}
.importer-2() {
@variable1: value; // unlocked detached ruleset CAN see this variable
# space > .importer-1(); // unlock/import detached ruleset
}
.use-place {
.importer-2(); // unlock/import detached ruleset second time
@detached();
}
// .css 文件钟的 css 代码:
.use-place {
scope-detached: value;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
属性 / 变量访问器
可以使用属性 / 变量访问器(查找)从变量(分离的)规则集中选择一个值 .less 文件中的代码:
less
// 属性 / 变量访问器
// 可以使用属性或者变量访问器来从分离的规则集中选择一个值
@config: {
bool1: true;
bool2: false;
}
.mixin-one() when (@config[bool1] = true) {
padding: 10px;
}
# mixin-one {
.mixin-one();
}
// .css 文件中的 css 代码:
# mixin-one {
padding: 10px;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
如果从查找返回的是另一个分离的规则集,则可以使用第二个查找来获取该值
less
.less 文件中的代码:
// 如果返回的是另一个分离的规则集,可以使用两个查找来获取该值
@config1: {
@colors: {
primary: blue;
}
}
.box {
color: @config1[@colors](primary);
}
// .css 文件中的代码:
.box {
color: blue;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
查找变量中的变量
返回的查找值本身是可变的 .less 文件中的代码:
// 返回的查找值本身是可以变化的,可以通过定义一个变量来控制返回的查找值
less
@config2: {
@dark: {
color: red;
}
@light: {
color: green;
}
}
# light {
@look: light;
color: @config2[@@look](color);
}
// .css 文件钟的 css 代码:
# light {
color: green;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22