SCSS

SCSS(Sassy CSS)是 Sass 的一种语法,是一种扩展的 CSS 预处理器语言。SCSS 提供了许多强大的功能,使得编写 CSS 更加高效、可维护和模块化。

注释

1// 单行注释
2/*
3多行注释
4*/

$ 变量

在 scss 中,变量使用 $ 作为前缀来定义,用于存储可重用的值,例如颜色、字体大小、间距等。例如:

1$color: #007bff; // 定义变量
2.bg {
3  background-color: $color; // 使用变量
4}

私有变量 开发者会在变量名前加下划线(_-)来表示该变量是内部使用的,建议不在其他模块中使用。

1$-radius: 3px;
2// 或
3$_radius: 3px;

-- 自定义属性

自定义属性通常在选择器中使用 -- 前缀进行定义,并且可以在任何选择器中定义 var() 是用于引用 CSS 自定义属性

1$primary-color: #3498db;
2$font-size: 16px;
3:root {
4  --primary-color: #{$primary-color};
5  --font-size: #{$font-size};
6}
7body {
8  color: var(--primary-color);
9  font-size: var(--font-size);
10}

#{} 字符串插值

在 SCSS 中,#{} 是一种字符串插值语法,用于将 SCSS 变量的值插入到一个字符串中

1@mixin define-emoji($name, $glyph) {
2  span.emoji-#{$name} {
3    font-family: IconFont;
4    font-variant: normal;
5    font-weight: normal;
6    content: $glyph;
7  }
8}
1@include define-emoji("test")

@mixin 混合宏

在 scss 中,mixin 用于定义可重用的样式块,在定义时不会生成任何 CSS,只有在被调用时才会插入到调用的位置。

  1. 定义:使用 @mixin 指令来定义一个mixin,可以包含任何css规则,并且可以接受参数。
  2. 使用:通过 @include 指令来调用 mixin,并传递必要的参数。
1@mixin theme($theme: DarkGray) {
2  background: $theme;
3  box-shadow: 0 0 1px rgba($theme, .25);
4  color: #fff;
5}
1.info {
2  @include theme;
3}
4.alert {
5  @include theme($theme: DarkRed);
6}

:::

& 父选择器

在 SCSS 中,父选择器(&)是一个非常有用的特性,它允许你在嵌套规则中引用父选择器。

1.alert {
2  &:hover {
3    font-weight: bold;
4  }
5}

% 占位符选择器

占位符选择器(%)是一种特殊的选择器,它不会单独出现在编译后的 CSS 中,只有在被 @extend 时才会插入样式。使用占位符选择器可以避免生成冗余的选择器。

1%hidden {
2  visibility: hidden;
3  display: none;
4}
5.element {
6  @extend %hidden;
7}

@extend 继承

在 SCSS 中,扩展和继承是通过 @extend 指令实现的。@extend 允许一个选择器继承另一个选择器的样式规则,从而减少重复代码,提高样式的可维护性和一致性。 @extend 指令用于让一个选择器继承另一个选择器的样式。

1%message-shared {
2  border: 1px solid #ccc;
3  padding: 10px;
4  color: #333;
5}
6.error {
7  @extend %message-shared;
8  border-color: red;
9}

@use 模块

在 scss 中,@use 指令用于引入一个 SCSS 文件,并将其内容放置在一个命名空间下。默认情况下,文件名会作为命名空间。 引入的 SCSS文件一般是以 _ 开头命名的文件,例如 _var.scss。下划线让 Sass 知道该文件只是部分文件,不应将其生成为 CSS 文件。

1// _base.scss
2$font-stack: Helvetica, sans-serif;
3$primary-color: #333;
4body {
5  font: 100% $font-stack;
6  color: $primary-color;
7}
1@use 'base'; // base是 _base.scss 文件的命名空间
2.inverse {
3  background-color: base.$primary-color;
4  color: white;
5}
1@use '/styles/base' as b; // 你也可以使用 as 关键字来自定义命名空间
2.inverse {
3  background-color: b.$primary-color;
4  color: white;
5}

::: 配置共享样式

  1. 在模块中,使用 !default 标记变量,表示这些变量可以被外部配置覆盖。
  2. 在需要使用这些变量的文件中,通过 @use 指令引入模块,并使用 with 语法传递新的值。
1// _config.scss
2$primary-color: #3498db !default;
3$font-size: 16px !default;
4// _styles.scss
5@use 'config' with (
6  $primary-color: #e74c3c,
7  $font-size: 18px
8);
9body {
10  color: config.$primary-color;
11  font-size: config.$font-size;
12}

@function 函数

SCSS 允许你定义自己的函数,用于生成动态样式值。

1@function calculate-rem($size) {
2  @return $size / 16px * 1rem;
3}
4body {
5  font-size: calculate-rem(18px);
6}

嵌套

SCSS 允许你嵌套 CSS 选择器,使得样式结构更加清晰和层次化。

1ul {
2  li {
3    margin: 0;
4    padding: 0;
5  }
6}

运算

SCSS 提供了一系列运算符,用于在样式中进行数学运算和字符串操作。

  • 数学运算符:+-*/%
  • 逻辑运算符:andornot
  • 比较运算符:==!=<><=>=
1$base-margin: 10px;
2$extra-margin: 5px;
3.margin {
4  margin: $base-margin + $extra-margin; // 结果为 15px
5}
1$condition-1: true;
2$condition-2: false;
3@if $condition-1 and not $condition-2 {
4  .box {
5    display: block;
6  }
7}
1$width: 100px;
2@if $width > 50px {
3  .wide {
4    width: $width;
5  }
6}

:::

条件

SCSS 中的 @if 指令是一种控制结构,用于根据条件执行不同的样式规则。@if 指令允许你在样式表中使用条件逻辑,从而创建更灵活和动态的样式。

1$theme: dark;
2body {
3  @if $theme == dark {
4    background-color: #333;
5    color: #fff;
6  } @else {
7    background-color: #fff;
8    color: #000;
9  }
10}

循环

  • @each:用于遍历列表或映射。适合处理一组已知的离散值。
  • @for:用于在固定范围内循环。适合处理连续的数值范围。
  • @while:用于在条件为真时循环。适合处理动态或不确定的循环条件。

@for 循环

@for 指令用于在给定范围内循环遍历,并生成样式。它有两种形式:from ... throughfrom ... to

  • from ... through 包括结束值。
  • from ... to 不包括结束值。
1@for $i from 1 through 3 {
2  .col-#{$i} {
3    width: 100% / 3 * $i;
4  }
5}
1@for $i from 1 to 4 {
2  .item-#{$i} {
3    margin-left: 10px * $i;
4  }
5}

:::

@while 循环

@while 指令用于在条件为真时重复执行代码块。它可以用于需要动态条件的循环。

1$i: 1;
2@while $i < 4 {
3  .box-#{$i} {
4    padding: 5px * $i;
5  }
6  $i: $i + 1;
7}

@each 遍循环

在 SCSS 中,@each 指令用于遍历列表或映射,并为每个元素生成样式规则。@each 指令使得处理重复样式和动态生成样式变得更加简单和高效。

1$colors: red, green, blue;
2@each $color in $colors {
3  .text-#{$color} {
4    color: $color;
5  }
6}
1$theme-colors: (
2  primary: #3498db,
3  secondary: #2ecc71,
4  danger: #e74c3c
5);
6@each $name, $color in $theme-colors {
7  .bg-#{$name} {
8    background-color: $color;
9  }
10}

:::