提示
先提前展示一下后面要用到的样式目录:
styles/
|-- _index.scss
|-- variables/
| |-- _colors.scss
| |-- _typography.scss
|-- components/
| |-- _buttons.scss
| |-- _forms.scss
|-- main.scss
# 一、@use
你可以简单的将@use 看作是对@import 的升级。
@use 加载的样式表被称为“模块”,多次引入只包含一次(即:每一个@use 相对独立)。
提示
现在官网更加推荐使用 具有命名空间功能 的 @use (opens new window) 代替 @import (opens new window)
# 1、代码示例
下面简单的看一下@use 的使用方式:
通过下面的案例,可以看到@use 相较于@import 的优势:模块化划分
# 2、私有变量
如果我们处于某种考虑,我们并不想暴露_global.scss 文件中中的某些 scss 变量时,我们可以使用$-
提示
当然我们也可以通过后面的 @forward
控制哪些需要暴露
# 3、可配置变量 ✨
scss 的强大之一就是其 css 的可控性(使用 with
),如下:
# 4、变量重分配
在只有父子关系时,父是可以直接调用子中的变量的,但跨域三代就不能直接使用了,需要对变量进行重分配:
# 二、@forward
上面的变量重分配方式显然不是长久之策,如果要跨代分配/共享更多的变量怎么办,这还没有算上样式、 Mixin 等
提示
我们可以将@forward,看成类似于 es6 中的 export,进行模块成员进行导出。
其中,@use
与@forward
的区别如下:
@use
用于引入模块,提供更严格的命名空间和作用域控制@forward
用于将样式、变量、Mixin 等从一个模块导出,以便其他模块可以使用
# 1、模块导出
对与@forward 的使用,我们有如下使用方式:
# 2、可配置变量 ✨
# 3、控制可见性
- _bootstrap.scss
// 1、指定转发哪些
@forward 'users/common' show $font-size;
// 2、指定不转发哪些
@forward 'users/common' hide bgColor;
# 4、添加前缀
- _bootstrap.scss
// 转发时,为不同文件内样式的使用声明一个前缀
@forward 'users/common' as c-*;
@forward 'users/global' as g-* hide g-font-size; // 要想使hide、show作用生效,也要加前缀(向外生效🤔)
- user.scss
@use './bootstrap';
.container {
font-size: bootstrap.$c-font-size;
width: bootstrap.c-column-width(3, 12);
@include bootstrap.g-base(#f00);
}
# 三、@at-root
@at-root 可以使被嵌套的选择器或属性跳出嵌套。
思考:为什么要跳出嵌套?
可以增加它的作用范围、针对于有待移动需求的元素
# 1、应用示例
场景的应用场景就是 CSS 与 BEM 命名规范。
# 2、限制条件
默认@at-root 只会跳出选择器嵌套,而不能跳出@media 或@supports,如果要跳出这两种,则需要使用@at-root(without: media)
、@at-root(without: supports)
。
其中,这种语法的关键词有四个:
- all(表示所有)
- rule(常规 css):默认选项
- media
- supports