前端架构师技术之Sass

1 CSS 缺点

CSS 仅仅是一个标记语言,不是编程语言,因此不可以自定义变量,也不可以引用。CSS 主要有以下缺点。

  • CSS 是一门非程序式语言,没有变量、函数、SCOPE(作用域)等概念。
  • CSS 需要书写大量看似没有逻辑的代码,代码冗余度是比较高的。
  • CSS 没有很好的计算能力。
  • 不方便维护及扩展,不利于复用。

2 什么是 Sass

为了解决 CSS 在实际开发过程中存在的问题,我们可以使用 Sass(CSS预处理器) 来实现页面的样式。

  • Sass 是一款成熟、稳定、强大的专业级 CSS 扩展语言。
  • 它是一款强化 CSS 的辅助工具。
  • 在 CSS 语法的基础上增加了变量(variables)、嵌套(nestedrules)、混合(mixins)、导入(inline imports)等高级功能,让 CSS 更加强大与优雅。
  • 使用 Sass 以及 Sass 的样式库(如Compass)有助于更好地组织管理样式文件,以及更高效地开发项目。
  • Sass 完全兼容所有版本的 CSS。

总的来说就是:写更少的代码,实现更多的样式。

3 Sass 编译

  • Sass在线编译工具 使用工具进行编译

  • VScode 下载安装 Easy Sass 插件,进行自动编译

  • VScode 下载安装 Live Sass Compilerv 插件,进行自动编译

json 复制代码
// Live Sass 配置
"liveSassCompile.settings.generateMap": false,
"liveSassCompile.settings.autoprefix": [
    "> 1%",
    "last 2 versions"
],
"liveSassCompile.settings.excludeList": [
    "**",
    "**/node_modules/**",
    ".vscode/**"
],
"liveSassCompile.settings.formats": [
    {
        "format": "compressed",
        // "format": "expanded",
        "extensionName": ".min.css",
        "savePath": "~/../css/"
    }
]

4 Sass 基本用法

4.1 Sass 语法格式

  • 一种是最早的 Sass 语法格式,被称为缩进格式(Indented Sass),通常简称"Sass",是一种简化格式。这种格式以".sass"作为扩展名。(不再推荐使用)
  • 另一种语法格式是SCSS(SassyCSS),这种格式仅在 CSS3 语法的基础上进行拓展,所有 CSS3 语法在 SCSS 中都是通用的,同时加入 Sass 的特色功能。这种格式以".scss"作为扩展名。(目前使用)

4.2 Sass 变量

**Sass 使用""符号来标识变量**,如 highlight-color 和 $sidebar-width。

Sass 变量的声明和 CSS 属性的声明比较相似。

scss 复制代码
$color: #F90;

任何可以用作 CSS 属性值的赋值都可以用作 Sass 的变量值,甚至是以空格或逗号分割多个属性值。

scss 复制代码
$basic-border: 1px solid black;
$plain-font: "Myriad Pro", "Myriad", "Helvetica", "Neue", "Helvetica";

在变量定义完成之后,这时变量还没有生效,除非引用这个变量。

凡是 CSS 属性的标准值(如 1px 或者 bold)可存在的地方,变量就可以使用。

CSS生成时,变量会被它们的值所替代。之后,如果需要一个不同的值,只需要改变这个变量的值,那么所有引用此变量的地方生成的值都会随之改变。

scss 复制代码
$color: #F90;
.selected {
  border: 1px solid $color;
}

特殊变量:如果变量需要镶嵌在字符串之中,就必须需要写在 #{} 之中。

scss 复制代码
$side: left;
.rounded {
    border-#{$side}-radius: 5px;
}

4.3 Sass 运算

Sass 支持数字的加(+)、减(-)、乘(*)、除(/)和取余(%)等运算,如果必要时会在不同单位间进行值的转换,例如,将 1in + 8pt 转换为 1.111in(pt 全称为 point,是一个自然界的长度单位,1in=72pt。根据此公式 1in+8pt 转换后的结果为 1.111in)。

scss 复制代码
// 编译前
p {
    width: 1in + 8pt;
}
// 编译后
p {
    width: 1.111in; 
}

"/"符号在 CSS 中通常起到分隔数字的用途,而在 Sass 中同时也赋予了"/"除法运算的功能,但两者并不会冲突。

也就是说,如果"/"在 Sass 中把两个数字分隔,编译后的 CSS 文件中也是同样的作用。

scss 复制代码
// 编译前
p {
    font: 10px/8px;
    $width: 1000px;
    width: $width/2;
    height: (500px/2); 
    margin-left: 5px + 8px/2px; 
}
// 编译后
p {
    font: 10px/8px;
    width: 500px;
    height: 250px;
    margin-left: 9px; 
}

编译使用了 "/" 运算符号的代码,font 编译后的结果不变,这是因为没有被圆括号包裹。

如果需要使用变量,同时又要确保 "/" 符号不做除法运算而是完整地编译到 CSS 文件中,只需要用 #{} 插值语句将变量包裹。

scss 复制代码
p {
    $font-size: 12px;
    $line-height: 30px;
    font: #{$font-size}/#{$line-height};
}
  • 正常值用 "/" 运算,需要用圆括号包裹
  • 变量值不用 "/" 运算,需要用 #{} 插值语句将变量包裹

4.4 Sass 嵌套

Sass 基于变量提供了更为强大的工具,即规则嵌套。

只有当 Sass 变量与规则嵌套一起使用时,才能发挥其更大的作用。

在使用 CSS 编写代码时,我们知道重复写选择器是非常烦琐的。

例如,要写一大串指向页面中同一块的样式时,往往需要一遍又一遍地写同一个 ID 或 类名 来实现。

css 复制代码
#content article h1 { color: #333 }
#content article p { margin-bottom: 1.4em }
#content aside { background-color: #eee }

.box article h1 { color: #333 }
.box article p { margin-bottom: 1.4em }
.box aside { background-color: #eee }

Sass 在编译输出 CSS 时会自动把这些嵌套规则处理好,避免代码的重复书写,且使样式的可读性更高。Sass 可以只写一遍来实现。

scss 复制代码
#content {
    article {
        h1 { color: #333 }
        p { margin-bottom: 1.4em }
    }
    aside { background-color: #eee }
}
.box {
    article {
        h1 { color: #333 }
        p { margin-bottom: 1.4em }
    }
    aside { background-color: #eee }
}

属性也可以嵌套,比如 border-color 属性,可以写成

scss 复制代码
// 编译前
.box {
    border: {
        color: red;
    }
}
// 编译后
.box {
    border-color: red;
}

注意:嵌套属性(border)后面必须加上冒号。

在嵌套的代码块内,可以使用 & 引用父元素。比如 :hover 伪类,可以写成

scss 复制代码
// 编译前
.box {
    &:hover { color: red; }
}
// 编译后
.box:hover {
    color: red;
}

4.4 Sass 注释

Sass 有两种注释风格

  • 单行注释 // 注释 只保留在 Sass 源文件中,不会保留在编译后的文件中。
  • 标准 CSS 注释 /* 注释 */, 会保留到编译后的文件中,压缩则删除。
    • 在标准注释后面加入一个感叹号,/*! 重要注释 */ 表示重要注释,压缩模式也会保留注释,用于版权声明等。

5 代码的重用

5.1 Sass 继承

Sass 中,继承可以让一个选择器继承另一个选择器的所有样式,继承使用 @extend 命令。

scss 复制代码
// 编译前
.alert{
    padding: 15px;
}

.alert a{
    text-decoration: none;
}

.alert-info{
    @extend .alert;
    background-color: lightblue;
}
// 编译后
.alert, .alert-info {
  padding: 15px;
}

.alert a, .alert-info a {
  text-decoration: none;
}

.alert-info {
  background-color: lightblue;
}

使用占位符选择器 %,从 Sass 3.2.0 后,就可以定义占位选择器 %,这个的优势在于,不调用不会有多余的 CSS 文件。

scss 复制代码
// 编译前
%h1 {
    font-size:20px;
}
div {
    @extend %h1;
    color:red;
}
// 编译后
div {
    font-size:20px;
    color:red;
}

5.2 混合(Mixin)

Mixin 是可以重用的代码块。

  • 使用 @mixin 命令,定义一个代码块。
  • 使用 @include 命令,调用这个mixin。
scss 复制代码
@mixin alert {
    color:#ccc;
    background-color:red;
}
div {
    @include alert;
}

Mxin 的强大之处,在于可以指定参数和缺省值,使用的时候,根据需要加入参数。

scss 复制代码
@mixin alert($color:red) {
    color:#ccc;
    background-color:$color;
}
div {
    @include alert(blue);
}

可以用 Mixin 来生成浏览器前缀。

scss 复制代码
// 设置关键帧
@mixin keyframes($name) {
    @-webkit-keyframes #{$name} {
        @content;
    }
    @-moz-keyframes #{$name} {
        @content;
    }
    @-o-keyframes #{$name} {
        @content;
    }
    @keyframes #{$name} {
        @content;
    }
}
// 引入
@include keyframes(scale) {
    100% {
        transform: scale(0.8);
    }
}
// css编译后
@-webkit-keyframes scale {
    100% {
        transform: scale(0.8);
    }
}
@-moz-keyframes scale {
    100% {
        transform: scale(0.8);
    }
}
@-o-keyframes scale {
    100% {
        transform: scale(0.8);
    }
}
@keyframes scale {
    100% {
        transform: scale(0.8);
    }
}
scss 复制代码
@mixin rounded($attr, $value) {
    #{$attr}: $value;
    -moz-#{$attr}: $value;
    -webkit-#{$attr}: $value;
}
#navbar li {
    @include rounded(border-radius, 8px);
}

5.3 颜色函数

Sass 提供了一些内置的颜色函数,以便生成系列颜色。

scss 复制代码
lighten(#cc3, 10%) // #d6d65c
darken(#cc3, 10%) // #a3a329
grayscale(#cc3) // #808080
complement(#cc3) // #33c

5.4 插入文件

使用 @import 命令引入外部文件, 引入后,可使用外部文件中的变量等。

scss 复制代码
@import "base.scss";

如果插入的是 .css 文件,则等同于 CSS 的 import 命令。

scss 复制代码
@import "base.css";

6 高级用法

6.1 条件语句

@if 可以用来判断,配套的还有 @else 命令

scss 复制代码
// Sass样式
$type: monster;
div {
    @if $type == ocean {
        color: blue;
    } @else if $type == matador {
        color: red;
    } @else if $type == monster {
        color: green;
    } @else {
        color: black;
    }
}
// css编译后样式
div {
    color: green;
}

**三目判断:**语法为 if(condition, if_true, $if_false)

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

scss 复制代码
if(true, 1px, 2px) => 1px
if(false, 1px, 2px) => 2px

$box: red;
$fontSize: if($box==red, 16px, 14px);
.box {
    font-size: $fontSize;
}

6.2 循环语句

for 循环,有两种形式,分别为:

  • @for $var from <start> through <end>

  • @for $var from <start> to <end>

$var 表示变量,start 表示开始值,end 表示结束值,两种形式的区别在于 through 包括 end 的值,to 不包括 end 值。

scss 复制代码
@for $i from 1 to 10 {
    .border-#{$i} {
        border: #{$i}px solid blue;
    }
}

while 循环

scss 复制代码
$i: 6;
@while $i > 0 {
    .item-#{$i} {
        width: 2em * $i;
    }
    $i: $i - 2;
}

each 命令,作用与 for 类似

  • 语法为 @each $var in <list or map>

  • 其中 $var 表示变量

scss 复制代码
@each $member in a, b, c, d {
    .#{$member} {
        background-image: url("/image/#{$member}.jpg");
    }
}

6.3 自定义函数

Sass 允许用户编写自己的函数,以 @function 开始,用 @return 返回值。

scss 复制代码
// 常规用法
@function double($n) {
    @return $n * 2;
}
#sidebar {
    width: double(5px);
}

// 常用用法
$fontSize: 100px;
@function pxTorem($px) {
    @return $px / $fontSize * 1rem;
}
div {
    font-size: pxTorem(24px);
}
// css编译后样式
div {
    font-size: .24rem;
}

7 练习作业

  • 使用 Sass 语法优化移动端样式表
相关推荐
zengyuhan50319 分钟前
Windows BLE 开发指南(Rust windows-rs)
前端·rust
醉方休22 分钟前
Webpack loader 的执行机制
前端·webpack·rust
前端老宋Running30 分钟前
一次从“卡顿地狱”到“丝般顺滑”的 React 搜索优化实战
前端·react.js·掘金日报
隔壁的大叔30 分钟前
如何自己构建一个Markdown增量渲染器
前端·javascript
用户44455436542633 分钟前
Android的自定义View
前端
WILLF33 分钟前
HTML iframe 标签
前端·javascript
枫,为落叶1 小时前
Axios使用教程(一)
前端
小章鱼学前端1 小时前
2025 年最新 Fabric.js 实战:一个完整可上线的图片选区标注组件(含全部源码).
前端·vue.js
ohyeah1 小时前
JavaScript 词法作用域、作用域链与闭包:从代码看机制
前端·javascript
流星稍逝1 小时前
手搓一个简简单单进度条
前端