Less不可小觑
写在前面
CSS的短板
在语法更新时,每当新属性提出,浏览器的兼容问题就会成为一大烦恼。
Less的诞生
Less属于预编译脚本,一起被熟知的还有与Sass、Stylus。
Less 诞生于 2009 年,受Sass的影响创建的一个开源项目。 它扩充了 CSS 语言,增加了诸如变量、混合(mixin)、函数等功能,让 CSS 更易维护、方便制作主题、扩充。
直接开干
变量
> 值变量
/* Less */
@color: #000;
#wrap {
color: @color;
}
/* 生成后的 CSS */
#wrap {
color: #000;
}
说明
以 @ 开头 定义变量,使用时 直接 键入 @名称。
在平时工作中,我们就可以把 常用的变量 封装到一个文件中,这样利于代码组织维护。
> 选择器变量
/* Less */
@mySelector: #wrap;
@Wrap: wrap;
@{mySelector} { // 变量名 必须使用大括号包裹
color: #999;
width: 50%;
}
#@{Wrap} {
color: #666;
}
/* 生成的 CSS */
#wrap {
color: #999;
width: 50%;
}
#wrap {
color: #666;
}
> 属性变量
/* Less */
@borderStyle: border-style;
@Soild: solid;
#wrap {
@{borderStyle}: @Soild;
}
/* 生成的 CSS */
#wrap {
border-style: solid;
}
> url 变量
/* Less */
@images: "xxx/xxx/img"; // 需加引号
body {
background: url("@{images}/dog.png");
}
/* 生成的 CSS */
body {
background: url("../img/dog.png");
}
> 声明变量
/* Less */
@background: {
background: red;
};
@Rules: {
width: 200px;
height: 200px;
border: solid 1px red;
};
#main {
@Rules();
@background();
}
/* 生成的 CSS */
#main {
width: 200px;
height: 200px;
border: solid 1px red;
background: red;
}
说明
将可复用的样式最小单元化、模块化,减少代码量。
> 变量运算
/* Less */
@width: 300px;
@color: #222;
#wrap {
width: @width-20;
height: @width-20 * 5;
color: @color * 2;
}
/* 生成的 CSS */
#wrap {
width: 280px;
height: 200px;
color: #444;
}
说明
- 加减法时,以第一个变量为基准;
- 乘除法时,单位要统一。
> 变量作用域
/* Less */
@var: @a;
@a: 100%;
#wrap {
width: @var;
@a: 9%;
}
/* 生成的 CSS */
#wrap {
width: 9%;
}
说明
由于less的就近原则,@a 被新的覆盖了。
> 用变量去定义变量
/* Less */
@text: "I am fnord.";
@var: "text";
#wrap {
&:after {
content: @@var;
}
/* 生成的 CSS */
#wrap::after {
content: "I am fnord.";
}
说明
由于 @var 的变量值与 @text重名,@var 等同于 @text
嵌套
> &符
/* Less */ #header { font-weight: bold; &_content { margin: 20px; } }
/* 生成的 CSS */ #header { font-weight: bold; }
#header_content { margin: 20px; }
> 设置默认参数
/* Less */
.border(@a: 10px, @b: 50px, @c: 30px, @color: #000) {
border: solid 1px @color;
box-shadow: @arguments; // 指代的是 全部参数
}
#main {
.border(0px, 5px, 30px, red);
}
#content {
.border; // 等价于 .border()
}
/* 生成的 CSS */
#main {
border: solid 1px red;
box-shadow: 0px,5px,30px,red;
}
#wrap {
border: solid 1px #000;
box-shadow: 0px 50px 30px #000;
}
#content {
border: solid 1px #000;
box-shadow: 10px 50px 30px #000;
}
说明
- Less 可以使用默认参数,如果 没有传参数,那么将使用默认参数。
- @arguments 犹如 JS 中的 arguments 指代的是 全部参数。
- 传的参数中 必须带着单位。
方法的匹配模式
/* Less */
.borderStyle(left, @width: 20px, @color: #000) {
border-color: transparent transparent transparent @color;
}
.borderStyle(@_, @width: 20px, @color: #000) {
border-style: solid;
border-width: @width;
}
#main {
.borderStyle(left, 50px, #999);
}
/* 生成的 CSS */
#main {
border-color: transparent transparent transparent #999;
border-style: solid;
border-width: 50px;
}
说明
与 面向对象中的 多态 很相似。
第一个参数 left 要会找到方法中匹配程度最高的,如果匹配程度相同,将全部选择,并存在着样式覆盖替换。
运算符
/* Less */ #card { /* and 运算符 ,相当于 &&,必须条件全部符合才会执行 */ .border(@width, @color, @style) when (@width > 100px) and(@color = #999) { border: @style @color @width; }
/* not 运算符,相当于 非运算 !,条件为 不符合才会执行 */ .background(@color) when not (@color >= #222) { background: @color; }
/* , 逗号分隔符:相当于 或运算 ||,只要有一个符合条件就会执行 */ .font(@size: 20px) when (@size > 50px), (@size < 100px) { font-size: @size; } }
#main { #card > .border(200px, #999, solid); #card .background(#111); #card > .font(40px); }
/* 生成后的 CSS */ #main { border: solid #999 200px; background: #111; font-size: 40px; }
/* Less */
.boxShadow(...) {
box-shadow: @arguments;
}
.textShadow(@a, ...) {
text-shadow: @arguments;
}
#main {
.boxShadow(1px, 4px, 30px, red);
.textShadow(1px, 4px, 30px, red);
}
/* 生成后的 CSS */
#main {
box-shadow: 1px 4px 30px red;
text-shadow: 1px 4px 30px red;
}
说明
对于数量不定的参数:
如果希望方法接受数量不定的参数,可以使用... ,犹如 ES6 的扩展运算符。
方法使用important!
/* Less */
.border {
border: solid 1px red;
}
#main {
.border() !important;
}
/* 生成后的 CSS */
#main {
border: solid 1px red !important;
}
循环方法
/* Less */ .style-columns(2); .style-columns(@n, @i: 1) when (@i =< @n) { .column-@{i} { width: (@i * 100% / @n); } .style-columns(@n, (@i + 1)); } /* 生成后的 CSS */ .column-1 { width: 25%; } .column-2 { width: 50%; }
@color: {
activity: #ed7f8b;
seminars: @theme-color;
course: #ffa757;
};
/** 遍历变量 @color */
each(@color, {
.@{key} {
.tag-wrap {
color: @value;
}
.content-wrap {
&:before {
/** @{key} 需加花括号 */
background: url('@assets/image/teaching-calendar/card-bg-@{key}@2x.png');
}
}
}
});
说明
对于循环,也可以用 each 去遍历,使用@key、@value时,记得有时需要加花括号。
写在结尾
less的方法还有很多,属性拼接、继承等等,可以带来很便捷的样式交互开发,时间有限,暂举例这么多,一起探索吧
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通