SASS详解

简述

SASS是一种CSS扩展语言,可以将SASS编译成css代码,使用sass能令CSS代码的编写过程更加便捷和模块化。

sass的本质可以说就是进一步模块化css,减少编写重复的css代码

使用变量

在sass中我们可以把反复使用的css属性定义成变量,然后通过变量名去引用他们,从而不用重复书写这个属性值。

使用$符号定义变量

复制代码
$变量名: 属性值;

变量的作用域也分为块外和块内,块内定义的变量只能供本块使用,而块外能供所有地方使用

定义变量的时候也能够引用之前定义过的变量,例如:

复制代码
$highlight-color: #F90;
$highlight-border: 1px solid $highlight-color;

在sass变量名中的中划线和下划线是等同的,不做区分

嵌套CSS规则

普通嵌套

我们在写css代码的时候,写选择器的时候是很麻烦的,例如:

复制代码
#content article h1 { color: #333 }
#content article p { margin-bottom: 1.4em }
#content aside { background-color: #EEE }

可以看到写后代选择器的时候,content等父容器要写很多遍

而sass提供了一种嵌套式写法,只需写一次且可读性更高

复制代码
#content {
  article {
    h1 { color: #333 }
    p { margin-bottom: 1.4em }
  }
  aside { background-color: #EEE }
}

可以看到我们可以随心所欲地定义父容器或者它子容器的样式,不用一个个地重复写选择器

这种基于后代选择器的嵌套写法有时候也会有点点问题

伪类选择器

当我们使用到伪类选择器的时候

复制代码
article a {
    color: blue;
    :hover { color: red }
}

编译后的css代码是这样子的

复制代码
article a {
  color: blue;
}
article a :hover {
  color: red;
}

注意a后面有空格,也就是说嵌套的写法默认会使用后代选择器拼接空格,但这里我们想要写成a:hover

这时候sass就提供了&给我们使用,&代表的是我们父类的选择器,这里的&代表的就是article a,我们可以把sass代码写成这样

复制代码
article a {
    color: blue;
    &:hover { color: red }
}

这样编译后的css代码就没有问题了

群组选择器

在css中当我们使用后代选择器和逗号为多个容器添加样式时,容器的代码要写很多遍

复制代码
.container h1, .container h2, .container h3 { margin-bottom: .8em }

在sass中也支持嵌套

复制代码
.container {
  h1, h2, h3 {margin-bottom: .8em}
}

css属性的嵌套

对于一些css的属性名,例如border-什么什么,一遍遍重复写挺烦人的,sass能够让我们用嵌套的形式偷懒

复制代码
nav {
  border: {
  style: solid;
  width: 1px;
  color: #ccc;
  }
}

像这里sass会将style、width等子属性通过-和border连接起来,达到偷懒的目的

SASS文件的导入

sass可以通过@import的形式导入其他sass文件,达到模块化的效果

局部文件

那些专门供别的sass文件import的文件被称为局部文件,sass有个特殊的约定为这些文件命名

那就是以下划线开头,在引入的时候还可以省略下划线

举例来说,你想导入themes/_night-sky.scss这个局部文件里的变量,你只需在样式表中写@import "themes/night-sky";

默认变量值

在sass中,一般情况下你反复声明一个变量,只有最后一处定义会生效

如果在写sass文件的时候希望用户可以定制你的sass文件,在引入前声明了一些变量

引入后你的sass文件会更改这些变量的值,如果我们希望这些变量使用上一次声明的值

我们就要用到!default标签,含义是:如果这个变量被声明赋值了,那就用它声明的值,否则就用这个默认值。

Java

复制代码
$fancybox-width: 400px !default;

像这样声明一个默认变量值,就代表这个变量默认值是400px,如果在导入前声明了就按导入前的值

嵌套导入

sass允许@import命令写在css规则内,像这样

Java

复制代码
.blue-theme {@import "blue-theme"}

blue-theme文件里的sass代码会直接嵌套到.blue-theme选择器里

混合器mixin

我们可以用@mixin标识符定义一大段的css样式,然后在不同地方用@include重复复用它,例如

Java

复制代码
@mixin rounded-corners {
  -moz-border-radius: 5px;
  -webkit-border-radius: 5px;
  border-radius: 5px;
}

然后需要的地方用@include命令

复制代码
notice {
  background-color: green;
  border: 2px solid #00aa00;
  @include rounded-corners;
}

混合器传参

混合器支持像函数一样进行参数传递,来达到模块定制的功能

Java

复制代码
@mixin link-colors($normal, $hover, $visited) {
  color: $normal;
  &:hover { color: $hover; }
  &:visited { color: $visited; }
}

我们在@include的时候可以将实际的参数传进混合器,以生成不同需求的代码

混合器参数的默认值

在混合器定义的时候可以以键值对的形式定义参数的默认值,或者是其他参数的引用

Java

复制代码
@mixin link-colors(
    $normal,
    $hover: blue,
    $visited: $normal
  )
{
  color: $normal;
  &:hover { color: $hover; }
  &:visited { color: $visited; }
}

sass的注释

sass提供了不同于css代码/**/的注释形式,即静默注释//,其内容不会出现在生成的css文件中。

在编译的时候注释不会生成到css代码里

相关推荐
道不尽世间的沧桑12 分钟前
第9篇:插槽(Slots)的使用
前端·javascript·vue.js
bin915315 分钟前
DeepSeek 助力 Vue 开发:打造丝滑的滑块(Slider)
前端·javascript·vue.js·前端框架·ecmascript·deepseek
uhakadotcom32 分钟前
最新发布的Tailwind CSS v4.0提供了什么新能力?
前端
GISer_Jing43 分钟前
Node.js中如何修改全局变量的几种方式
前端·javascript·node.js
秋意钟1 小时前
Element UI日期选择器默认显示1970年解决方案
前端·javascript·vue.js·elementui
bramble1 小时前
Windows使用Trae全程提问来创建一个彩色贪吃蛇游戏,可以设置速度并查看游戏记录。
前端·程序员·trae
我命由我123452 小时前
微信小程序 - 自定义实现分页功能
前端·微信小程序·小程序·前端框架·html·html5·js
程序员黄同学2 小时前
请谈谈 Vue 中的 key 属性的重要性,如何确保列表项的唯一标识?
前端·javascript·vue.js
繁依Fanyi2 小时前
巧妙实现右键菜单功能,提升用户操作体验
开发语言·前端·javascript·vue.js·uni-app·harmonyos
前端御书房2 小时前
前端防重复请求终极方案:从Loading地狱到精准拦截的架构升级
前端·javascript