1. SCSS Script
1.1. 变量$
变量以美元符号开头,赋值方法与 CSS 属性的写法一样:
$width: 5em;
#main {
width: $width; // 直接使用即调用变量
}
变量支持块级作用域,嵌套规则内定义的变量只能在嵌套规则内使用(局部变量),不在嵌套规则内定义的变量则可在任何地方使用(全局变量)。将局部变量转换为全局变量可以添加 !global 声明:
1.2. 默认值:!default
sass 的默认变量仅需要在值后面加上 !default 即可。
如果分配给变量的值后面添加了 !default 标志 ,这意味着该变量如果已经赋值,那么它不会被重新赋值,但是,如果它尚未赋值,那么它会被赋予新的给定值。
上述例子因为变量$color已经被赋值为$666,所以后来再给它赋默认值时不会影响它原来的值,$color的值仍然是$666。
1.3. 局部变量和全局变量
在元素内部定义的变量不会影响其他元素
1.4. 嵌套
1.5. 插值
插值几乎可以在Sass样式表中的任何地方使用,将SassScript表达式的结果嵌入到CSS块中。只需将表达式包装在#{}中
@mixin corner-icon($name, $top-or-bottom, $left-or-right) {
.icon-#{$name} {
background-image: url("/icons/#{$name}.svg");
position: absolute;
#{$top-or-bottom}: 0;
#{$left-or-right}: 0;
}
}
@include corner-icon("mail", top, left);
// 结果
.icon-mail {
background-image: url("/icons/mail.svg");
position: absolute;
top: 0;
left: 0;
}
插值可以在SassScript中用于将SassScript注入到未加引号的字符串中。这在动态生成名称(例如用于动画)或使用斜线分隔值时特别有用。请注意,SassScript中的插值总是返回一个未加引号的字符串。
@mixin inline-animation($duration) {
$name: inline-#{unique-id()};
@keyframes #{$name} { @content; }
animation-name: $name;
animation-duration: $duration;
animation-iteration-count: infinite;
}
.pulse {
@include inline-animation(2s) {
from { background-color: yellow }
to { background-color: red }
}
}
// 结果
.pulse {
animation-name: inline-uifpe6h;
animation-duration: 2s;
animation-iteration-count: infinite;
}
@keyframes inline-uifpe6h {
from { background-color: yellow; }
to { background-color: red; }
}
1.6. 数据类型
-
数字===>1, 2, 13, 10px
-
字符串,有引号字符串与无引号字符串===>"foo", 'bar', baz
-
颜色===>blue, #04a3f9, rgba(255,0,0,0.5)
-
布尔型===>true, false
-
空值===>null
-
数组 (list),用空格或逗号作分隔符===>1.5em 1em 0 2em, Helvetica, Arial, sans-serif
-
maps, 相当于 JavaScript 的 object===>(key1: value1, key2: value2)
SassScript 也支持其他 CSS 属性值,比如 Unicode 字符集,或 !important 声明。然而Sass 不会特殊对待这些属性值,一律视为无引号字符串。
1.6.1.字符串 (Strings)****
SassScript 支持 CSS 的两种字符串类型,在编译 CSS 文件时不会改变其类型:
有引号字符串 (quoted strings),如 "Lucida Grande"
无引号字符串 (unquoted strings),如 sans-serif bold,
只有一种情况例外,使用 #{} (interpolation) 时,有引号字符串将被编译为无引号字符串,这样便于在 mixin 中引用选择器名:
@mixin firefox-message($selector) {
body.firefox #{$selector}:before {
content: "Hi, Firefox users!";
}
}
// 结果
@include firefox-message(".header");
body.firefox .header:before {
content: "Hi, Firefox users!";
}
1.6.2.数组 (Lists)
数组 (lists) 指 Sass 如何处理 CSS 中 margin: 10px 15px 0 0 或者 font-face: Helvetica, Arial, sans-serif 这样通过空格或者逗号分隔的一系列的值。事实上,独立的值也被视为数组 —— 只包含一个值的数组。
数组本身没有太多功能,但 Sass list functions 赋予了数组更多新功能:
-
nth 函数可以直接访问数组中的某一项
-
join 函数可以将多个数组连接在一起
-
append 函数可以在数组中添加新值
-
@each 指令能够遍历数组中的每一项
$sizes: 40px, 50px, 80px;
$sizess:append($sizes,90px);
@each $size in $sizess { .icon-#{$size} { font-size: $size; height: nth($sizes,2); } }
// 结果
.icon-40px { font-size: 40px; height: 50px; }
.icon-50px { font-size: 50px; height: 50px; }
.icon-80px { font-size: 80px; height: 50px; }
.icon-90px { font-size: 90px; height: 50px; }
----------------------------------------------------------------------------------------------
$colors1: #f00,#ff0;
$colors2:#0f0,#00f;
$colorss:join($colors1,$colors2);
@each $color in $colorss{ .icon-#{$color}{ color: $color } }
// 结果
.icon-#f00 { color: #f00; }
.icon-#ff0 { color: #ff0; }
.icon-#0f0 { color: #0f0; }
.icon-#00f { color: #00f; }
Argument Lists:当你声明一个接受任意参数的混入或函数时,你得到的值是一个称为参数列表的特殊列表。它的作用就像一个包含传递给mixin或函数的所有参数的列表,还有一个额外的功能:如果用户传递了关键字参数,则可以通过将参数列表传递给meta.keywords()函数来作为映射访问它们。
@mixin syntax-colors($args...) {
@each $name, $color in meta.keywords($args) {
pre span.stx-#{$name} { color: $color; }
}
}
@include syntax-colors( $string: #080, $comment: #800, $variable: #60b )
// 结果
pre span.stx-string { color: #080; }
pre span.stx-comment { color: #800; }
pre span.stx-variable { color: #60b; }
1.6.3.Maps
Maps可视为键值对的集合,键被用于定位值,如 (key1: value1, key2: value2)。Maps必须被圆括号包围,键值对被都好分割。Maps中的keys和values可以是sassscript的任何对象。
-
map-get函数用于查找键值
-
map-merge函数用于map和新加的键值融合
-
@each命令可添加样式到一个map中的每个键值对
@use "sass:map";
$icons: ( "eye": "\f112", "start": "\f12e", "stop": "\f12f" );
@each $name, $glyph in $icons {
.icon-#{$name}:before {
display: inline-block;
font-family: "Icon Font";
content: $glyph;
}
}
// 结果
.icon-eye:before { display: inline-block; font-family: "Icon Font"; content: "\f112"; }
.icon-start:before { display: inline-block; font-family: "Icon Font"; content: "\f12e"; }
.icon-stop:before { display: inline-block; font-family: "Icon Font"; content: "\f12f"; }
$font-weights: ("regular": 400, "medium": 500, "bold": 700);
@debug map.get($font-weights, "medium"); // 500
@debug map.get($font-weights, "extra-bold"); // null
$light-weights: ("lightest": 100, "light": 300);
$heavy-weights: ("medium": 500, "bold": 700);
@debug map.merge($light-weights, $heavy-weights);
// ("lightest": 100, "light": 300, "medium": 500, "bold": 700
scss @规则
@import
1. 普通使用
@import <url>, <url> ......:Sass导入与CSS导入具有相同的语法,除了它们允许用逗号分隔多个导入,而不是要求每个导入都有自己的@import。此外,在缩进语法中,导入的URL不需要有引号。
当Sass导入一个文件时,该文件会被评估为其内容直接出现在@import的位置。
导入文件中的任何混入、函数和变量都是可用的,其所有CSS都包含在@import编写的确切位置。
此外,在@import之前定义的任何混入、函数或变量(包括来自其他@import的)都可以在导入的样式表中使用。
导入通常在样式表的顶层编写,也可以嵌套在样式规则中,也可以在规则中嵌套纯CSS。
导入的CSS嵌套在该上下文中,这使得嵌套导入对于将CSS块范围限定到特定元素或媒体查询非常有用。
嵌套导入中定义的顶级混入、函数和变量仅在嵌套上下文中可用。
2. 联合@forward导入配置模块
@use
注意:使用1.53.0版本,sass input.scss output.css;
@use规则从其他Sass样式表加载混入、函数和变量,并将多个样式表中的CSS组合在一起。@use加载的样式表称为“模块”。
1.基本使用
@use“<url>”,它在给定的url加载模块。以这种方式加载的任何样式都将在编译的CSS输出中包含一次,无论这些样式加载了多少次。
2.引入模块命名空间
@use <namespace>:引入模块命名空间。
可以通过编写<namespace>从另一个模块访问变量、函数和混入<变量>,
<namespace><函数>()或@include <namespace><mixin>()。
1. 默认情况下,模块的命名空间只是其URL的最后一个组件,没有文件扩展名。
2. @use <url> as <namespace> :自定义空间名称。
3. @use <url> as *;用来加载没有名称空间的模块。但是,可能会引入导致名称冲突的新成员!
3.私有变量
通过以“-”或“_”开头定义私有成员,即使使用@use,也无法使用私有变量。
4.更改模块中默认参数
在样式表里使用 !default 来定义默认值,在加载文件里使用@use <url> with (<variable>: <value>,<variable>: <value>)来覆盖变量的默认值。
5.更新模块中的变量值
6.返回不同样式
利用@minix先配置值,再使用@minix注入样式。
7.以_开头的文件
按照惯例,Sass文件只作为模块加载,而不是单独编译,以_开头(如_code.scs)。
Sass中以“_”开头的文件通常用于存放一些可重用的样式或混合器,这些文件不会被直接编译成CSS文件,而是在其他Sass文件中通过@import或者@use导入使用。
8.与@import的区别
@use规则旨在替换旧的@import规则,但它被有意设计为以不同的方式工作。以下是两者之间的一些主要区别:
1. @use仅使变量、函数和混入在当前文件的范围内可用。它从未将它们添加到全球范围内。这使得很容易找出Sass文件引用的每个名称的来源,这意味着您可以使用较短的名称,而不会有任何冲突的风险。
2. @use只加载每个文件一次。这可以确保您不会意外地多次复制依赖项的CSS。
3. @use必须出现在文件的开头,不能嵌套在样式规则中。
4. 每个@use规则只能有一个URL。
5. @即使使用缩进语法,use也需要在其URL周围加引号。
补充: 使用@use加载的成员(变量、函数和混入)仅在加载它们的样式表中可见。如果其他样式表也想访问它们,则需要编写自己的@use规则。这有助于准确了解每个成员的来源。如果你想一次从多个文件加载成员,你可以使用@forward规则将它们全部从一个共享文件转发。
@forward
1. 转发模块
当涉及到模块的CSS时,@forward规则的作用就像@use一样。来自转发模块的样式将包含在编译的CSS输出中,带有@forward的模块可以扩展它,即使它没有被@使用。
2.添加前缀
因为模块成员通常与命名空间一起使用,所以简短的名称通常是最可读的选项。但是,这些名称在它们定义的模块之外可能没有意义,因此@forward可以选择为它转发的所有成员添加额外的前缀。
这被写成@forward ‘<url>’作为<prefix>-*,它将给定的前缀添加到模块转发的每个混入、函数和变量名的开头。例如,如果模块定义了一个名为reset的成员,并将其转发为list-*,则下游样式表将其称为list-reset。
3.控制可见性
通过写@forward ‘<url>’ hide <members…>来精确控制哪些成员被转发或者@forward“<url>” show <members…>。
hide表单意味着列出的成员不应该被转发,但其他所有内容都应该被转发。show表单意味着只应转发指定的成员。在这两种形式中,您都可以列出混入、函数或变量(包括$)的名称。
4.配置默认值
@forward规则还可以加载具有配置的模块。这与@use的工作原理基本相同,但有一个补充:@forward规则的配置可以使用!配置中的默认标志。这允许模块更改上游样式表的默认值,同时仍允许下游样式表覆盖它们。