本文最后更新于:2023年4月17日 晚上
css、sass和scss
简单来说,css是最基本的写前端样式的语言。
而sass是一种css的预处理器,sass可以通过编译生成css文件,通过提供一系列简洁的语法,用于快捷的开发css。
有两种可以用于书写sass的语法,一种是最常用的scss语法、通常以.scss
后缀,而另一种是缩进语法,常用.sass
后缀。
其中最常用的就是scss语法,因为其完美兼容原生css语法。
三者语法上的区别如下:
scss的基本使用
以下许多例子来源于SASS用法指南 - 阮一峰的网络日志 (ruanyifeng.com)
本人对部分例子作了demo和官网的补充.
1 | 变量定义与使用
使用$
定义和直接引用变量, 放入字符串中使用#{}
包裹
1 2 3 4 5 6 7 8 9 10 11
| $side: left;
.rounded { border-#{$side}-radius: 5px; }
$blue: #1875e7;
div { color: $blue; }
|
2 | 继承与占位符%
使用@extend
继承
1 2 3 4 5
| .class2 { @extend .class1; font-size:120%; }
|
占位符
任何用%
标注的是占位符, 占位符不属于任何类名, 但是仍可以被继承, 好处是不会造成类名污染.
一个来自官方的例子:
3 | mixin
和 @include
mixin
用于生成可重用的代码块, 并支持参数和默认值
@include
用于引入mixin
1 2 3 4 5 6 7 8 9 10 11 12 13
| @mixin left($value: 10px) { float: left; margin-right: $value; }
div { @include left(20px); }
div { float: left; margin-right: 20px; }
|
4 | 颜色函数
用于简单调整颜色: 传递给每个关键字参数的值添加到颜色的相应属性中,并返回调整后的颜色
常见的颜色函数与用法:
1 2 3 4
| lighten(#cc3, 10%) darken(#cc3, 10%) grayscale(#cc3) complement(#cc3)
|
更多信息参考官方文档: Sass: sass:color (sass-lang.com)
demo:
scss:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| $default-color: rgb(199, 84, 80); $sel: color;
.#{$sel} { background-color: $default-color; &-darken { background-color: darken($default-color, 10%); } &-lighten { background-color: lighten($default-color, 20%); } &-grayscale { background-color: grayscale($default-color); } &-complement { background-color: complement($default-color); } }
|
html: (p-xx是使用了PrimeFlex (primefaces.org))
1 2 3 4 5 6 7 8 9 10
| <div class="p-grid p-mt-5"> <div class="color p-col-2">color</div> <div class="color-darken p-col-2">darken(color, 10%);</div> <div class="color-lighten p-col-2">lighten(color, 20%);</div> </div>
<div class="p-grid p-mt-5"> <div class="color-grayscale p-col-2">grayscale</div> <div class="color-complement p-col-2">complement</div> </div>
|
一般项目中最常用的就是darken和lighten, 如表示focus状态或者disabled状态. 其他都是花里胡哨的..
5 | 条件和循环
@if
@else
1 2 3 4 5
| @if lightness($color) > 30% { background-color: #000; } @else { background-color: #fff; }
|
@for
1 2 3 4 5
| @for $i from 1 to 10 { .border-#{$i} { border: #{$i}px solid blue; } }
|
6 | @function
可以使用@function
写一个自定义的函数
1 2 3 4 5 6 7
| @function double($n) { @return $n * 2; }
#sidebar { width: double(5px); }
|
7 | 嵌套和引用父元素&
可以使用&
来引用父元素, 并且scss支持嵌套
嵌套选择器
1 2 3 4 5
| div { hi { color:red; } }
|
嵌套属性
注意需要加:
1 2 3 4 5 6
| p { border: { color: red; } }
|
嵌套类
1 2 3 4 5
| .class1 { .class2 { } }
|
类前缀
继续引用一个官方的例子…
这里注意, 类前缀不会继承前缀下的样式, 具体如下图, 可以看到.accordion__copy
和.accordion__copy--open
不会继承.accordion
下的样式.
碎碎念
想到系统的补一下这方面的知识也是看到实验室某学长的写法, 才发现一个好的工具确实可以使效率事半功倍, 下面改几个项目的常用例子来展示下scss的优势.
styled-badge
html:
1 2 3 4 5
| <div class="p-mt-5"> <span class="badge-success">success</span> <span class="badge-fail">fail</span> <span class="badge-pending">pending</span> </div>
|
scss:
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
| badge { border-radius: var(--border-radius); padding: .25em .5rem .25em .5rem; margin: 0 1em 0 1em; font-weight: 700; font-size: 12px; letter-spacing: .3px; }
.badge { &-success { @extend %badge; background: #C8E6C9; color: #256029; }
&-fail { @extend %badge; background: #FFCDD2; color: #C63737; }
&-pending { @extend %badge; background: #FEEDAF; color: #8A5340; } }
|
效果:
ref