Less 是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量、混合(mixin)、函数等功能,让 CSS 更易维护、方便制作主题、扩充。Less 可以运行在 Node 或浏览器端。
npm install less -g
-g:表示全局安装
若想安装特定版本号可以在less后加上@+版本号
less是没有办法直接使用在浏览器上面的,只有css才能直接使用到浏览器的上面。所以我们要把less转化成css。
通用方式
@color: blue;
a {
color: @color;
background-color: @color;
}
lessc a.less a.css
这样a.less文件的代码就会编译为css代码并保存到a.css文件中
a {
color: blue;
background-color: blue;
}
在VSCode中使用less(可以使用插件)
使用变量可以方便修改属性值。
在Less中可以使用变量:
表达式:@+变量名 : 属性值
@color: #1a2a3a; // 变量声明
body { // 使用变量
background-color: @color;
}
div {
color: @color;
}
编译为:
/* css */
body {
background-color: #1a2a3a;
}
div {
color: #1a2a3a;
}
在less中可以进行代码注释,方式有单行注释(//)、*多行注释(/ */)**两种,但是只有多行注释
才能在编译后的文件中出现。
@color: #1a2a3a;
body {
// 使用变量
/*使用变量*/
background-color: @color;
}
编译为:
/* css */
body {
/*使用变量*/
background-color: #1a2a3a;
}
混合(Mixin)是一种将一组属性从一个规则集包含(或混入)到另一个规则集的方法。
.length {
width: 100px;
height: 200px;
}
#apple a {
color: #222;
.length();
}
.happy a {
color: blue;
.length();
}
编译为:
/* css */
.length {
width: 100px;
height: 200px;
}
#apple a {
color: #222;
width: 100px;
height: 200px;
}
.happy a {
color: blue;
width: 100px;
height: 200px;
}
Less 提供了使用嵌套(nesting)代替层叠或与层叠结合使用的能力。
div {
h1 {
color: #333;
}
p {
margin-bottom: 1.4px;
a {
color: #999;
}
}
}
编译为:
/* css */
div h1 {
color: #333;
}
div p {
margin-bottom: 1.4px;
}
div p a {
color: #999;
}
&
在嵌套 CSS 规则时,有时也需要直接使用嵌套外层的父选择器,例如,当给某个元素设定 hover
样式时,或者当 body
元素有某个 classname 时,可以用 &
代表嵌套规则外层的父选择器。
a {
font-weight: bold;
text-decoration: none;
&:hover { text-decoration: underline;
}
body.firefox & { font-weight: normal;
}
}
编译为:
/* css */
a {
font-weight: bold;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
body.firefox a {
font-weight: normal;
}
@ 规则(例如 @media
或 @supports
)可以与选择器以相同的方式进行嵌套。@ 规则会被放在前面,同一规则集中的其它元素的相对顺序保持不变。这叫做冒泡(bubbling)。
.component {
width: 300px;
@media (width: 567px) {
width: 600px;
@media (resolution: 192dpi) {
background-image: url(/img/1.png);
}
}
@media (width: 1120px) {
width: 400px;
}
}
编译为:
/* css */
.component {
width: 300px;
}
@media (width: 567px) {
.component {
width: 600px;
}
}
@media (width: 567px) and (resolution: 192dpi) {
.component {
background-image: url(/img/1.png);
}
}
@media (width: 1120px) {
.component {
width: 400px;
}
}
算术运算符 +
、-
、*
、/
可以对任何数字、颜色或变量进行运算。
.class {
width: @width;
color: @color;
}
@width: 0.4 + 0.4;
@base: 0.1 ;
@sub: @width - @base;
@color: #121a2a * 2; // 颜色运算
#div {
color: @color;
width: @sub;
}
编译为:
.class {
width: 0.8;
color: #243454;
}
#div {
color: #243454;
width: 0.7;
}
转义(Escaping)允许使用任意字符串作为属性或变量值,编译后会原样输出。
格式:~"(任意字符串)"
@min678: ~"(min-width: 678px)";
.element {
@media @min678 {
font-size: 0.8rem;
}
}
编译为:
@media (min-width: 678px) {
.element {
font-size: 0.8rem;
}
}
注意,从 Less 3.5 开始,可以简写为:(任意字符串)
@min678: (min-width: 678px);
.element {
@media @min678 {
font-size: 0.8rem;
}
}
在 Less 3.5+ 版本中,许多以前需要“引号转义”的情况就不再需要了。
Less 内置了多种函数用于转换颜色、处理字符串、算术运算等。这些函数在Less 函数手册中有详细介绍。
@width: 0.4;
@color: #1a2a3b;
.class {
width: percentage(@width);
color: saturate(@color, 5%);
background-color: spin(lighten(@color, 25%), 8);
}
编译为:
/* css */
.class {
width: 40%;
color: #182a3d;
background-color: #415e94;
}
了解更多函数:函数手册
为了组织结构、为了以后方便重用或分发、为了提供一些封装的目的,或是为了对混合(mixins)进行分组。可以将一些混合(mixins)和变量置于 #bundle
之下:
#bundle() {
.button {
border: 1px solid red;
&:hover {
background-color: black;
}
}
}
#header a {
color: blue;
#bundle.button(); // 还可以书写为 #bundle > .button 形式
}
编译为:
#header a {
color: blue;
border: 1px solid red;
}
#header a:hover {
background-color: black;
}
从 Less 3.5 版本开始,你还可以将混合(mixins)和规则集(rulesets)作为一组值的映射(map)使用。
@width: 0.4;
@color: blue;
#div {
color: @color;
width: @width;
}
.span{
color: #div[color];
width: #div[width];
}
编译为:
#div {
color: blue;
width: 0.4;
}
.span {
color: blue;
width: 0.4;
}
Less 中的作用域与 CSS 中的作用域非常类似。首先在本地查找变量和混合(mixins),如果找不到,则从“父”级作用域继承。
@width: 0.4;
@color: blue;
#div {
@color: white;
#header {
color: @color; // white
width: @width; // 0.4
}
}
编译为:
#div #header {
color: white;
width: 0.4;
}
与 CSS 自定义属性一样,混合(mixin)和变量的定义不必在引用之前事先定义。
.class {
width: @width;
color: @color;
}
@width: 0.4;
@color: blue;
编译为:
.class {
width: 0.4;
color: blue;
}
可以通过@import "要导入的文件名(可以省略文件拓展名)"
引用其他less文件中的内容,将其输出在同一个css文件中。
// _test2.less
body{
text-align: center;
}
// test.less
@import "_test2"; // 导入_test2.less文件内容
@width: 0.4;
@color: #1a2a3b;
.class {
width: @width;
color: @color;
}
编译为:
/* css */
body {
text-align: center;
}
.class {
width: 0.4;
color: #1a2a3b;
}