Vito's blog
  • js基础
  • es6+基础
  • js进阶
  • js手写系列
  • typescript
  • js读书笔记

    • js异步编程
    • 你不知道的js系列
  • vue2基础
  • vue2进阶
  • vue3基础
  • vuex
  • vue router
  • pinia
html
  • 图解css3
  • css进阶
  • scss
浏览器
网络通信
  • git使用笔记
  • linux使用记录
  • npm
  • webpack基础
  • webpack5
  • qiankun
  • 排序算法
  • 剑指offer
  • 常见算法
  • 排序算法python
  • 剑指offer-python
  • labuladong算法
github主页
  • js基础
  • es6+基础
  • js进阶
  • js手写系列
  • typescript
  • js读书笔记

    • js异步编程
    • 你不知道的js系列
  • vue2基础
  • vue2进阶
  • vue3基础
  • vuex
  • vue router
  • pinia
html
  • 图解css3
  • css进阶
  • scss
浏览器
网络通信
  • git使用笔记
  • linux使用记录
  • npm
  • webpack基础
  • webpack5
  • qiankun
  • 排序算法
  • 剑指offer
  • 常见算法
  • 排序算法python
  • 剑指offer-python
  • labuladong算法
github主页
  • scss基础使用

scss基础使用

简介

scss/sass是css的超集,类似与typescript和JavaScript的关系,最终将转换为css上线,其语法格式有scss和sass(使用“缩进”代替“花括号”)两种

本笔记仅参考了中文网中的快速入门和中文文档两个部分,更详细的请参考英文版api

注释

多行注释/* */会被编译到css中,单行注释//则不会
带!号的多行注释

/*!  
  版权信息  
*/  

通常用于加入版权信息,在处于压缩模式的css下也不会被删除

变量

变量以美元符号开头,赋值方法与 CSS 属性的写法一样

$width: 1600px;  
$pen-size: 3em;  
// 直接使用变量名称调用变量  
#app {  
    height: $width;  
    font-size: $pen-size;  
}  
// 支持块级作用域  
#foo {  
  $width: 5em !global; // !global将局部变量转换为全局变量  
  width: $width; // 5em  
}  
  
#bar {  
  width: $width; // 5em  
}  

数据类型

SassScript 支持 7 种主要的数据类型:

  • 数字,1, 2, 13, 10px
  • 字符串,有引号字符串与无引号字符串,"foo", 'bar', baz
  • 颜色,blue, #04a3f9, rgba(255,0,0,0.5)
  • 布尔型,true, false,只有自身是false和null才会返回false,其他一切都将返回true
  • 空值,null,与任何类型进行算数运算
  • 数组 (list),用空格或逗号作分隔符,1.5em 1em 0 2em, Helvetica, Arial, sans-serif
  • maps, 相当于 JavaScript 的 object,(key1: value1, key2: value2)

SassScript 也支持其他 CSS 属性值,比如 Unicode 字符集,或 !important 声明。然而Sass 不会特殊对待这些属性值,一律视为无引号字符串。

type-of($value)判断数据类型

字符串

使用插值语法(模板字符串)#{}(interpolation)时,有引号字符串将被编译为无引号字符串,这样便于在mixin中引用选择器名

数字

带单位的数字,单位会和数字当做一个整体,进行算数运算

数组

参考英文文档

颜色

支持颜色函数
$color1: lighten($color, 15%);

运算

数字运算

对于加法/减法运算,带有字符串类型的会变成拼接,其中减法会带着运算符拼接
a.纯数字:只要有单位,结果必有单位,不同单位之间会进行必要的转换
b.纯字符串:第一个字符串有无引号决定结果是否有引号
c数字和字符串:第一位有引号,结果必为引号;第一位对应数字非数字且最后一位带有引号,则结果必为引号

乘除取余运算

  • 乘法:

每个字段必须前部分为数字,且两个字段只能一个后部分是字符(因为此时后缀被当被单位看待了)。其余编译不通过

  • 除法:

/ 在 CSS 中通常起到分隔数字的用途
以下三种情况 / 将被视为除法运算符号:

1.如果值,或值的一部分,是变量或者函数的返回值 2.如果值被圆括号包裹
3.如果值是算数表达式的一部分

不会四舍五入,精确到小数点后5位
每个字段必须前部分为数字,且当前者只是单纯数字无单位时,后者(除数)后部分不能有字符。其余结果就按顺序去除空格后拼接起来。
(因为此时后缀被当被单位看待了)

取余:
值与"%"之间必须要有空格,否则会被看做字符串

关系运算符

大前提:两端必须为数字 或 前部分数字后部分字符

相等运算符

前部分为不带引号数字时,对比的仅仅是数字部分;反之,忽略引号,要求字符一一对应

布尔运算符

值与"and"、"or"和"not"之间必须要有空格,否则会被看做字符

颜色运算符

颜色与颜色之间运算是分段计算进行的,也就是分别计算r、g、b部分的值
颜色值与数字之间是分段分别与数字进行运算
RGB和HSL,如果颜色值包含alpha channel(rgba或hsla两种颜色值),必须拥有相等的alpha值才能进行运算,因为算术运算不会作用于alpha值。

运算优先级

1、()
2、*、/、%
3、+、-
4、> 、<、>=、<=

嵌套语法

scss选择器可嵌套书写

选择器嵌套时,其嵌套处理逻辑类似于外层选择器与内层拼接,因此跨层次嵌套必须书写中间层
对于特殊的父选择器&符号将被替换为父选择器名称
同样> + ~选择器和群组选择器也支持

属性嵌套时:

.funky {  
  font: {  
    family: fantasy;  
    size: 30em;  
    weight: bold;  
  }  
}  
/*  
被编译为  
.funky {  
  font-family: fantasy;  
  font-size: 30em;  
  font-weight: bold; }  
*/  

:符号将被转义为-

杂货语法

占位符选择器,以%开头的选择器,不选取任何元素,通常用于继承等场景

插值语法

类似于模板字符串
通过 #{} 插值语句可以在选择器、属性名和属性值中使用变量。

父选择器&

更接近于指向当前元素

a {  
    color: yellow;  
    &:hover{  
        color: green;  
    }  
    &:active{  
        color: blank;  
    }  
}  

!default

设置变量默认值,变量是null空值时将视为未被!default赋值

!global

将局部变量提升为全局变量

!optional

当@extend相关代码出现语法错误时,编译器可能会给我们”乱”编译为css,我们加上这个参数可以在出现问题后不让他编译该部分代码

@-Rule指令

@import

仅可导入scss/sass文件,若传入css或url等参数将被作为普通的css语句。
若不希望将导入的scss文件独立编译为CSS只需要在文件名前添加下划线,但导入语句中却不需要添加下划线,如:
文件名_colors.scss,导入@import "colors";

嵌套的代码中导入,对应的被导入代码将只在局部作用域生效。不可以在混合指令(mixin)或控制指令(control directives)中嵌套@import

@media指令

与CSS中用法一样,但允许其在CSS规则中嵌套
如果 @media 嵌套在 CSS 规则内,编译时,@media 将被编译到文件的最外层,包含嵌套的父选择器

@extend继承

继承的基本原理类似于:.seriousError @extend .error,那么样式表中的任何一处.error都用.error.seriousError这一选择器组进行替换。

.seriousError不仅会继承.error自身的所有样式,任何跟.error有关的组合选择器样式也会被.seriousError以组合选择器的形式继承

不要继承后代选择器,如:

#admin .tabbar a {  
  font-weight: bold;  
}  
#demo .overview .fakelink {  
  @extend a;  
}  

因为后代选择器之间的层级不确定,scss会根据不同的层级组合生成多种选择器组合,上述代码编译后会生成:

#admin .tabbar a,  
#admin .tabbar #demo .overview .fakelink,  
#demo .overview #admin .tabbar .fakelink {  
  font-weight: bold; }  

在@media中不可继承外部的代码块

混合

@mixin给一大段样式赋予一个名字,通过@include引用对应的混合器,.调用会把混合器中的所有样式提取出来放在@include被调用的地方.

由于混合器是替换代码的方式调用,因此滥用可能会导致css文件过大

混合器可以以类似函数的方式定义参数,给@include调用,如下是使用了默认参数的混合器

@mixin link-colors(  
    $normal,  
    $hover: $normal,  
    $visited: $normal  
  )  
{  
  color: $normal;  
  &:hover { color: $hover; }  
  &:visited { color: $visited; }  
}  
// 调用时可以这样调用  
@include link-colors(red)  

当不确定有多少个参数时,可以使用类似与es6中的...标志符,对参数变量声明(@include时也可使用该标志符,效果类似与es6),如下:

@mixin box-shadow($shadows...) {  
  -moz-box-shadow: $shadows;  
  -webkit-box-shadow: $shadows;  
  box-shadow: $shadows;  
}  
.shadows {  
  @include box-shadow(0px 4px 5px #666, 2px 6px 10px #999);  
}  
  
// 编译为  
.shadowed {  
  -moz-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;  
  -webkit-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;  
  box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;  
}  

控制指令

if

@if #{条件} {  
  //业务代码  
} @else if #{条件} {  
  // 业务代码  
} @else {  
  // 业务代码  
}  

for

指令包含
@for $var from <start> through <end>和
@for $var from <start> to <end>两种形式
两种<start>和<end>都必须为整数值,前者包含end而后者不含

@each

指令格式为@each $var in <list>,<list>是一连串的值(值列表),与js类似的迭代,可多值同时迭代,或迭代map

@while

while循环直到条件满足

@while #{condition} {  
  // 业务代码  
}  

函数指令

支持自定义函数,并在属性值或script中使用;

$grid-width: 40px;  
$gutter-width: 10px;  
  
@function grid-width($n) {  
  @return $n * $grid-width + ($n - 1) * $gutter-width;  
}  
  
#sidebar { width: grid-width(5); }  

输出格式

此部分实用性不强,参考官方文档

scss与js联动

基于webpack、sass-loader在vue项目中,scss中的变量可以导入到js中使用

// @/styles/variables.scss
$--color-primary: skyblue;
$--border-width: 2px;

:export {
  colorPrimary: $--color-primary;
  borderWidth: $--border-width;
}
import styleVariables from '@/styles/variables.scss'
console.log(styleVariables) // { colorPrimary: 'skyblue', borderWidth: '2px'}
Last Updated:
Contributors: vito