Less 和 Sass 都是流行的 CSS 预处理器,它们各自有不同的优点。
相对于 Sass,Less 有以下几个优点:
extend
来复用样式,相对比较直接。@include
或 @extend
等复杂语法。直接使用 .
前缀的 Mixins 可以让代码更简洁。当然,选择 Less 或 Sass 最终还是取决于你的具体需求和个人喜好。
Sass 也有它独特的优势,比如更多的功能、更强大的模块化系统和更广泛的社区支持。
对于我来说
两者都满足开发需求,Less使用起来更便捷,我选择Less。 另外iView和Ant Design Vue也都是使用的Less。 Element Plus使用的是Sass。 uni-app使用的是Sass。
测试的时候可以使用VSCode安装一个Easy LESS插件
只要我们的Less文件保存就会在同一目录生成对应的css文件,不用的时候禁用就行。
导入
@import "blue-theme.less";
@nav-color: #F90;
nav {
@width: 100px;
width: @width;
color: @nav-color;
}
编译后
nav {
width: 100px;
color: #F90;
}
示例1
// Variables
@themes: "../../src/themes";
// Usage
@import "@{themes}/tidal-wave.less";
示例2
// Variables
@images: "../img";
// Usage
body {
color: #444;
background: url("@{images}/white-sand.png");
}
#content {
article {
h1 { color: #333 }
p { margin-bottom: 1.4em }
}
aside { background-color: #EEE }
}
编译后
#content article h1 {
color: #333;
}
#content article p {
margin-bottom: 1.4em;
}
#content aside {
background-color: #EEE;
}
父选择器的标识符&
article a {
color: blue;
&:hover { color: red }
}
编译后
article a {
color: blue;
}
article a:hover {
color: red;
}
示例1
.base {
color: red;
font-size: 14px;
}
.button {
.base();
padding: 10px;
}
编译后
.base {
color: red;
font-size: 14px;
}
.button {
color: red;
font-size: 14px;
padding: 10px;
}
无参 mixin 的样式括号可以省略。
.base {
color: red;
font-size: 14px;
}
.button {
.base; // 无需使用圆括号
padding: 10px;
}
如果混合器不输出到CSS中
.base() {
color: red;
font-size: 14px;
}
.button {
.base; // 无需使用圆括号
padding: 10px;
}
基本
.border-radius(@radius) {
-webkit-border-radius: @radius;
-moz-border-radius: @radius;
border-radius: @radius;
}
.button {
.border-radius(6px);
}
默认值
.border-radius(@radius: 5px) {
-webkit-border-radius: @radius;
-moz-border-radius: @radius;
border-radius: @radius;
}
.button {
.border-radius();
}
当然也可以省去括号
.border-radius(@radius: 5px) {
-webkit-border-radius: @radius;
-moz-border-radius: @radius;
border-radius: @radius;
}
.button {
.border-radius;
}
.mixin(@color) {
color: @color;
}
.mixin(@color, @padding: 2) {
background-color: @color;
padding: @padding;
}
.mixin(@color, @padding, @margin: 2) {
color: @color;
padding: @padding;
margin: @margin @margin @margin @margin;
}
.some .selector div {
.mixin(#008000);
}
结果
.some .selector div {
color: #008000;
background-color: #008000;
padding: 2;
}
多个满足条件会取后者。
使用&:extend(选择器)
进行样式继承。
相比于混合器,继承生成的CSS会更小。
.z_base {
color: red;
font-size: 14px;
}
.z_button {
&:extend(.z_base);
padding: 10px;
}
生成的样式
.z_base,
.z_button {
color: red;
font-size: 14px;
}
.z_button {
padding: 10px;
}
less
.a {
font-size: 18px;
.son {
background-color: aqua;
}
}
.c {
&:extend(.a);
}
生成
.a,
.c {
font-size: 18px;
}
.a .son {
background-color: aqua;
}
less
.a {
font-size: 18px;
.son {
background-color: aqua;
}
}
.c {
&:extend(.a all);
}
生成
.a,
.c {
font-size: 18px;
}
.a .son,
.c .son {
background-color: aqua;
}
https://less.bootcss.com/functions/#less-%E5%87%BD%E6%95%B0
// Variables
@link-color: #FA7E31; // sea blue
@link-color-hover: darken(@link-color, 10%);
// Usage
a {
color: @link-color;
}
a:hover {
color: @link-color-hover;
}
生成的样式
a {
color: #FA7E31;
}
a:hover {
color: #f26006;
}
// Variables
@link-color: #FA7E31; // sea blue
@link-color-hover: lighten(@link-color, 10%);
// Usage
a {
color: @link-color;
}
a:hover {
color: @link-color-hover;
}
生成的样式
a {
color: #FA7E31;
}
a:hover {
color: #fb9d63;
}
a {
font-size: 16px + 2;
}
a:hover {
font-size: 16px * 1.2;
}
生成后的
a {
font-size: 18px;
}
a:hover {
font-size: 19.2px;
}
LESS 支持多种运算符,用于在样式表中进行计算和动态生成值。
以下是 LESS 中支持的主要运算符:
加法(+
):
@width: 100px;
@padding: 20px;
.box {
width: @width + @padding; // 120px
}
减法(-
):
@width: 100px;
@margin: 10px;
.box {
width: @width - @margin; // 90px
}
乘法(*
):
@width: 100px;
@scale: 2;
.box {
width: @width * @scale; // 200px
}
除法(/
):
@width: 200px;
@parts: 4;
.box {
width: @width / @parts; // 50px
}
取余(%
):
@width: 100px;
@modulus: 3;
.box {
width: @width % @modulus; // 1px
}
比较运算符:
=
):@a = @b
!=
):@a != @b
>
):@a > @b
<
):@a < @b
>=
):@a >= @b
<=
):@a <= @b
这些比较运算符可以在条件语句中使用,例如:
@color: red;
.box {
color: if(@color = red, blue, green);
}
逻辑运算符:
and
):@a and @b
or
):@a or @b
not
):not @a
示例:
@isActive: true;
@isVisible: false;
.box {
display: if(@isActive and not @isVisible, block, none);
}
字符串连接:
@prefix: "prefix-";
@suffix: "-suffix";
.box {
content: @prefix + "content" + @suffix; // "prefix-content-suffix"
}
这些运算符可以帮助你在 LESS 中实现更复杂的样式计算和动态生成。