# Sass速通(四):继承、混合与函数

lonelydawn 2021-10-13 19:14:13
函数 继承 SASS 混合


在 Sass 中,我们可以使用继承、混合和函数来复用一些 CSS 样式和功能。

继承

@extend

继承使用 @extend 指令实现,如

.error {
border: 1px solid red;
background-color: #fdd;
}
.seriousError {
@extend .error;
border-width: 3px;
}

编译后

.error, .seriousError {
border: 1px solid red;
background-color: #fdd;
}
.seriousError {
border-width: 3px;
}

实际上,Sass 是将使用 @extend 的 .seriousError 和 .error 编译为了组合选择器 .error, .seriousError。以往我们在 CSS 中复用一段样式时,也会使用 组合选择器 这种形式。

在了解了继承的编译原理之后,我们来看几种复杂情况。

多重继承 (Multiple Extends)

一个选择器可以继承多个选择器。

.error {
border: 1px #f00;
background-color: #fdd;
}
.attention {
font-size: 3em;
background-color: #ff0;
}
.seriousError {
@extend .error;
@extend .attention;
border-width: 3px;
}

编译后

.error, .seriousError {
border: 1px #f00;
background-color: #fdd;
}
.attention, .seriousError {
font-size: 3em;
background-color: #ff0;
}
.seriousError {
border-width: 3px;
}

多重继承,会被编译为多个组合选择器。

继承嵌套的选择器列(Selector Sequences)

.inner {
p {
font-size: 14px;
}
&:hover {
color: red;
}
}
.spec-inner {
@extend .inner;
}

编译后

.inner p, .spec-inner p {
font-size: 14px;
}
.inner:hover, .spec-inner:hover {
color: red;
}

显然,.spec-inner 在继承 .inner 的时候,也继承了 .inner 的嵌套结构。

继承链 (Chaining Extends)

当出现选择器 C 继承 B,B 继承 A 的情况时,会从 继承链末端 C 开始向上与 B 组合,之后 C、B 再和 A 组合。

.error {
border: 1px #f00;
background-color: #fdd;
}
.seriousError {
@extend .error;
border-width: 3px;
}
.criticalError {
@extend .seriousError;
position: fixed;
top: 10%;
bottom: 10%;
left: 10%;
right: 10%;
}

编译后

.error, .seriousError, .criticalError {
border: 1px #f00;
background-color: #fdd;
}
.seriousError, .criticalError {
border-width: 3px;
}
.criticalError {
position: fixed;
top: 10%;
bottom: 10%;
left: 10%;
right: 10%;
}

@extend-only

由于 @extend 可以复用 CSS 的特性,有时我们可能会专门写一些样式给其它选择器继承,而不是为了给具体的元素使用。这时可以使用 占位符选择器,这些选择器不会被编译到 CSS 中。 我们可以使用 % 来标识一个占位符,如

#context a%extreme {
color: blue;
font-weight: bold;
font-size: 2em;
}
.notice {
@extend %extreme;
}

编译后

#context a.notice {
color: blue;
font-weight: bold;
font-size: 2em;
}

可以看到,选择器 #context a 并没有被编译输出。

!optional

当我们不确定继承的选择器是否存在时,可以使用 !optional 标识,如

a.important {
@extend .notice !optional;
}

此时可以成功编译,但由于 .notice 不存在,所以没有任何输出。 如果不加 !optional,编译时会报错:

"a.important" failed to @extend ".notice"
The selector ".notice" was not found.
Use "@extend .notice !optional" if the extend should be able to fail.

混合

@mixin、@include

在 Sass 中,可以使用 @mixin 封装一段 CSS 代码,之后通过 @include 引入。

@mixin large-text { // 定义
font: {
family: Arial;
size: 20px;
weight: bold;
}
color: #ff0000;
}
.page-title {
@include large-text; // 引入
padding: 4px;
margin-top: 10px;
}

编译后

.page-title {
font-family: Arial;
font-size: 20px;
font-weight: bold;
color: #ff0000;
padding: 4px;
margin-top: 10px;
}

参数

我们可以定义接收参数的 mixin,并为参数设置默认值,如

@mixin sexy-border($color, $width: 1px) {
border: {
color: $color;
width: $width;
style: dashed;
}
}

在引入 mixin 时,可以按顺序传参,也可以指定传入值给哪个参数,如

h1 {
@include sexy-border(blue, 1px);
}
p {
@include sexy-border($width: 1px, $color: red);
}

编译后

h1 {
border-color: blue;
border-width: 1px;
border-style: dashed;
}
p {
border-color: red;
border-width: 1px;
border-style: dashed;
}

@content

在使用 mixin 时,我们可以先向 mixin 中导入一段代码,然后再输出混合样式,导入的代码将出现在 @content 标识的位置,这和一些语言和框架中“插槽(slot)”的用法相似。

@mixin apply-to-ie6-only {
* html {
@content;
}
}
@include apply-to-ie6-only {
#logo {
background-image: url(/logo.gif);
}
}

编译后

* html #logo {
background-image: url(/logo.gif);
}

编译后,选择器 #logo 及其样式替换了 @content 并插入到了相应的位置。

函数

@function

在 Sass 中,可以使用 @function 定义一个函数,如

@function grid-width($grid-width, $gutter-width, $n: 5) {
@return $n * $grid-width + ($n - 1) * $gutter-width;
}

与 mixin 相似,function 可以接收多个参数,并为参数设置默认值。 在调用时,也可以为指定参数赋值,如

#sidebar {
width: grid-width($gutter-width: 10px, $grid-width: 40px)
}

编译后

#sidebar {
width: 240px;
}

mixin 适用于封装一段 CSS 代码,而 function 则更适用于封装一段逻辑或计算过程。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

版权声明
本文为[lonelydawn]所创,转载请带上原文链接,感谢
https://cloud.tencent.com/developer/article/1888670

  1. 前端开发框架Vue中Vuex的使用原理分享
  2. vue-echarts初次体验
  3. 分享一些web前端开发好用的网站
  4. 每天读一点webpack-003
  5. react之组件生命周期
  6. Alibaba collection version of mybatis handwritten documents, Java front-end interview questions
  7. SpringBoot Java后端实现okhttp3超时设置
  8. react之組件生命周期
  9. Cycle de vie des composants de React
  10. 使用Reactor将阻塞调用变为异步非阻塞
  11. Baked cake wife sun photos, plain face on camera, beautiful appearance is still a beauty, watching children during the festival is a little helpless
  12. 亚洲知名插画师荒川(arakawa) 仅8件独版NFT作品系列《Can't Out》正式上架Element综合市场
  13. Taiyuan: singing, welcoming the national day, gathering to praise blessings
  14. Arakawa, un illustrateur Asiatique bien connu, n'a mis sur le marché que huit pièces de la collection NFT "can't out" en une seule édition.
  15. Résumé des questions d'entrevue Hadoop (II) - - hdfs
  16. 如何解决“Serverless”系统的冷启动问题
  17. BootstrapBlazor 模板安装
  18. BootstrapBlazor 模板安装
  19. Tong Liya Jin Chen bumps her hair, Xie Na Zhao Liying bumps her shirt, and she sees EQ from the reaction
  20. 使用ESLint+Prettier来统一前端代码风格
  21. 为什么说 Node.js 是实时应用程序开发的绝佳选择
  22. PaddlePaddle:在 Serverless 架构上十几行代码实现 OCR 能力
  23. 使用elementui在完成项目中遇到的未知知识点2
  24. On the mechanism of webpack loader
  25. 云原生体系下 Serverless 弹性探索与实践
  26. vue开发技巧
  27. Une fleur merveilleuse de l'histoire de l'industrie des nouveaux véhicules énergétiques, Zhongtai Jiangnan T11, une voiture vintage que vous n'avez jamais vue
  28. 致敬!再见了!LayUI !
  29. Vue安装和卸载
  30. Implement a flipped character with the transform attribute of CSS
  31. 你的第一个 Docker + React + Express 全栈应用
  32. [apprentissage de l'algorithme] 1486. Fonctionnement exclusif du tableau (Java / C / C + + / python / go / Rust)
  33. Zhang Daxian sends a blessing video on xYG relay, showing positive energy in details
  34. 前端技巧-JS元编程ES6 symbol公开符号
  35. Article de 37 ans seul à l'hôpital!Il boitait, soupçonnait d'être blessé, souriait avec douleur
  36. 前端推荐!10分钟带你了解Konva运行原理
  37. npm ERR! iview-project@3.0.0 init: `webpack --progress --config webpack.dev.config.js
  38. 零基础学习Web前端需要注意什么呢?
  39. The Youth League promotes Yiyang Qianxi new film, and the relationship between the two generation and the generation is good. Li Fei is blessed.
  40. PaddlePaddle:在 Serverless 架构上十几行代码实现 OCR 能力
  41. JavaScript数组 几个常用方法
  42. Qu'est - ce qu'il faut remarquer à l'avant - plan Web de l'apprentissage de base zéro?
  43. 暢談this的四種綁定方式
  44. 2021最新Vue面试必胜宝典,大厂面试题解析!
  45. Quatre façons de lier ceci
  46. Préparation au développement de l'extension tagdown
  47. Intervieweur: Parlez - moi des flotteurs CSS
  48. Packaging the View Component Library with rollup
  49. Comment un composant enfant modifie les valeurs passées par le composant parent
  50. Résumé de l'API Express
  51. Optimisation de la structure du Code if else dans le projet
  52. Fonction magique pour résoudre le problème de la fonction maybe - - fonction either
  53. 新手学前端的方法是什么 自学前端该怎么规划
  54. 云原生体系下 Serverless 弹性探索与实践
  55. 如何全方位打造安全高效的HTTPS站点(一)
  56. "Liu Jing dit che 丨 point de vue" est - ce que Custom Road est un MpV digne de la terre?
  57. 从理念到LRU算法实现,起底未来React异步开发方式
  58. Compared with Volvo XC60, Lingke 09 goes out of the spa platform. What would you choose, regardless of the brand?
  59. PaddlePaddle:在 Serverless 架构上十几行代码实现 OCR 能力
  60. 云原生体系下 Serverless 弹性探索与实践