css 预处理器

article/2025/8/23 10:39:21

由于多个项目中用到了sass和less,所以就学习了一下相关知识,记录下来方便随时查看。

前言

css是用来编写网站样式,但是,其写法比较一成不变。

如果想要使用 css 实现 js 一样的变量、常量等,就会比较臃肿,难以维护。

所以,作为css的扩展,出现了css预处理器。

CSS预处理器

css预处理器定义了一种新的语言,主要是通过用一种专门的编程语言,为css添加一些编程特性,再编译生成css文件。

它可以帮助我们编写可维护的、与时俱进的代码,也可以减少需要编写的CSS数量,对于那些需要大量样式表和样式规则的大型用户界面是非常有帮助的。

css 预处理器可以更方便的维护和管理 css 代码,让整个网页变得更加灵活可变。

常用CSS预处理器

现有流行库有Sass(Scss)LessStylus等,目前,广泛使用的是 less 和 sass 。

Sass

Sass是CSS(层叠样式表)的语法的一种扩充,诞生于2007年,是最早也是最成熟的一款CSS预处理器语言。

SASS使用变量和公式添加到css编程风格中,可以利用缩进代替花括号,空格也有着重要的意义。

文件后缀名

它是一个通过转换scsscss文件,文件后缀名:.scss

为什么sass的后缀是scss?其实,sass有两种语法形式。

首先是scss,也就是我们这个后缀形式的语法。这种格式在 CSS3 语法的基础上进行扩展,这意味着每个CSS样式表是一个同等的SCSS文件。此外,SCSS 也支持大多数 CSS hacks 写法以及浏览器专属前缀语法,这种语法的样式表文件需要以 .scss 作为拓展名。

另一种,也是最早的语法,被称为缩进语法。它提供了一种更加简洁的方式来书写CSS。它使用缩进而不是花括号来表示选择器的嵌套,用换行而不是分号来分隔属性,一些人认为这样做比 SCSS 更容易阅读,书写也更快速。缩排语法具有 Sass 的所有特色功能,虽然有些语法上稍有差异。使用此种语法的样式表文件需要以 .sass 作为扩展名。

总结来说,SASS保存为".sass"是缩进格式,保存为".scss"是非缩进格式。

安装

sass基于Ruby语言编写,所以编译sass文件需要Ruby环境。(使用sass并不需要过多了解Ruby语言,只需要安装Ruby环境即可。)

首先,安装ruby,建议安装到C盘中,安装过程中选择“Add Ruby executables to your PATH”。

接下来,ruby安装成功后,启动Ruby的Command控制面板,输入命令:

gem install sass

回车后会自动安装好Sass。

输入sass -v,之后出现版本号,就算安装成功了。

主要功能

  • 可以使用变量、常量;

  • 允许css代码嵌套;

  • 混入Mixin;

  • 继承;

  • 函数等功能。

这些功能使得编写css更加贴合编程语言的习惯,从而更有效有弹性的写出CSS。

变量(Variables)

变量的提供,可以避免由于设计师频繁更改某一全局属性(比如整体颜色风格),而引起的被动增加工作量问题。

变量的使用:以$开头,有全局变量局部变量

sass的变量必须是$开头,后面紧跟变量名,变量值和变量名之间需要使用冒号(:)分隔开(就像CSS属性设置一样),如果值后面加上!default则表示默认值。

全局变量&局部变量

$bgColor: #ffffff; // 全局变量
div { $width: 1000px; // 局部变量width: $width;background: $bgColor;
}

变量用在属性中

变量用在属性中,需要写在#{ }中,如下:

$posi: left;
div { border-#{$posi}: 1px solid $color;
}

默认变量

sass的默认变量是在值后面加上!default

示例:

$myLineHeight: 1.5 !default;
body{line-height: $myLineHeight; 
}

css:

body{line-height:1.5;
}

sass的默认变量一般是用来设置默认值,然后根据需求来覆盖的,覆盖的方式也很简单,只需要在默认变量之前重新声明下变量即可。

嵌套(Nesting)

Sass允许代码嵌套,用于选择后代。相对于css原生的后代选择器,嵌套样式的代码,会更加直观。

选择器嵌套

选择器嵌套:在一个选择器中嵌套另一个选择器来实现继承,增强了sass文件的结构性和可读性。

在选择器嵌套中,可以使用&表示父元素选择器,示例如下:

scss:

#top_btn{line-height: 40px;text-transform: capitalize;background-color:#333;li{float:left;}a{display: block;padding: 0 10px;color: #fff;&:hover{color:#ddd;}}
}

css:

#top_btn{line-height: 40px;text-transform: capitalize;background-color:#333;
}  
#top_btn li{float:left;
}
#top_btn a{display: block;padding: 0 10px;color: #fff;
}
#top_btn a:hover{color:#ddd;
}

属性嵌套

除了选择器可以嵌套,属性伪类也可以嵌套。

属性嵌套指的是有些属性拥有同一个开始单词,如border-width,border-color都是以border开头。

示例:

<div class="main-container"><div class="main-container-top"></div>
</div>

示例:

.main-container {   &-top {  // 选择器嵌套     background {      color: red;   //属性嵌套    }    &:hover {  // 伪类嵌套      color: green;   }  }}

混合(Mixins)

Mixins是CSS预处理器中语言中最强大的特性。

Mixins可以将一部分样式抽出,作为单独定义的模块,被很多选择器重复使用。

例如:某段CSS样式经常要用到多个元素中,在CSS预处理器语言中,可以为这些公用的CSS样式定义一个Mixin,然后在需要使用这些样式的地方直接调用定义好的Mixin。

这是一个非常有用的特性,Mixins 被当作一个公认的选择器,还可以在Mixins中定义变量或者默认参数。

声明的@mixin通过@include来调用。

无参数mixin

@mixin center-block {   margin-left:auto;    margin-right:auto;}.btn{    @include center-block;
}

css:

.btn{    margin-left:auto;    margin-right:auto;
}

有参数mixin

sass中使用@mixin声明混合,可以传递参数,参数名以$符号开始,也可以给参数设置默认值。

scss:

@mixin theme($theme: DarkGray) {background: $theme;box-shadow: 0 0 1px rgba($theme, .25);color: #fff;
}.info {@include theme;//参数使用默认值
}
.alert {@include theme($theme: DarkRed);
}
.success {@include theme($theme: DarkGreen);
}

css:

.info {background: DarkGray;box-shadow: 0 0 1px rgba(169, 169, 169, 0.25);color: #fff;
}.alert {background: DarkRed;box-shadow: 0 0 1px rgba(139, 0, 0, 0.25);color: #fff;
}.success {background: DarkGreen;box-shadow: 0 0 1px rgba(0, 100, 0, 0.25);color: #fff;
}

多个参数mixin

调用时可直接传入值,多个参数以逗号分开,如@include传入参数的个数小于@mixin定义参数的个数,则按照顺序表示,后面不足的使用默认值,如不足的没有默认值则报错。

当然,也可以选择性的传入参数,使用参数名与值同时传入。

sass:

@mixin btn($border:1px dashed #ccc, $padding:10px){border-bottom:$border;padding-top:$padding;padding-bottom:$padding;  
}
.imgtext-h li{@include btn(1px solid #ccc);
}
.imgtext-h--product li{@include btn($padding:15px);
}

css:

.imgtext-h li {border-bottom: 1px solid #cccccc;padding-top: 10px;padding-bottom: 10px;
}
.imgtext-h--product li {border-bottom: 1px dashed #cccccc;padding-top: 15px;padding-bottom: 15px;
}

模块系统(Modules)

test.scss:

$font-stack: Helvetica, sans-serif;
$primary-color: #333;body {font: 100% $font-stack;color: $primary-color;
}

styles.scss

// 使用@use导入文件
@use 'test'; // 生成了一个 test 命名空间.inverse {background-color: test.$primary-color;color: white;
}

css:

body {font: 100% Helvetica, sans-serif;color: #333;
}.inverse {background-color: #333;color: white;
}

当使用@use 一个文件时,Sass会根据文件名自动生成一个命名空间,如下:

@use 'btns'; // 生成了一个`btns` 命名空间
@use 'forms'; // 生成了一个 `forms` 命名空间

现在,可以同时访问btns.scss 和forms.scss中的成员变量。但是,这两个文件之间并不能互相访问变量。

由于导入的特性是带命名空间的,所以必须使用一个新的点号分割语法来访问它们:

 @include btns.submit();@include forms.input();

继承(Extend/Inheritance)

如果一个样式与另外一个样式几乎相同,只有少量的区别,则使用继承就显得很有用。

选择器继承

sass中,选择器继承可以让选择器继承另一个选择器的所有样式,并联合声明。使用选择器的继承,使用关键词@extend,后面紧跟需要继承的选择器。

scss:

/* This CSS will print because %message-shared is extended. */
%message-shared {border: 1px solid #ccc;padding: 10px;color: #333;
}// This CSS won't print because %equal-heights is never extended.
%equal-heights {display: flex;flex-wrap: wrap;
}.message {@extend %message-shared;
}.success {@extend %message-shared;border-color: green;
}.error {@extend %message-shared;border-color: red;
}.warning {@extend %message-shared;border-color: yellow;
}

css:

/* This CSS will print because %message-shared is extended. */
.message, .success, .error, .warning {border: 1px solid #ccc;padding: 10px;color: #333;
}.success {border-color: green;
}.error {border-color: red;
}.warning {border-color: yellow;
}

运算符(Operations)

CSS预处理器语言还具有运算的特性,也就是对数值型的Value(如:数字、颜色、变量等)进行加减乘除四则运算。

函数运算

示例:

scss:

x @use "sass:math";
​.container {display: flex;}​article[role="main"] { width: math.div(600px, 960px) * 100%;}​aside[role="complementary"] {  width: math.div(300px, 960px) * 100%;  margin-left: auto;}

css:

.container {  display: flex;
}
article[role="main"] {width: 62.5%;
}
aside[role="complementary"] {width: 31.25%;  margin-left: auto;
}

加减乘除

sass 也可以做各种数学计算(变量和属性)。

加减需注意必须相同单位,除法需要带括号。

示例:

$height: 10px;
div {width: 100px + 100px;height: $height + 70px;margin-top: 20px -10px;margin-left: 10px * 2;margin-right: (10px / 2);
}

字符运算

sass运用+做拼接字符串。

示例:

div:before {content: "hello" + "world";
}

逻辑控制

Sass中通过@if@else 实现条件判断来提供语言的流控制。

SASS中还实现了一个三目判断,语法为:if($condition, $if_true, $if_false)

三个参数分别表示:条件,条件为真的值,条件为假的值。

示例:

$type: monster;
h1 {@if $type == ocean {color: blue;} @else if $type == matador {color: red;} @else if $type == monster {color: green;} @else {color: black;}
}

循环语句

Sass支持for循环语句,通过@for@each@while来实现循环,配合maplist这两种数据类型可以实现多数编程语言提供的功能。

@for

Sass中使用for循环语句需要使用@for,并且配合“from”和“through”一起使用,基本语法:

@for $var from <start> through <end> {语句块}	

示例:

@for $i from 1 through 3 {.item-#{$i} { width: 2px * $i; }}	

css:

.item-1 {  width: 2px; }
.item-2 {  width: 4px; }
.item-3 {  width: 6px; } 

@each语句

@each循环语法:

@each $var in <list>{语句块}	

示例:

@each $fruits in apple, balana, orange, pineapple {.#{$fruits}-icon {background-image: url('/images/#{$fruits}.png');}
}	

css:

.apple-icon {  background-image: url('/images/apple.png'); }
.balana-icon {  background-image: url('/images/balana.png'); }
.orange-icon {  background-image: url('/images/orange.png'); }
.pineapple-icon {  background-image: url('/images/pineapple.png'); }

@while

@while循环,示例:

$i: 6;
@while $i > 0 {.item-#{$i} { width: 2px * $i; }$i: $i - 2;
}	

CSS:

.item-6 {  width: 12px; }
.item-4 {  width: 8px; }
.item-2 {  width: 4px; } 

颜色函数

lighten($color, 10%); /* 返回的颜色在$color基础上变亮10% */
darken($color, 10%);  /* 返回的颜色在$color基础上变暗10% */
saturate($color, 10%);   /* 返回的颜色在$color基础上饱和度增加10% */
desaturate($color, 10%); /* 返回的颜色在$color基础上饱和度减少10% */
grayscale($color);  /* 返回$color的灰度色*/
complement($color); /* 返回$color的补色 */
invert($color);     /* 返回$color的反相色 */
mix($color1, $color2, 50%); /* $color1 和 $color2 的 50% 混合色*/	

应用:

$color: #0982C1;
p {background: $color;border: 3px solid darken($color, 50%);/*边框颜色在$color的基础上变暗50%*/
} 

注释(Comment)

多行注释

/* *这是一个注释*/

单行注释

//我是注释

@import插值

Sass中只能在使用url()表达式时进行变量@import插值:

$device: mobile;
@import url(styles.#{$device}.css);

转换成css文件

style.scss 的 sass文件,可以转换(编译)成 style.css文件。

首先,创建一个Sass文件“test.scss”,并且将其放在对应的项目样式中。

然后,启动Ruby的Command控制面板,找到需要转译的Sass文件。

在对应的目录下输入下面的命令:

sass test.scss test.css
sass --watch test.scss:test.css

就会生成自动“test.css”文件,并自动更新对应的CSS样式文件。

LESS

LESS 转换(编译)像Sass这样的LESS文件,LESS的扩展名为".less"。

安装

客户端安装

在官网载一个Javascript脚本文件“less.js”,然后,在引入LESS源文件的HTML的中加入如下代码:

<link rel="stylesheet/less" type="text/css" href="文件路径/styles.less">
<script src="文件路径/less.js" type="text/javascript"></script> 

服务器安装

less需要在Node.js环境使用。

利用node的包管理器(npm)安装LESS,安装成功后就可以在Node环境中对LESS文件进行编译。

首先,安装node,安装成功后,启动node的Command控制面板,输入命令:

$ npm install less

回车后会自动安装好less。

变量(Variables)

Less:变量处理方式–懒加载,所有 Less 变量的计算,都是以这个变量最后一次被定义的值为准。

Less的变量名使用@符号开始,如下:

示例:

@width: 100px;
@height: @width + 50px;
@textcolor:red;
#header {width: @width;height: @height;
}
#footer{width: @width;height: @height;font-color:@textcolor;
}

变量可以设置默认值,示例如下:

.opacity(@opacity: 100) {opacity: @opacity / 100;filter: ~"alpha(opacity=@{opacity})";
}
.operateBtn {.opacity(50);
}

上面的DSL源代码(LESS)编译成css如下:

.operateBtn {opacity: 0.5;filter: alpha(opacity=50);
}

混合(Mixins)

在LESS中,混合是指将定义好的“ClassA”中引入另一个已经定义的“Class”,就像在当前的“Class”中增加一个属性一样。

不过LESS样式中声明Mixins和Sass声明方法不一样,更像是CSS定义样式,在LESS可以将Mixins看成是一个类选择器,Mixins也可以设置参数,并给参数设置默认值。

设置参数的变量名是使用“@”开头,同样参数和默认参数值之间需要使用冒号(:)分隔开。

无参数mixin

示例:

.btn {border-top: dotted 1px black;border-bottom: solid 2px black;
}
#menu a {color: #111;.btn();
}.post a {color: red;.btn();
}

有参数mixin

/*声明一个Mixin叫作“btn”*/
.btn(@myWidth:2px){border:@myWidth solid #f00;color: #000000;
}
/*调用btn Mixins*/
.generic-btn {.btn(); /*直接调用btn mixins*/
}
.login-btn {.btn(5px); /*调用btn mixins,并将参数@myWidth的值重定义为5px*/
}	

css:

.generic-btn {border: 2px solid #f00;color:#f00;
}
.login-btn {border:5px solid #f00;color: #f00;
} 

运算符(Operations)

CSS预处理器语言具有运算的特性,也就是对数值型的Value(如:数字、颜色、变量等)进行加减乘除四则运算。

例如:

@base: 5%;
@filler: @base * 2; // result is 10%
@other: @base + @filler; // result is 15%
@color: (#224488 / 2); // result is #112244
background-color: #112244 + #111; // result is #223355

计算calc() exception

@var: 50vh/2;
width: calc(50% + (@var - 20px));  // result is calc(50% + (25vh - 20px))

函数功能(Functions)

@base: #f04615;
@width: 0.5;.class {width: percentage(@width); // returns `50%`color: saturate(@base, 5%);background-color: spin(lighten(@base, 25%), 8);
}

嵌套(Nesting)

less:

#header {color: black;.navigation {font-size: 12px;}.logo {width: 300px;}
}

css:

#header {color: black;
}
#header .navigation {font-size: 12px;
}
#header .logo {width: 300px;
}

注释(Comment)

多行注释

/* *这是一个注释*/

单行注释

//我是注释

颜色函数

lighten(@color, 10%); /* 返回的颜色在@color基础上变亮10% */ 
darken(@color, 10%); /* 返回的颜色在@color基础上变暗10%*/ 
saturate(@color, 10%); /* 返回的颜色在@color基础上饱和度增加10% */ 
desaturate(@color, 10%); /* 返回的颜色在@color基础上饱和度降低10% */ 
spin(@color, 10); /* 返回的颜色在@color基础上色调增加10 */ 
spin(@color, -10); /* 返回的颜色在@color基础上色调减少10 */ 
mix(@color1, @color2); /* 返回的颜色是@color1和@color2两者的混合色 */ 

应用:

@color: #0982C1;
p {background: @color;border: 3px solid darken(@color, 50%);/*边框颜色在@color的基础上变暗50%*/
} 

@import插值

Less中可以在字符串中进行插值:

@device: mobile;
@import "styles.@{device}.css";

逻辑控制

LESS中通过guarded mixins代替if/else,利用关键词“when”来实现简单的条件判断。

示例如下:

less:

.mixin (@a) when (lightness(@a) >= 50%) {background-color: black;
}
.mixin (@a) when (lightness(@a) < 50%) {background-color: white;
}
.mixin (@a) {color: @a;
}

循环语句

LESS并没支持for循环语句,但是,在LESS中可以使用When来模拟出for循环的特性。

示例:

.loopingClass (@index) when (@index > 0) {.myStyle {z-index: @index;}// 递归.loopingClass(@index - 1);
}// 停止循环
.loopingClass (0) {}// 输出
.loopingClass (3);	

css:

.myStyle {z-index: 3;}
.myStyle {z-index: 2;}
.myStyle {z-index: 1;} 

@import

@import的作用是从其他样式表导入样式,用来引入外部样式文件。

除了基本的功能外,LESS引入了import选项来扩展@import的语法。语法如下:

less:

@import "library"; // library.less
@import "typo.css";
@import (keyword) "filename";

其中keyword可以是如下几种选项(可以联合使用):
1.**reference:**使用一个外部文件参与编译,但不输出其内容。
2.**inline:**直接将引入的文件放入输出文件中,但不处理这个引入的文件。
3.**less:**不管文件扩展名是什么都将该文件作为一个LESS文件处理。
4.**css:**不管文件扩展名是什么都将该文件作为一个CSS文件处理。
5.**once:**只引入文件一次(去重),这是默认方式。
6.**multiple:**可以引入文件多次。

不建议使用import,因 import 的 CSS 文件只有在当前 CSS 文件被下载、解析完成之后,浏览器才会开始下载 import 的 CSS 文件,破坏了并行下载样式文件。

作用域

LESS中的作用域和其他程序语言中的作用域非常的相同,首先会查找局部定义的变量,如果没有找到,会像冒泡一样,一级一级往上查找,直到根为止。

示例:

@color: red;
.scoped {@bg: blue;@color: white;color: @color;background-color:@bg;
}
.unscoped {color:@color;
} 

css:

.scoped {color:white;/*白色(调用了局部变量)*/background-color:blue;
}
.unscoped {color:red;/*红色(调用了全局变量)*/
} 

转换成css文件

style.lessless 文件,可以转换(编译)成 style.css文件。

在安装的Node JS环境下通过其自己的命令来进行转译:

$ lessc test.less 

上面的命令会将编译的CSS传递给stdout,可以将它保存到一个文件中:

$ lessc test.less > test.css 

Stylus

Stylus的扩展名为".styl"。

Stylus可以利用缩进代替花括号,空格也有着重要的意义。

安装

Stylus的安装和LESS在服务器端的安装很相似,先安装Node 。

然后,在Node的Command控制面板输入命令:

 $ npm install stylus

回车后会自动安装好stylus。

语法

/* style.styl *//* 类似标准语法 */
p {color: #ffffff;
}/* omit brackets 省略花括号*/
pcolor: #ffffff;/* omit colons and semi-colons 省略花括号和分号 */
pcolor #ffffff

变量(Variables)

Stylus对变量名没有任何限定,可以是$开始,也可以是任意字符,而且与变量值之间可以用冒号、空格隔开。

需要注意的是 Stylus (0.22.4) 将会编译 @ 开始的变量,但其对应的值并不会赋予该变量,换句话说,在 Stylus 的变量名不要用 @ 开头。

示例:

size = 10px
.topwidth: sizesize = 20px
.btnwidth: size

css:

.top {width: 10px;
}
.btn {width: 20px;
}

Stylus还有一个独特功能,不需要分配值给变量就可以定义引用属性:

示例:

#logo                             position  absolute              top  50%                        left  50%                        width  w = 150px                 height  h = 80px                  margin-left  -(w / 2)            margin-top  -(h / 2)                                                  	                                               	

css:

#logo {position:absolute;top:50%;left:50%;width:150px;height:80px;margin-left:-75px;margin-top:-40px;
} 

混合(Mixins)

Stylus中的混合和前两款CSS预处理器语言的混合略有不同,可以不使用任何符号,就是直接声明Mixins名,然后在定义参数和默认值之间用等号(=)来连接。

/*声明一个Mixin叫作“btn”*/
btn(myWidth=2px){border:myWidth solid #f00;color: #f00;
}
/*调用btn Mixins*/
.generic-btn {btn();/*直接调用btn mixins*/
}
.login-btn {btn(5px);/*调用btn mixins,并将参数myWidth的值重定义为5px*/
}

css:

.generic-btn {border: 2px solid #f00;color:#f00;
}
.login-btn {border:5px solid #f00;color: #f00;
} 

作用域

Stylus作用域的特性和LESS一样,可以支持全局变量和局变量,会向上冒泡查找,直到根为止。

逻辑控制

Stylus中通过if、else if、else、unless(基本与if相反)实现条件判断来提供语言的流控制,通过for/in实现循环迭代。

可以在样式中省略大括号({})。

示例:

box(x, y, margin = false)padding y xif marginmargin y xelsepadding y x	
bodybox(5px, 10px, true)	

循环语句

Stylus样式中通过for/in对表达式进行循环,形式如下:

for <val-name> [, <key-name>] in <expression>	

使用示例:

bodycolors = red pink yellow bluefor col, i in colorsfoo i col	

CSS:

body {foo: 0 red;foo: 1 pink;foo: 2 yellow;foo: 3 blue;
} 

注释(Comment)

多行注释

/* *这是一个注释*/

单行注释

//我是注释

多行缓冲注释

多行缓冲注释跟多行注释类似,不同之处在于始的时候,这里是”/*!”。

相当于告诉Stylus压缩的时候这段无视直接输出。

/*!
*给定数值合体
*/
add(a, b)a + b	

颜色函数

lighten(color, 10%); /* 返回的颜色在'color'基础上变亮10% */
darken(color, 10%);  /* 返回的颜色在'color'基础上变暗10% */
saturate(color, 10%);   /* 返回的颜色在'color'基础上饱和度增加10% */
desaturate(color, 10%); /* 返回的颜色在'color'基础上饱和度降低10% */

应用:

color = #0982C1
pbackground colorborder 3px solid darken(color, 50%)  

@import插值

Stylus中没有@import插值,但是可以利用其字符串拼接的功能实现:

stylus:

device = "mobile"
@import "styles." + device + ".css"

转换成css文件

Stylus具有可执行性,因此Stylus能将自身转换成CSS。

Stylus可以读取自“stdin”输出到“stdout”,可以像下面转译源文件:

$ stylus –compress  <some.styl> some.css  

Stylus也像Sass一样,同时接受单个文件和整个目录的转译。

例如:一个目录名为“css”将在同一个目录编译并输出“.css”文件。

$ stylus css  

下面的命令将输出到“./public/stylesheets”:

$ stylus css –out public/stylesheets  

还可以同时转译多个文件:

$ stylus one.styl two.styl 

如果浏览器安装了Firebug,那么可以使用FireStylus扩展:

$ stylus –firebug <path>

Sass的变量处理方式和Stylus相同,变量值输出时根据之前最近的一次定义计算。这其实代表了两种理念:Less 更倾向接近 CSS 的声明式,计算过程弱化调用时机;而 Sass 和 Stylus 更倾向于指令式。

如果在Less中引入第三方样式库,可以通过重新配置变量来改变样式。

优点:stylus和sass这样的处理会不容易受多个第三方库变量名冲突的影响,因为一个变量不能影响在定义它以前的输出样式。

预处理器实现原理

在这里插入图片描述

预处理器优缺点

  • 优点:语言级逻辑处理,动态特性,改善项目结构
  • 缺点:采用特殊语法,框架耦合度高,复杂度高

http://chatgpt.dhexx.cn/article/N8gUZ9uG.shtml

相关文章

【CSS】css快速更改某个字体图标,使用content插入字符

遇到一个小问题&#xff1a;使用的是组件库&#xff0c;但是这个组件没有提供更改图标的接口&#xff0c;需要更改这个特定的图标&#xff0c;但是最好不更改dom 解决办法 由于系统已经使用了这个组件库&#xff0c;那么就有了他的图标内容&#xff0c;可以先到组件库官网找到…

W3C推荐的新布局模式 【CSS Flex布局】详解

本文目录 概述属性弹性容器的属性&#xff08;父级&#xff09;displayflex-directionflex-wrapflex-flowjustify-contentalign-itemsalign-contentgap, row-gap, column-gap 弹性项目的属性&#xff08;子项&#xff09;orderflex-growflex-shrinkflex-basisflexalign-self 示…

CSS变量(CSS Variables)

概述 如果突然有一天,当你页面的主题色发生变化时,有许多元素的颜色要一起变化,这是你会考虑怎么做呢?使用Less/Sass/Stylus来定义一个颜色变量?还是专门去定义多了个类名来控制元素? 使用第一种方法,有他的弊端,浏览器无法识别CSS预处理器的语法,所以我们都会将Less…

详细介绍css3中的变量使用

CSS3新功能之变量&#xff1a;variables css3为我们提供了一个强大的功能自定义属性&#xff0c;也就是变量&#xff0c;他能让我们更改色系、皮肤、自适配变得简单。我们只需要更改一些我们事先定义好的变量就可以轻松实现各种效果。特别是我们在开发大型项目的时候有多处使用…

详解CSS(一)

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、的博客 &#x1f6fa;系列专栏&#xff1a;CSS专栏 &#x1f6b2;给大家推荐一个网站&#x1f609;很实用&#x1f61a;我…

读书笔记《MySQL技术内幕:InnoDB存储引擎》第5章 索引与算法

索引是应用程序设计和开发的一个重要方面。若索引太多&#xff0c;应用程序的性能可能会受到影响。而索引太少&#xff0c;对查询性能又会产生影响。要找到一个合适的平衡点&#xff0c;这对应用程序的性能至关重要。 一些开发人员总是在事后才想起添加索引——我一直认为&…

32.项目总结--技术点部分

项目整体架构 Docker 虚拟化容器计数,Docker基于镜像,可以秒级启动各种容器,每一种容器都是一个完整的运行环境,容器之间相互隔离; 安装docker 安装前卸载原有的docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-lat…

【HCIA-Datacom V1.0培训教材】广域网技术

局域网LAN&#xff08;Local Area Network&#xff09; 广域网WAN&#xff08;Wide Area Network&#xff09; 数字数据网DDN&#xff08;Digital Data Network&#xff09; 帧中继FR(Frame Relay) 同步数字结构SDH&#xff08;Synchronous Digital Hierachy&#xff09; …

一文了解Docker容器技术的操作

一文了解Docker容器技术的操作 前言 相信点进这篇文章的Coder&#xff0c;不管是在各大技术论坛上、技术交流群&#xff0c;亦或招聘网上&#xff0c;应该都有见到过Doker容器技术的面孔&#xff0c;随着社会节奏的加快以及迫于生活的压力&#xff0c;在计算机技术日新月异的今…

自然语言处理简介(1)---- 服务梳理与传统汉语分词

文章大纲 1.Nlp技术体系简介1.1 基础技术1.2 Nlp 核心技术1.3 NlP&#xff08;高端技术&#xff09; 2.知名NLP 服务系统简介2.1汉语分词系统ICTCLAS2.2 哈工大语言云&#xff08;Language Technology Platform&#xff0c;LTP&#xff09;2.3 Amazon Comprehend2.4 阿里云NLP2…

微服务技术栈学习笔记(自用)

微服务技术栈学习笔记&#xff08;自用&#xff09; 文章目录 微服务技术栈学习笔记&#xff08;自用&#xff09;1.导学2.Eureka2.1微服务远程调用&#xff1a;2.2搭建Eureka 3.Ribbon负载均衡4.Nacos4.1服务注册4.2 分级存储 5.Feign6.Gateway6.1搭建6.2路由断言工厂6.3 过滤…

自然语言处理技术

自然语言处理技术&#xff08;NLP&#xff09;在推荐系统中的应用 NLP 推荐系统 词袋模型 阅读7798 作者&#xff1a; 张相於&#xff0c;58集团算法架构师&#xff0c;转转搜索推荐部负责人&#xff0c;负责搜索、推荐以及算法相关工作。多年来主要从事推荐系统以及机器学习…

Java.mob.org.cn搜索_探讨Android全文检索技术

原标题&#xff1a;探讨Android全文检索技术 写在前面 客户端本地存储数据一般使用的存储方式是&#xff1a;文件、SharedPreference、数据库(SQLite) 如果我们要做一些查询的操作&#xff0c;对于文件的方式&#xff0c;通过序列化和反序列化来进行数据的增删改查操作&#xf…

seg:NLP之正向最大匹配分词

已迁移到我新博客,阅读体验更佳seg:NLP之正向最大匹配分词 完整代码实现放在我的github上:click me 一、任务要求 实现一个基于词典与规则的汉语自动分词系统。 二、技术路线 采用正向最大匹配(FMM)方法对输入的中文语句进行分词&#xff0c;具体的实现可以分为下面几个步骤&am…

Elasticsearch搜索技术实战

elasticsearch下载安装 本篇前述的ES版本是7.14.2&#xff0c;实现了与Mysql的数据同步&#xff0c;ES端的搜索与分词&#xff1b;后来由于和Springcloud&#xff08;spring-data-elasticsearch:3.0.6&#xff09;集成发现版本问题&#xff0c;换成ES5.5.0&#xff0c;所以完整…

Docker技术

在这里插入代码片# Docker 官方文档地址:https://www.docker.com/get-started 中文参考手册:https://docker_practice.gitee.io/zh-cn/ 1.什么是 Docker 1.1 官方定义 最新官网首页 # 1.官方介绍 - We have a complete container solution for you - no matter who you are…

Elasticsearch - 文档分析,IK分词器;文档冲突(十二)

阅读本文前可先参考 Elasticsearch - Elasticsearch详解&#xff1b;安装部署&#xff08;一&#xff09;_MinggeQingchun的博客-CSDN博客 https://blog.csdn.net/MinggeQingchun/article/details/126855747 一、文档分析 文档分析过程如下&#xff1a; 1、将一块文本分成适…

springboot+Elasticsearch实现word,pdf,txt内容抽取并高亮分词全文检索

文章目录 需求 一、环境 二、功能实现 1.搭建环境 2.文件内容识别 三.代码 需求 产品希望我们这边能够实现用户上传PDF,WORD,TXT之内得文本内容&#xff0c;然后用户可以根据附件名称或文件内容模糊查询文件信息&#xff0c;并可以在线查看文件内容 一、环境 项目开发环境&…

使用lucce分词怎么_ElasticSearch 分词器,了解一下

这篇文章主要来介绍下什么是 Analysis &#xff0c;什么是分词器&#xff0c;以及 ElasticSearch 自带的分词器是怎么工作的&#xff0c;最后会介绍下中文分词是怎么做的。 首先来说下什么是 Analysis&#xff1a; 什么是 Analysis&#xff1f; 顾名思义&#xff0c;文本分析就…

自然语言处理 # 中文分词技术 概述

定义 中文分词&#xff08;Chinese Word Segmentation&#xff09;就是将连续的字序列按照一定的规范重新组合成词序列的过程。 Ques:为什么要分词&#xff1f; Ans: 词是最小的能够独立运用的语言单位 Ques:什么是独立运用呢&#xff1f; Ans:它可以解释为“单独做句法成分或…