less使用mixin的小技巧

less是一种css的扩展,可以编译成css。将它定位为”工具”即可,最终 浏览器/app 识别的还是css

参考网站:

css3中calc在less编译时被计算的解决办法

目标:

1
2
3
width: -moz-calc(100% - 10px);
width: -webkit-calc(100% - 10px);
width: calc(100% - 10px);

错误less:

1
2
3
4
5
6
7
8
9
10
//less的mixin
.calcWidth(@width){
width:-moz-calc(@width);
width:-webkit-calc(@width);
width:calc(@width);
}
//使用
div{
.calcWidth(100% - 10px);
}

错误结果:

1
2
3
width: -moz-calc(90%);
width: -webkit-calc(90%);
width: calc(90%);

原因:less把这个当成运算式去执行了
正确less:

1
2
3
4
5
6
7
8
9
10
11
//less的mixin
.calcWidth(@width){
width:-moz-calc(@width);
width:-webkit-calc(@width);
width:calc(@width);
}
//使用
div{
.calcWidth(~"100% - 10px");
//~是less内置的转义函数,就是以前的e函数,语法:~"value"
}

结果就是目标,验证通过

less写一个可复用的帧动画类型的 函数

目标:

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
div {
animation: blink 1.8s infinite;
-webkit-animation: blink 1.8s infinite;
-moz-animation: blink 1.8s infinite;
-o-animation: blink 1.8s infinite;
}
//定义的动画还有-webkit-、-moz-、-o-、-ms-,此处为了省篇幅没有加
@keyframes blink {
0% {
opacity: 0;
}
10% {
opacity: 0.1;
}
20% {
opacity: 0.2;
}
30% {
opacity: 0.3;
}
40% {
opacity: 0.4;
}
50% {
opacity: 0.5;
}
60% {
opacity: 0.6;
}
70% {
opacity: 0.7;
}
80% {
opacity: 0.8;
}
90% {
opacity: 0.9;
}
100% {
opacity: 1;
}
}

方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//mixin开始
.animation(...){
animation: @arguments;
-webkit-animation: @arguments;
-moz-animation: @arguments;
-o-animation: @arguments;
}
.opacityLoop(@count) when (@count<=1){
//percentage是less的内置函数,作用:将浮点数转换为百分比字符串
@keysname:percentage(@count);
/*注意:less不能直接在属性名上调用内置函数*/
@{keysname} {
opacity: @count;
}
.opacityLoop((@count+0.1));
}
//mixin结束
div {
.animation(blink 1.8s infinite);
}
@-webkit-keyframes blink {.opacityLoop(0);}
@-moz-keyframes blink {.opacityLoop(0);}
@-o-keyframes blink {.opacityLoop(0);}
@keyframes blink {.opacityLoop(0);}

经过验证,结果正确。
其实,上述的代码是否看起来还有点累赘,@keyframes的定义没有用mixin,但是less没办法做到,而sass可以像下面这样写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//支持多属性的0%和100%
@mixin keyframes($name,$props,$starts,$ends){
@-webkit-keyframes #{$name} {@include frames($props,$starts,$ends);}
@-moz-keyframes #{$name} {@include frames($props,$starts,$ends);}
@-o-keyframes #{$name} {@include frames($props,$starts,$ends);}
@keyframes #{$name} {@include frames($props,$starts,$ends);}
}
@mixin frames($props,$starts,$ends){
$length:length($props);
0% {
@for $i from 1 through $length{
$prop:nth($props,$i);
#{$prop}:nth($starts,$i);
}
}
100%{
@for $j from 1 through $length{
$prop:nth($props,$j);
#{$prop}:nth($ends,$j);
}
}
}
//外部直接调用
@include keyframes(blink,background-color border-width,#f00 1px,#0f0 5px);

import导入的路径问题

我们通常会将公共的颜色和mixin提取出来,放在一个文件里。那么如何引入此文件呢?
默认:当前路径

1
@import (keyword) "filename";

现在,我有一个demo1.less需要引用base.less,他们的路径如图:
引用base.less
使用相对路径:

1
@import (keyword) "../../../furnace/less/base.less";

使用绝对路径:

1
@import (keyword) "WebRoot\furnace\less\base.less";

ps:还可以直接从你的 node_modules 文件夹中加载 LESS 文件。

结语:不论是less还是sass,都只是个工具,不应该在这上面花费大量的精力来玩花它。附一张百度找的less的思维导图,如下:
less思维导图
话说这思维导图不全,以后有时间自己做个。所谓的有时间,大概又是了了无期…

堂 wechat
欢迎关注我的微信公众号,里面有各种小故事哦!
坚持原创技术分享,您的支持将鼓励我继续创作!