Less简明教程

news2024/11/14 15:35:04

一.概述

    Less是一种动态样式语言,它在CSS的基础上扩展了混合、嵌套、变量等实用功能。Less也是一种CSS预处理语言,less文件在经过less.js处理后,最终会生成.css文件,如下图所示:
在这里插入图片描述

1.动态样式语言的比较

    动态样式语言主要包括Sass、Scss、Less三种。同时,它们也都是CSS预处理语言,如下图所示:
在这里插入图片描述
    Sass的预处理基于Ruby脚本,需要Ruby环境,因此只能在服务端做处理。而Less的预处理基于Less.js文件,既可以在服务端处理,也可以在客户端(浏览器)处理。

    Sass对CSS进行丰富的功能扩展,在学习与应用上需要一定的成本。而Less对CSS仅进行了适当的扩展,在学习与应用上投入的成本比Sass要低。

    Sass虽然在功能上对CSS进行了兼容,但是在编写上采用了缩进式语法(不依赖’{}‘与’;')。而Less在编写上与CSS的语法相同。Scss在Sass的基础上,对CSS的编写语法进行了兼容。如下图所示:
在这里插入图片描述

2.Less的优点

  • 兼容CSS语法。
  • 可以在客户端预处理。
  • 功能扩展适中,学习成本低。

二.基础功能

1.嵌套

    Less支持在选择器中定义选择器,代码如下:

.root {
  color: black;
  #container {
    font-size: 12px;
    .list {
      background-color: red;
    }
  }
}

// compile
.root {
  color: black;
}
.root #container {
  font-size: 12px;
}
.root #container .list {
  background-color: red;
}

    注意:在Lynx中使用Less时,Lynx2.8版本前仅支持两层选择器嵌套,2.8版本及之后支持多层选择器嵌套。

2.运算

    Less支持在定义属性或变量的值时进行加减乘除运算,代码如下:

.container {
  background-color: (#FFFFFF / 16);
  width: 10px + 10%;
  height: 2cm * 3mm; // 乘除运算单位冲突时,优先使用第一个运算数的单位
}

// compile
.container {
  background-color: #101010;
  width: 20px;
  height: 6cm;
}

3.函数

    Less提供了功能丰富的函数,如:字符串处理、列表操作、逻辑判断、数学运算、颜色调整、类型判断等,代码如下:

.container {
  color:  if((iscolor(red)), red, black);
}

// compile
.container {
  color: red;
}

4.引用

    通过“&”可以获取父选择器名称的引用,代码如下:

.container {
  background-color: black;
  .list {
    color: red;
    &-item {
      font-size: 2rem;
    }
  }
}

// compile
.container {
  background-color: black;
}
.container .list {
  color: red;
}
.container .list-item {
  font-size: 2rem;
}

    注意:“&”获取的父选择器名称为全部层级的父选择器名称。

4.1 嵌套反转

    通过使用“&”,可以为父选择器指定父选择器,改变嵌套关系,代码如下:

.container {
  background-color: black;
  .list {
    color: red;
    .root & {
      font-size: 2rem;
    }
  }
}

// compile
.container {
  background-color: black;
}
.container .list {
  color: red;
}
.root .container .list {
  font-size: 2rem;
}

4.2 选择器列表的引用

    当一个选择器某一层级的父选择器为列表形式时,调用“&”获取父选择器,会遍历获取列表中的每一个选择器,代码如下:

.a, .b, .c {
  color: red;
  & & {
    color: blue;
  }
}

// compile
.a,
.b,
.c {
  color: red;
}
.a .a,
.a .b,
.a .c,
.b .a,
.b .b,
.b .c,
.c .a,
.c .b,
.c .c {
  color: blue;
}

5.导入

    通过“@import”导入.less文件和.css文件,被导入文件中所有的变量和选择器都可以被使用,代码如下:

// 导入.less文件
@import "library";
// 导入.css文件
@import "typo.css";

三.高级功能

1.变量

1.1 变量的定义

    通过“@”定义一个变量,变量的名称与变量的值通过“:”分隔,代码如下:

// 定义属性值
@container-color: #428bca;

// 定义属性名称
@bg: background-color;

// 定义选择器
@my-video: container;
// 扩展:Less3.5版本之前写法,当前不推荐
@my-video: ~"container"

// 定义字符串
@images: "../img";

1.2 变量的使用

    在属性值中使用变量,代码如下:

@container-color: #428bca;

.container {
  background-color: @container-color;
}

// compile
.container {
  background-color: #428bca;
}

    在属性名称中使用变量,代码如下:

@bg: background-color;

.container {
  @{bg}: #428bca;
}

// compile
.container {
  background-color: #428bca;
}

    在选择器名称中使用变量,代码如下:

@my-video: container;

.@{my-video} {
  background-color: #428bca;
}

// compile
.container {
  background-color: #428bca;
}

    在字符串中使用变量,代码如下:

@images: "../img";

.container {
  background: url("@{images}/test.png");
}

//compile
.container {
  background: url("../img/test.png");
}

1.3 变量的引用

    变量引用类似于替换,有两种形式,代码如下:

@primary:  green;

.container {
  @color: primary;

  background-color: @@color;
}

.container {
  @color: @primary;

  background-color: @color;
}

// compile
.container {
  background-color: green;
}

1.4 变量的懒加载

    在变量定义前先使用,在需要的时候再对变量定义,代码如下:

.container {
  background-color: @var;
}
@var: @bg;
@bg: blue;

// compile
.container {
  background-color: blue;
}

1.5 变量的作用域

    当变量使用时,优先在当前选择器内查找。如果找不到,则在当前选择器的父选择器中查找。若父选择器中也查找不到,则在父选择器的父选择器中查找,以此类推。

    当同一作用域内出现同名变量时,后定义变量的值会覆盖先定义变量的值。代码如下:

@bg: green;
.container {
  @bg: blue;
  .list {
    @bg: red;
    background-color: @bg;
    @bg: white;
  }
  background-color: @bg;
}

// compile
.container {
  background-color: blue;
}
.container .list {
  background-color: white;
}

1.6 属性引用

    通过“$”引用属性的值,代码如下:

.container {
  color: #efefef;
  background-color: $color;
}

// compile
.container {
  color: #efefef;
  background-color: #efefef;
}

2.混合

    混合是指通过选择器之间的调用,使一个选择器包含另一个选择器的属性,以此可以实现属性的分组与复用。

    在Less中,被调用的选择器称为Mixin(混合)。

2.1 混合的调用

    目前在Less中,混合支持类选择器和Id选择器,如下所示:

.bg {
  background-color: red;
}
#text {
  color: blue
}
.container {
  #text();
  .bg();
}

// compile
.bg {
  background-color: red;
}
#text {
  color: blue;
}
.container {
  color: blue;
  background-color: red;
}


// 扩展:老版本调用方式,当前不推荐
.container {
  #text;
  .bg;
}
.container {
  #text ();
  .bg ();
}

2.1 括号选择器与命名空间

    括号选择器是指名称中带有括号的选择器。当不希望某个选择器出现在生成的.css文件中,可以在定义这个选择器时在名称后加上“()”,代码如下:

.bg() {
  background-color: red;
}
.container {
  .bg();
}

// compile
.container {
  background-color: red;
}

    当括号选择器中定义了其他的选择器时,这时的括号选择器称为命名空间,代码如下:

#color() {
  .bg {
    background-color: red;
  }
}

.container {
  #color.bg();
}

// compile
.container {
  background-color: red;
}

//扩展:老版本调用方式,当前不推荐
.container {
  #color > .bg();
}
.container {
  #color .bg();
}

2.2 括号选择器的参数

    通过“@”可以在括号选择器的括号中定义参数,代码如下:

.colors(@color) {
  background-color: @color;
  color: @color;
}
.container {
  .colors(red);
}

// compile
.container {
  background-color: red;
  color: red;
}

2.3 括号选择器的参数调用

    括号选择器共有三种调用方式:显示调用、隐式调用、显隐式结合调用,代码如下:

.colors(@text, @bg) {
  background-color: @bg;
  color: @text;
}
// 显式
.container {
  .colors(@text: red, @bg: blue);
}
// 隐式
.container {
  .colors(red, blue);
}
// 显式 + 隐式
.container {
  .colors(@bg: blue, red);
}

// compile
.container {
  background-color: blue;
  color: red;
}

2.4 括号选择器的参数类型

    括号选择器中的参数支持两种形式:一种是单参数,一种是列表参数。单参数可以理解为列表中只有一个元素的列表参数,二者分隔规则如下:

  • 单参数之间使用“,”分隔,单参数与列表参数之间使用“;”分隔。
  • 列表参数以“;”结尾,列表参数内部元素之间使用“,”分隔。

    参考代码如下:

// 两个参数:单参数red,列表参数1,2,3
.selector(1,2,3; red)

// 两个参数:列表参数red,列表参数1,2,3
.selector(red; 1,2,3;)
.selector(1,2,3; red;)

// 三个参数:单参数1,单参数2,单参数3
.selector(1,2,3)

// 一个参数:列表参数1,2,3
.selector(1,2,3;)

// 显示调用时,参数分割规则仍适用
.selector(@single: red; @list: 1,2,3;)

2.5 括号选择器的参数默认值

    括号选择器中的参数可以指定默认值,代码如下:

.colors(@text: red, @bg: blue) {
  background-color: @bg;
  color: @text;
}
.container1 {
  .colors();
}
.container2 {
  .colors(@bg: green);
}

// compile
.container1 {
  background-color: blue;
  color: red;
}
.container2 {
  background-color: green;
  color: red;
}

2.6 括号选择器的重载

    Less中支持多个名字相同且参数也相同的括号选择器。当一个选择器被调用时,其他重载且参数匹配的括号选择器也会被调用,代码如下:

.colors(@text: red, @bg: blue) {
  background-color-1: @bg;
  color-1: @text;
}

.colors(@text, @bg: blue) {
  background-color-2: @bg;
  color-2: @text;
}

.colors(@text, @bg) {
  background-color-3: @bg;
  color-3: @text;
}

.colors(@text) {
  color-4: @text;
}

.container1 {
  .colors(green);
}

//compile
.container1 {
  background-color-1: blue;
  color-1: green;
  background-color-2: blue;
  color-2: green;
  color-4: green;
}

2.7 括号选择器的固定参数

    当括号选择器中的参数没有使用“@”定义,那么这个参数会变成固定参数。这种括号选择器在使用时,固定参数的名称和位置都不能变,代码如下:

.colors(dark, @color, @bg) {
  color: darken(@color, 10%);
  background-color: darken(@bg, 10%);
}

.colors(light, @color, @bg) {
  color: lighten(@color, 10%);
  background-color: lighten(@bg, 10%);
}

@switch: dark;

.container {
  .colors(@switch, @bg:#888, @color:#888);
}

// compile
.container {
  color: #6f6f6f;
  background-color: #6f6f6f;
}

2.8 括号选择器的全参数获取

    通过@arguments可以获取括号选择器中的全部参数,代码如下:

.margins(@top, @right, @bottom, @left) {
  margin: @arguments;
  padding: @arguments
}

.container {
  .margins(10%, 10%, 10%, 10%);
}

// compile
.container {
  margin: 10% 10% 10% 10%;
  padding: 10% 10% 10% 10%;
}

2.9 括号选择器的剩余参数分配

    在定义括号选择器的参数时,当在参数名称后加上“…”时,这个参数会接收到剩余的所有参数。名称带有“…”的参数必须置于所有参数的最后,代码如下:

.margins(@top, @right, @bottom-left...) {
  margin: @top @right @bottom-left;
  padding: 0% @bottom-left 5%
}

.container {
  .margins(10%, 20%, 30%, 40%);
}

// compile
.container {
  margin: 10% 20% 30% 40%;
  padding: 0% 30% 40% 5%;
}

2.10 括号选择器的变量(属性)查找

    通过“@”可以在括号选择器中定义变量(或直接在括号选择器中定义属性),通过“[]”获取变量(属性)的值。这种括号选择器可以作为函数来处理逻辑,代码如下:

// 变量
.avg1(@x, @y) {
  @result: ((@x + @y) / 2);
}
.container1 {
  margin-top: .avg1(10%, 50px)[@result];
}

// 属性
.avg2(@x, @y) {
  result: ((@x + @y) / 2);
}
.container2 {
  margin-top: .avg2(10%, 50px)[result];
}

// compile
.container1 {
  margin-top: 30%;
}
.container2 {
  margin-top: 30%;
}

2.11 括号选择器的获取默认值

    当通过“[]”获取括号选择器变量(属性)的值,而在“[]”内并没有指定变量(属性)的名称。这时括号选择器内所有的变量(属性)都会被计算,最后定义的变量(属性)会被输出,代码如下:

// 变量
.avg1(@x, @y) {
  @result: ((@x + @y) / 2);
  @default: @result - 100px;
}

.container1 {
  margin-right: .avg1(10px, 50px)[@result];
  margin-top: .avg1(10px, 50px)[];
  margin-left: .avg1(10px, 50px)[@default]
}

// 属性
.avg2(@x, @y) {
  result: ((@x + @y) / 2);
  default: $result - 100px; // 注意属性引用的写法
}

.container2 {
  margin-right: .avg2(10px, 50px)[result];
  margin-top: .avg2(10px, 50px)[];
  margin-left: .avg2(10px, 50px)[default]
}

// compile
.container1 {
  margin-right: 30px;
  margin-top: -70px;
  margin-left: -70px;
}
.container2 {
  margin-right: 30px;
  margin-top: -70px;
  margin-left: -70px;
}

2.12 括号选择器的变量引入

    在选择器中调用一个括号选择器,会引入该括号选择器中定义的变量和选择器,代码如下:

.colors() {
  @bg: red;
  .text() {
    color: green;
  }
}

.container {
  background-color: @bg;
  .colors();
  .text();
}

// compile
.container {
  background-color: red;
  color: green;
}

    当在选择器中调用括号选择器,如果选择器中定义的变量与括号选择器中定义的变量发生冲突,括号选择器中的变量会被覆盖,代码如下:

.colors() {
  @bg: red;
  @text: green;
}

.container {
  @bg: black;
  .colors();
  background-color: @bg;
  color: @text;
  @text: white;
}

// compile
.container {
  background-color: black;
  color: white;
}

    当在选择器中调用多个括号选择器,如果后调用的括号选择器中定义的变量与已调用的括号选择器中定义的变量发生相同,则后调用的括号选择器中冲突的变量不会被引入,代码如下:

.colors1() {
  @text: green;
}

.colors2() {
  @text: red;
}

.container {
  .colors1();
  .colors2();
  color: @text;
}

// compile
.container {
  color: green;
}

    为了防止括号选择器中的变量被修改,可以将属性定义成参数,代码如下:

.colors(@color) {
  .bg() {
    background-color: @color;
  }
}

.container {
  @color: black;
  .colors(red);
  .bg();
  @color: white;
}

// compile
.container {
  background-color: red;
}

2.13 括号选择器的别名

    通过变量引用,可以对括号选择器中的变量和选择器进行重命名,代码如下:

#lib() {
  .main() {
    .colors() {
      bg: red;
      @text: blue;
    }
  
    .margins() {
      margin: 10% 10% 10% 10%;
    }
  }
}

.container {
  @color: #lib.main.colors();
  background-color: @color[bg]; // 引用指定属性
  color: @color[@text]; // 引用指定变量
  
  @mg: #lib.main.margins(); // 注意结尾处的括号
  @mg();
}

// compile
.container {
  background-color: red;
  color: blue;
  margin: 10% 10% 10% 10%;
}

2.14 括号选择器的覆盖

    当导入文件中的括号选择器与被导入文件中的括号选择器相同(名称、结构)时,后定义的括号选择器会覆盖先定义的括号选择器,代码如下:

// library.less
#colors() {
  @bg: red;
}

// main.less
@import "library"
#colors() {
  @bg: blue;
}

.container {
  background-color: #colors[@bg];
}

// compile
.container {
  background-color: blue;
}

2.15 括号选择器的调用保护

    括号选择器中定义的变量支持在调用保护中使用,代码如下:

.max(@a; @b) when (@a >= @b) { width: @a }
.max(@a; @b) when (@a < @b) { width: @b }

.container {
  .max(10, 20);
}

// compile
.container {
  width: 20;
}

    通过调用保护,可以实现括号选择器的递归调用,代码如下:

.create(@count) when (@count > 0) {
  .container-@{count} {
    width: @count * 100px;
  }
  .create((@count - 1));
}

.create(5);

// compile
.container-5 {
  width: 500px;
}
.container-4 {
  width: 400px;
}
.container-3 {
  width: 300px;
}
.container-2 {
  width: 200px;
}
.container-1 {
  width: 100px;
}

3.合并

    当在一个选择器中调用另一个选择器,如果两个选择器中存在相同属性时,默认两个相同的属性都会保留,代码如下:

#colors() {
  color: red;
}

.container {
  #colors();
  color: black;
}

// compile
.container {
  color: red;
  color: black;
}

3.1 逗号合并

    当在两个相同属性后添加“+”后,两个属性在合并后会以逗号间隔进行合并,代码如下:

.shadow() {
  box-shadow+: inset 0 0 10px #555;
}
.container {
  .shadow();
  box-shadow+: 0 0 20px black;
}

// compile
.container {
  box-shadow: inset 0 0 10px #555, 0 0 20px black;
}

3.2 空格合并

    当在两个相同属性后添加“+_”后,两个属性在合并后会以空格间隔进行合并,代码如下:

.scales() {
  transform+_: scale(2);
}
.container {
  .scales();
  transform+_: rotate(15deg);
}

// compile
.container {
  transform: scale(2) rotate(15deg);
}

3.3 合并冲突

    当在两个相同属性,一个属性后添加“+_”,另一个属性后添加“+”。这时两个属性在进行合并时,以最后定义的属性为主,代码如下:

.scales() {
  transform+: scale(2);
}
.container1 {
  .scales();
  transform+_: rotate(15deg);
}

.container2 {
  transform+_: rotate(15deg);
  .scales();
}

// compile
.container1 {
  transform: scale(2) rotate(15deg);
}
.container2 {
  transform: rotate(15deg), scale(2);
}

4.规则集

    规则集与变量类似,都是通过“@”定义名称,名称与值通过“:”分隔。不同的是,变量的值是一个值,而规则集的值是一个集合,可以包括属性、变量、选择器、规则集等。

4.1 规则集的定义

    通过“@”定义一个规则集,规则集的名称与变量的值通过“:”分隔,规则集的值全部放在“{}”中,代码如下:

@colors: { 
  background-color: red; 
  color: blue;
}; 

4.2 规则集的调用

    在选择器中通过调用规则集的名称加“()”,可以引入规则集。

    对于规则集中定义的属性和非括号选择器,调用规则集后会加入到选择器中,代码如下:

@colors: { 
  background-color: red; 
  color: blue;
  .bg {
      color: green;
  }
}; 

.container {
    @colors();
    font-size: 15px;
}

// compile
.container {
  background-color: red;
  color: blue;
  font-size: 15px;
}
.container .bg {
  color: green;
}

    对于规则集中定义的括号选择器,需要二次调用,才能将属性加入到选择器中,代码如下:

@colors: { 
  .bg() {
      color: green;
  }
}; 

.container {
    @colors();
    .bg();
}

// compile
.container {
  color: green;
}

4.3 规则集的变量

    规则集中定义的变量是规则集私有的,即在规则集外部无法使用规则集中定义的变量,代码如下:

@colors: {
  @text: green;
  .bg() {
      color: @text;
  }
}; 

.container {
    @colors();
    // color: @text;会编译错误
    .bg();
}

// compile
.container {
  color: green;
}

4.4 规则集的作用域

    规则集的作用域是指规则集可以调用变量和括号选择器的范围。规则集的作用域分为三种:内部作用域、定义作用域、调用作用域。

    内部作用域就是规则集所在“{}”的内部范围,定义作用域是定义规则集所在的“{}”的范围,调用作用域是调用规则集时所在的“{}”的范围。

4.4.1 规则集作用域的优先级

    当规则集中使用的变量和括号选择器在作用域中出现多个相同定义时,变量使用的优先级为:内部作用域 > 定义作用域 > 调用作用域。代码如下:

#bg() {
  // 定义作用域
  @text: red;
  @colors1: {
    // 内部作用域
    @text: green;
    color: @text;
  };

  @colors2: {
    color: @text
  };
}

@colors3: {
  color: @text
};

.container1 {
  #bg();
  @colors1();
}
.container2 {
  #bg();
  @colors2();
}
.container3 {
  @colors3();
  // 调用作用域
  @text: blue;
}

// compile
.container1 {
  color: green;
}
.container2 {
  color: red;
}
.container3 {
  color: blue;
}

4.4.2 规则集的引用

    规则集的引用不会改变规则集的作用范围,代码如下:

@rules: {
  color: @text;
};

.colors() {
  .bg() {
    @rules1: @rules;
  }
  @text: red;
}
.container {
  .colors.bg();
  @rules1();
}

// compile
Error at Ln 2, Col 9:
variable @text is undefined

    如果选择器中引入了其他的属性,则在调用规则集时,这些属性会作为调用作用域的一部分,可以被规则集调用,代码如下:

@rules: {
  color: @text;
};

.colors() {
  .bg() {
    @rules1: @rules;
  }
  @text: red;
}
.container {
  .colors();
  .colors.bg();
  @rules1();
}

// compile
.container {
  color: red;
}

4.5 规则集的变量(属性)查找

    通过使用“[]”可以获取规则集中指定的变量(属性),代码如下:

@colors: {
  @bg: red;
  color: green;
};

.container {
  background-color: @colors[@bg];
  @colors[color];
}

// compile
.container {
  background-color: red;
  color: green;
}

    规则集支持变量(属性)的多级查找,代码如下:

@colors: {
  @light: {
    color: white;
  };
  @dark: {
    color: black;
  };
};

.container {
  background-color: @colors[@light][color];
}

// compile
.container {
  background-color: white;
}

5.调用保护

    调用保护是指在调用一个选择器时需要满足的规则和条件,只有当选择器满足条件时调用才会生效。调用保护是Less提供的一种语法糖,在设计上参考了CSS的@media,以此来保持语法上的兼容。

5.1 调用保护的定义

    在选择器名称后,通过“when”在“()”中定义选择器的调用保护,代码如下:

.container when(@is-root = true) {
  color: red;
}

@is-root: true;

// compile
.container {
  color: red;
}

5.2 匿名调用保护

    通过“&”与“when”实现匿名调用保护,可用于选择器的分组管理,代码如下:

& when(@use-color = true) {
  .container1 {
    color: red;
  }
  .container2 {
    color: green;
  }
}

@use-color: true;

// compile
.container1 {
  color: red;
}
.container2 {
  color: green;
}

    使用if函数也可以实现相同的效果,代码如下:

@colors: if(
  @use-color = true, {
    .container1 {
      color: red;
    }
    .container2 {
      color: green;
    }
  }
);

@use-color: true;

@colors();

// compile
.container1 {
  color: red;
}
.container2 {
  color: green;
}

5.3 调用保护的判断逻辑

    调用保护支持大于“>”、大于等于“>=”、等于“=”、小于等于“=<”、小于“<”五种判断逻辑,代码如下:

.container when(@value >= 1) {
  color: red;
}

@value: 2;

// compile
.container {
  color: red;
}

5.4 调用保护的运算逻辑

    调用保护支持与、或、非三种运算逻辑。

5.4.1 与逻辑

    通过“and”实现与逻辑,代码如下:

.container when(@value1 >= 1) and (@value2 < 0) {
  color: red;
}

@value1: 2;
@value2: -1;

// compile
.container {
  color: red;
}

5.4.2 或逻辑

    通过“,”实现或逻辑,代码如下:

.container when(@value1 >= 1), (@value2 < 0) {
  color: red;
}

@value1: 2;
@value2: 0;

// compile
.container {
  color: red;
}

5.4.2 非逻辑

    通过“not”实现非逻辑,代码如下:

.container when not(@value >= 1) {
  color: red;
}

@value: 0;

// compile
.container {
  color: red;
}

6.继承

    继承是指一个选择器继承另一个选择器的属性,实现的效果与混合相同,但不会给选择器引入额外的属性。通过使用伪类“extend”实现选择器之间的继承。

6.1 继承的定义形式

    继承有两种定义形式,一种是外部定义,即定义在选择器的后面,另一种是内部定义,定义到选择器的“{}”里面。

6.2.1 继承的外部定义

.containerA:extend(.containerB) {
  background: blue;
}
.containerB {
  color: red;
}

// compile
.containerA {
  background: blue;
}
.containerB,
.containerA {
  color: red;
}

6.2.2 继承的内部定义

.containerA {
  &:extend(.containerB);
  background: blue;
}
.containerB {
  color: red;
}

// compile
.containerA {
  background: blue;
}
.containerB,
.containerA {
  color: red;
}

6.2 多继承的写法

    在Less中继承支持多继承。多继承共有三种写法:第一种是在同一个“extend”中实现多继承,第二种是分别多次调用“extend”实现多继承,第三种是连续多次调用“extend”实现多继承。

6.2.1 同一个“extend”中实现多继承

    这种写法同时支持内部定义与外部定义,代码如下:

.containerA {
  &:extend(.containerB,.containerC);
  background: blue;
}
.containerB {
  color: red;
}

.containerC {
  width: 100px;
}

// compile
.containerA {
  background: blue;
}
.containerB,
.containerA {
  color: red;
}
.containerC,
.containerA {
  width: 100px;
}

6.2.2 分别多次调用“extend”实现多继承

     这种写法仅支持内部定义,代码如下:

.containerA {
  &:extend(.containerB);
  &:extend(.containerC);
  background: blue;
}
.containerB {
  color: red;
}

.containerC {
  width: 100px;
}

// compile
.containerA {
  background: blue;
}
.containerB,
.containerA {
  color: red;
}
.containerC,
.containerA {
  width: 100px;
}

6.2.3 连续多次调用“extend”实现多继承

    这种写法仅支持外部定义,代码如下:

.containerA:extend(.containerB):extend(.containerC) {
  background: blue;
}
.containerB {
  color: red;
}

.containerC {
  width: 100px;
}

// compile
.containerA {
  background: blue;
}
.containerB,
.containerA {
  color: red;
}
.containerC,
.containerA {
  width: 100px;
}

6.3 继承的匹配机制

    继承关注选择器最终在.css文件中的名称。当被继承的选择器名称无法找到时,相当于被继承的选择器不存在,代码如下:

.containerA:extend(.containerB) {
  background: blue;
}

// compile
.containerA {
  background: blue;
}

    参与继承的选择器(extend前后的选择器)的名称中不能存在变量,变量会被继承忽略,代码如下:

.colors {
  color: red;
}

@selector1: .colors;
@selector2: .container;

.container:extend(@{selector1}) {}
@{selector2}:extend(.colors) {}

// compile
.colors {
  color: red;
}

    extend必须排在选择器的最后面,代码如下:

.containerA:extend(.containerB):hover {
  background: blue;
}

// compile
Error at Ln 1, Col 38:
Extend can only be used at the end of selector

6.4 嵌套选择器的继承

    当被继承的选择器为嵌套选择器时,选择器的名称必须为在.css文件中最终生成的名称,代码如下:

.containerA {
  .containerB {
    color: blue;
  }
}
.containerC:extend(.containerA .containerB) {}

// compile
.containerA .containerB,
.containerC {
  color: blue;
}

6.5 匹配继承

    当选择器A继承选择器B时,通过选择器B后加入“all”,选择器A可以继承所有名字中带有选择器B名称的选择器,这些选择器的名称中与选择器B名称相同的部分,会被替换成选择器A的名称,代码如下:

.color {
  color: red;
}
.a.color {
  color: green;
}
.color .b {
  color: blue;
}

.container:extend(.color all) {}

// compile
.color,
.container {
  color: red;
}
.a.color,
.a.container {
  color: green;
}
.color .b,
.container .b {
  color: blue;
}

6.6 重复继承检测

    目前Less不支持重复继承检测。选择器继承两个属性相同但名称不同的选择器会被同时输出,代码如下:

.container1,
.container2 {
  color: red;
}

.container3:extend(.container1,.container2) {}

// compile
.container1,
.container2,
.container3,
.container3 {
  color: red;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/708691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git push报错rejected:no-fast-forward

报错&#xff1a; 报错关键词&#xff1a; non-fast-forwardyour current branch is behindthe remote changes 即&#xff1a;不能快速前进、当前分支滞后、远端改变 原因&#xff1a; 这个分支下&#xff0c;别人提交了一些代码到远程仓库。对于这个改变&#xff0c;你没有…

SpringBoot+微信小程序在线订餐小程序系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBoot微信小程序框架开发的在线订餐小程序系统。首先&#xff0c;这是一个前后端分离的项目&#xff0c;代…

什么是 Kubernetes 服务器端应用 (SSA)?

自 2021 年 8 月 v1.22 版本发布以来,服务器端应用 (SSA) 已在 Kubernetes 中普遍可用。这是一种声明式资源管理策略,可通过将命令逻辑移至kubectl apply服务器来改进 diff 计算并警告合并冲突。 本文将解释 SSA 的工作原理以及为什么它比以前的客户端应用 (CSA) 方法更受青…

Python3 面向对象 | 菜鸟教程(十六)

目录 一、面向对象技术简介 &#xff08;一&#xff09;类(Class) &#xff08;二&#xff09;方法 &#xff08;三&#xff09;类变量 &#xff08;四&#xff09;数据成员 &#xff08;五&#xff09;方法重写 &#xff08;六&#xff09;局部变量 &#xff08;七&am…

并发-抽象队列同步器AQS应用Lock详解

锁的膨胀是指synchronized原本是无锁态&#xff0c;当有一个线程调用时变为偏向锁&#xff0c;当有多个线程排队自旋等待锁时会升级为轻量锁&#xff0c;当线程等待时间太长时会升级为重量级锁&#xff0c;这就是锁的膨胀过程&#xff0c;且是不可逆的。 锁的粗化是指如果在一个…

【总结】1727- 前端开发中如何高效地模拟数据?

&#x1f449; 「文章推荐」 详细聊一聊 Vue3 动态组件深入浅出 Vue3 自定义指令6 个你必须明白 Vue3 的 ref 和 reactive 问题初中级前端必须掌握的 10 个 Vue 优化技巧分享 15 个 Vue3 全家桶开发的避坑经验 在开发和测试工作中&#xff0c;mock 数据非常实用。mock 数据是指…

基于值的深度强化学习算法

目录 DQN2013 —— Playing Atari with Deep Reinforcement LearningDQN2015 —— Human-level control through deep reinforcement learning引用文献 DQN2013 —— Playing Atari with Deep Reinforcement Learning 论文下载地址 论文介绍 该论文提出了一个基于卷积神经网络…

数字IC验证环境的创建

本文介绍了从一组可重用的验证组件中构建测试平台所需的步骤。UVM促进了重用&#xff0c;加速了测试平台构建的过程。 首先对测试平台集成者&#xff08;testbench integrator&#xff09;和测试编写者&#xff08;test writer &#xff09;进行区分&#xff0c;前者负责测试平…

【Java EE】-博客系统二(前后端分离)

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【JavaEE】 分享: 徘徊着的 在路上的 你要走吗 易碎的 骄傲着 那也曾是我的模样 ——《平凡之路》 主要内容&#xff1a;显示用户信息、上传头像、新增博客、删除博客、修改博客…

Android:设计模式

文章参考来源1 文章参考来源2 文章参考来源3 MVC Model 数据来源&#xff0c;管理业务数据逻辑&#xff0c;读取数据等 View 视图 Controller 单例模式&#xff0c;处理业务逻辑&#xff0c;负责改变Model和View 经典的MVC架构是 用户点击View&#xff0c;View将用户输入转…

springboot详细整合mybatisplus

SpringBoot详细整合mybatisPlus 文章目录 SpringBoot详细整合mybatisPlus一、引入mybatis_plus依赖二、修改mybatis_plus的yml配置三、添加mybatis_plus的其他配置以及包扫描四&#xff0c;修改mybatis的配置&#xff08;这一步根据实际情况修改&#xff09; 无奈&#xff0c;一…

三个关键数字变化,剖析中国智能手机市场的趋势及其影响

近期&#xff0c;全球行业分析机构CounterpointResearch公布了《中国智能手机高端市场白皮书》&#xff0c;对中国智能手机市场数据进行详细分析。该报告揭示了几个关键数据&#xff0c;值得深入剖析。 上面的图表展示了中国智能手机市场在2012年至2022年的11年间销量、平均价格…

UE5《Electric Dreams》项目PCG技术解析 之 PCGDemo_Ditch关卡详解

文章目录 前导文章关卡概要PCGGraphPoints From Actor Tag作为PCG的分割工具分层装饰 一些知识点和技巧使用Attribute Operation将属性暂存到临时属性中是否生成碰撞 小结 前导文章 《UE5《Electric Dreams》项目PCG技术解析 之 基于关卡PCGSettings的工作流》《UE5《Electric…

mac系统通过终端连接远程服务器

mac系统通过终端连接远程服务器 1、通过自带终端连接1.1 命令直接连接1.2 方式2——创建连接 2、通过iTerm2连接2.1 方式一&#xff1a;命令直接连接 3. Mac上使用scp命令 1、通过自带终端连接 1.1 命令直接连接 如下&#xff1a;ssh -p 22 root远程IP1.2 方式2——创建连接 …

类Twitter风格的RSS阅读器

本文完成于 2 月中旬&#xff0c;其中的反代还是 frp npm 方案&#xff1b; 什么是 RSS ? RSS 是用 PHP、Laravel、Inertia.js、Tailwind 和 Vue.js 编写的简单的类Twitter 风格的 RSS阅读器&#xff0c;支持 RSS和ATOM 格式。 命令行安装 在群晖上以 Docker 方式安装。 官…

形式化验证,QED: Quick Error Detection Tests for Effective Post-Silicon Validation(二)

目录 一、Article:文献出处&#xff08;方便再次搜索&#xff09; &#xff08;1&#xff09;作者 &#xff08;2&#xff09;文献题目 &#xff08;3&#xff09;文献时间 &#xff08;4&#xff09;引用 二、Data:文献数据&#xff08;总结归纳&#xff0c;方便理解&am…

chatgpt赋能python:如何用Python打造一个简单的抽奖程序

如何用Python打造一个简单的抽奖程序 随着互联网的不断发展&#xff0c;抽奖活动已经成为了各种营销活动的必备环节&#xff0c;因此如何快速便捷地实现一个抽奖程序也变得尤为重要。本文将介绍如何使用Python打造一个简单的抽奖程序。 一、抽奖程序的工作原理 抽奖程序的核…

Vue使用vue-3d-model组件预览3D三维文件、立体文件,支持旋转、自动播放

实现效果 Tips:先泼个冷水&#xff0c;这个预览3D组件有个致命的缺陷——不能设置材质、皮肤文件的目录路径&#xff0c;必须要和3d文件放在同一个目录&#xff0c;如果项目是用hash模式(url后面会有/#/这种井号)&#xff0c;就会导致无法读取根目录的材质文件。所以推荐了解下…

LabVIEW利用相机开发零件处理和检查系统

LabVIEW利用相机开发零件处理和检查系统 为了将自动化运用于飞机发动机轮机机翼的去毛刺和检查流程&#xff0c;设计了一个系统&#xff0c;该系统使用六轴机器人操作抖动&#xff0c;并结合两个关键操作。首先&#xff0c;使用专门选定的工具对机翼进行去毛刺&#xff0c;以去…

ssh 端口转发

本地转发 ssh -L -CTfN 9527:remote_server_ip:23 ssh_server_ipL 本地转发模式C 压缩数据T 禁用模拟终端f 后台运行N 不执行远程指令&#xff0c; 常用于仅做端口转发 在local_server上开启本地转发模式之后 。ssh_server就会出现2端的TCP链接。然后所有发向9527端口TCP数据…