本文最后更新于:2024年4月25日 上午
关于SCSS
scss
是支持CSS3
写法的sass
,是一个css
预处理工具,以.scss
为后缀,需要编译为css
后才可在浏览器端执行(SCSS
与CSS
类似TS
与JS
是CSS
的超集)
安装
默认安装官方推荐的dart-sass
Vite项目
vite
支持sass
的编译只要安装即可使用
开始
手动搭建
为学习scss
,使用包管理手工搭建,当然也可用CodePen
体验scss
新建一个目录,初始化package.json
文件并安装sass
新建src
文件夹
新建styles
文件夹保存所有样式文件
styles
文件夹下新建scss
文件夹用于存储scss
文件
新建index.html
文件,
监听并编译scss
浏览器无法直接执行scss
文件,所以需要将scss
编译为css
使用sass
命令监听./src/styles/scss
文件夹下文件热更新编译到./src/styles/css
文件夹下
1
| pnpm sass -w ./src/styles/scss:./src/styles/css
|
或package.json
添加命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| { "name": "dart-scss", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", + "scss": "sass -w ./src/styles/scss:./src/styles/css" }, "author": "", "license": "ISC", "dependencies": { "sass": "^1.56.1" } }
|
./src/styles/scss
文件夹新建index.scss
并保存就会在css
文件夹下自动创建一个index.css
的编译文件
src/index.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>🚀SCSS</title> <link rel="stylesheet" href="./styles/css/index.css" /> </head> <body> <header class="header"> <h1>🚀Lorem ipsum dolor sit amet.</h1> </header> <nav class="navigation"> <ul> <li><a href="#">Lorem, ipsum.</a></li> <li><a href="#">Lorem, ipsum.</a></li> <li><a href="#">Lorem, ipsum.</a></li> </ul> </nav> <main class="main"> <article> <header> <h2>Lorem ipsum dolor sit.</h2> </header> <p> Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam voluptates, quod, quia, voluptate quae voluptatem quibusdam exercitationem voluptas quidem quos nesciunt. Quisquam, quae. Quisquam voluptates, quod, quia, voluptate quae voluptatem quibusdam exercitationem voluptas quidem quos nesciunt. Quisquam, quae. Lorem ipsum dolor sit amet consectetur. Rerum illo tenetur omnis dolor repellat. Ducimus illum error cumque vero et? Molestiae animi eius nemo alias? Nemo. Dolores voluptatem expedita unde enim cum? Aliquam quia possimus labore esse atque! Pariatur iusto sint laboriosam maxime molestiae! Culpa quaerat aperiam voluptate quia magni? </p> </article> </main> <footer class="footer"> <p> Lorem ipsum dolor sit amet consectetur adipisicing elit. Aperiam, vitae. </p> </footer> </body> </html>
|
使用VScode
的插件Live Preview
即可及时查看效果了👻
新建一个index.scss
后缀的文件来编写scss
,scss
支持css3
的语法
src/styles/scss/index.scss
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| * { box-sizing: border-box; }
body { margin: 0; background-color: #282c34; color: #db7bab; }
.navigation > ul a { color: #98c36e; }
|
保存后查看./src/styles/css/index.css
文件编译后与css
没有区别
基础
嵌套 (Nesting)
SCSS
中选择器可以嵌套书写
1 2 3 4 5 6 7 8 9 10 11
| .navigation { > ul { color: #7359f7;
a { color: #5087f4; text-decoration-line: none; } } }
|
除了选择器嵌套外,scss
还支持属性的嵌套
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| .scss { background: { color: #282c34; image: url('./null.jpg'); } font: { size: 2rem; weight: 400; } prefix: { suffix: value; middle: { suffix: value; } } }
|
1 2 3 4 5 6 7 8
| .scss { background-color: #282c34; background-image: url("./null.jpg"); font-size: 2rem; font-weight: 400; prefix-suffix: value; prefix-middle-suffix: value; }
|
父选择器 (Parent Selector)
Scss
用&
符号表示当前作用域(当前花括号)的选择器,除了不可直接连接在选择器名称之后(没有空格
的连接)外可以随意组合
1 2 3 4 5 6 7 8 9 10 11
| .navigation { > ul a { color: #5087f4; text-decoration-line: none; transition: color 0.2s;
&:hover { color: #b778f7; } } }
|
其它的组合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| body { color: black; & > .title { color: purple; }
[data-user-color-scheme='dark'] & { color: white; }
h { &1 { color: red; } }
.blue { color: blue; &-light { color: #38f; } } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| body { color: black; } body > .title { color: purple; } [data-user-color-scheme=dark] body { color: white; } body h1 { color: red; } body .blue { color: blue; } body .blue-light { color: #38f; }
|
变量
模块化
模块文件 (Partials)
使用_
或-
为前缀命名的.scss
文件作为一个scss模块,如_reset.scss
.模块文件在没有被其它scss
文件导入时是不会被编译的(只能被编译到引用的文件中,不会单独编译出一个文件)
@use
@use
关键字用于导入样式模块也可导入.css
文件, 模块路径默认使用相对路径(可以不加前导./
),导入时不用加模块文件名的前导符号_
当导入路径为文件夹而不是文件时若文件夹下有_index.scss
则会自动导入_index.scss
模块,可用于将多个小模块组合后再导出
src/styles/scss/base/_reset.scss
1 2 3 4 5 6 7
| * { box-sizing: border-box; }
body { margin: 0; }
|
导入此模块后这些样式就会被编译到调用的文件中
src/styles/scss/index.scss
@forward
🍍作用域
变量有块级作用域,使用!global
声明全局变量
变量声明顺序为语句顺序,全局变量声明后才可用
1 2 3 4 5 6 7 8 9 10 11 12 13
| $bg-dark: #000; $font-dark: #fff;
body { p { $size: 2rem !global; font-size: $size; } $font-dark: #eee; background: $bg-dark; color: $font-dark; font-size: $size; }
|
1 2 3 4 5 6 7 8
| body { background: #000; color: #eee; font-size: 2rem; } body p { font-size: 2rem; }
|
🍍变量类型
🍍变量运算
@mixin
控制语句