07 【Sass语法介绍-控制指令】

news2024/11/29 10:39:02

1.前言

Sass 为我们提供了很多控制指令,使得我们可以更高效的来控制样式的输出,或者在函数中进行逻辑控制。本节内容我们就来讲解什么是 Sass 控制指令?它能用来做什么?它将使你更方便的编写 Sass 。

2.什么是 Sass 控制指令

控制指令,故名思义它是通过条件来控制某些逻辑的,提到条件你首先肯定想到了 if ,没错这是 Sass 控制指令的一种,除了这个还有循环,所以 Sass 一共为我们提供了 4 种控制指令,它们分别是:

  • @if 指令
  • @each 指令
  • @for 指令
  • @while 指令

如果你熟悉其他的编程语言或者你熟悉 javascript ,看见上面这四种是不是很熟悉,它们在 Sass 中也是用来做条件判断和循环的,下面我们就看一下它们如何在 Sass 中应用。

3.@if 指令

3.1 基本使用

@if 指令是在 @if 后跟一个表达式,然后再接 {} ,如果表达式为 true 则执行 {} 里的代码逻辑,写为 @if { … } ,我们来举例看下:

@mixin avatar($size, $circle: false) {
  height: $size;

  @if $circle {
    width: $size / 2;
  }
}

.square { @include avatar(100px, $circle: true); }

上面我们在 @mixin 中使用了 @if 指令,如果 @if 后面的表达式或变量为 true ,它将执行 {} 里的代码。上面的代码在 .square 的样式中使用了 @mixin ,它将会生成如下的 CSS 代码:

.square {
  height: 100px;
  width: 50px;
}

从上面两段代码的对比中我们看到,我们为 @mixin 传入了 $size 并且 @if 后面的变量为 true,所以它执行了 width: $size / 2 生成的 CSS 就是 width: 50px ,在这里你要重点关注 @if 指令的用法,关于 @mixin 在后面的章节我们会详细讲到,这里你可以先认识下就好。

3.2 @else 和 @else if 指令

如果你了解任何的编程语言,那么你一定知道有 if 就会有 else 和 else if ,如果 @if 后面的表达式为 false ,就会判断 @else if 后面的表达式,如果还是 false 则会继续往后走,如果所有表达式都为 false 则最终会执行 @else 后面的 {} 中的代码逻辑

当然 @else if 和 @else是在你需要多条逻辑判断的时候写的,也可以不写,就像上面的代码一样。说了这么多可能你不是很理解,一码胜千言,我们直接将上面的代码段改造下,实际体会一下:

@mixin avatar($size, $circle: 1) {
  height: $size;

  @if $circle == 1 {
    width: $size / 2;
  } @else if $circle == 2 {
    width: $size / 5;
  } @else {
    width: $size;
  }
}


.a { @include avatar(100px); }
.b { @include avatar(100px, $circle: 2); }
.c { @include avatar(100px, $circle: 3); }

上面的代码中我有 3 条判断逻辑对应不同的代码块,然后我在 .a .b .c 中分别调用 @mixin 并传入不同的参数,转换后的 CSS 代码如下:

.a {
  height: 100px;
  width: 50px;
}

.b {
  height: 100px;
  width: 20px;
}

.c {
  height: 100px;
  width: 100px;
}

通过上面的讲解可以看到 @if 指令还是非常实用的,在你写函数的时候很多地方会用到,所以这块要好好记住。

4.@each 指令

@each 指令一般用来循环一个列表或 Map ,它的写法是这样的 @each in { … } ,这其中 expression 表达式返回一个列表或者直接就是一个列表,variable 是列表中的每一项,{} 中是每次循环都会执行的代码,我们举例来看下:

$borders: 2px, 3px, 5px;

@each $bor in $borders {
  .border-#{$bor} {
    border:$bor solid;
  }

上面的代码中我们通过 @each 循环一个 $borders 列表,来生成不同的 class 的 border 样式,上面这段代码转换为 CSS 如下:

.border-2px {
  border: 2px solid;
}

.border-3px {
  border: 3px solid;
}

.border-5px {
  border: 5px solid;
}

可以看到上面的写法是不是很方便,这样就直接生成了不用的类名并且对应不同的样式,在 Sass 编程中 @each 也是很常用的指令,所以这个你是一定要会用的,尤其是在写函数的时候!

5.@for 指令

@for 指令很有意思,它可以设定一个范围然后在这个范围内循环,比如说在 1 ~ 5 这个范围内,或者在 3 ~ 6 这个范围内等等。

它有两种写法 @for from to { … } 或者 @for from through { … },这两种写法中variable 都是每次循环时候的数值,start 都表示开始的边界,end 都表示结束的边界;

这两种写法不同的是 through 包含 start 与 en ,而 to 包含 start 但不包含 end。文字描述难免有些抽象,我们直接举例看下:

$base-color: #036;

// 范围是 1 ~ 3
@for $i from 1 through 3 {
  ul:nth-child(3n + #{$i}) {
    background-color: lighten($base-color, $i * 5%);
  }
}
// 范围是 4 ~ 6
@for $i from 4 through 6 {
  ul:nth-child(3n + #{$i}) {
    background-color: lighten($base-color, $i * 5%);
  }
}

上面的代码我们用的是 through 写法,分别写了 1 ~ 3 范围的循环和 4 ~ 6范围的循环,也就是说循环体中的代码块会分别被计算 3 次,它最终会转换为如下的 CSS 代码:

// 1 ~ 3 范围生成的
ul:nth-child(3n+1) {
  background-color: #004080;
}

ul:nth-child(3n+2) {
  background-color: #004d99;
}

ul:nth-child(3n+3) {
  background-color: #0059b3;
}
// 4 ~ 6 范围生成的
ul:nth-child(3n+4) {
  background-color: #0066cc;
}

ul:nth-child(3n+5) {
  background-color: #0073e6;
}

ul:nth-child(3n+6) {
  background-color: #0080ff;
}

看到转换后的 CSS 是不是感觉使用 @for 指令写起来简直飞快,下面我们在使用 to 写法来举个例子看下:

$base-color: #036;

@for $i from 1 to 3 {
  ul:nth-child(3n + #{$i}) {
    background-color: lighten($base-color, $i * 5%);
  }
}

上面使用 to 写法的代码将会转换为如下的 CSS 代码:

ul:nth-child(3n+1) {
  background-color: #004080;
}

ul:nth-child(3n+2) {
  background-color: #004d99;
}

好了,通过上面的代码可以看出使用 to 写法是不包含 end 边界的。从上面我们举的两个例子不难看出,@for 指令可以极大的简化我们编写冗余繁琐的 CSS ,你自己需要多尝试这个指令来实际感受下。

6.@while 指令

@while 指令很像 javascript 中的 while 循环,在 Sass 中 @while 指令的写法是 @while { … } ,当表达式 expression 结果为 true 时就执行 {} 里的代码,直到表达式 expression 结果为 false 。我们举例来看下:

$num: 4;
@while $num >= 1 {
  .box-#{$num} {
    font-weight: 100 * $num;
  }
  $num: $num - 1;
}

从上面的代码可以看出我设定了一个变量 $num 为 4 ,然后每次循环将这个变量 -1 ,知道 $num < 1 的时候会停止循环,也就是说会循环 4 次,我们看下下面转换为 CSS 的代码:

.box-4 {
  font-weight: 400;
}

.box-3 {
  font-weight: 300;
}

.box-2 {
  font-weight: 200;
}

.box-1 {
  font-weight: 100;
}

@while 指令可以让你很方便的控制循环次数,在实际应用中也是非常有用的!

7.实战经验

在实际项目中应用 Sass 控制指令的地方还是蛮多的,这里我说一个在我的项目中的应用。我的项目中有个需求是将视口分为 12 等份,然后根据不同的 class 类名来为其宽度设置不同的百分比,这很像其他 UI 库中的栅格系统,我们是这样在项目中实现的:

@for $i from 0 through 12 {
  .width-#{$i} {
    width: (1 / 12 * $i) * 100%;
  }
}

上面这几行代码就实现了我的需求,我需要有 .width-0 到 .width-12 的选择器,同时它们的样式分别是对应的百分比,我直接做了一个从 0 到 12 的循环,然后在其循环体中动态生成 class 和样式,它转换为 CSS 代码如下:

.width-0 {
  width: 0%;
}

.width-1 {
  width: 8.3333333333%;
}

.width-2 {
  width: 16.6666666667%;
}

.width-3 {
  width: 25%;
}

.width-4 {
  width: 33.3333333333%;
}

.width-5 {
  width: 41.6666666667%;
}

.width-6 {
  width: 50%;
}

.width-7 {
  width: 58.3333333333%;
}

.width-8 {
  width: 66.6666666667%;
}

.width-9 {
  width: 75%;
}

.width-10 {
  width: 83.3333333333%;
}

.width-11 {
  width: 91.6666666667%;
}

.width-12 {
  width: 100%;
}

从上面这个示例中是不是可以看出使用控制指令来实现一些需求很方便,这样可以省去你编写大量 CSS 代码的工作,而且计算宽度也仅仅需要设置好公式即可,在我们的项目中有很多类似的用法,至于 @if 指令一般会在函数中做判断来使用。

8.小结

本节内容我们讲解了 Sass 控制指令,它是非常常用的,在 Sass 中有四种控制指令,它们分别是:

  • @if 指令
  • @each 指令
  • @for 指令
  • @while 指令

趁热打铁,快来回忆一下这几个指令都是干嘛的:

image-20220824230811481

记住它们并多加练习,控制指令是非常好用的,它可以让你避免编写过多冗余的 CSS 代码,在项目中也很方便维护。控制指令是在 Sass 进阶中必不可少的知识!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/470505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

松下 OPF CMOS影像传感器

一、概述 不久前&#xff0c;松下在其国际网站公布了关于有机光电导膜&#xff08;OPF&#xff09;CMOS影像传感器技术的最新研发进展&#xff0c;并表示该技术已趋于成熟&#xff0c;有望在未来一段时间内正式投入商用。此外&#xff0c;松下还在3月15日至16日&#xff0c;于…

Oracle LiveLabs DB Security (数据库安全)实验汇总

在Oracle LiveLabs中&#xff0c;和数据库安全相关的实验分为2个系列&#xff0c;共12个实验。 Oracle数据库安全架构如下图&#xff1a; 这些实验涉及了Oracle安全相关的特性&#xff0c;企业版选件&#xff0c;独立产品和服务。 关于Oracle安全产品的中文主页可见&#…

Marior去除边距和迭代内容矫正用于自然文档矫正

一、简要介绍 本文简要介绍了论文**“ Marior: Margin Removal and Iterative Content Rectification for Document Dewarping in the Wild ”的相关工作。照相机捕捉到的文档图像通常会出现透视和几何变形。考虑到视觉美感较差和OCR系统性能下降&#xff0c;对其进行纠正具有重…

JavaScript实现输入圆的半径,输出周长、体积和面积的代码

以下为输入圆的半径,输出周长、体积和面积实现结果的代码和运行截图 目录 前言 一、请输入圆的半径,输出周长、体积和面积 1.1运行流程及思想 1.2代码段 1.3 JavaScript语句代码 1.4运行截图 前言 1.若有选择&#xff0c;您可以在目录里进行快速查找&#xff1b; 2.本博…

【crontab】如何解决命令末尾自动加^M,导致不生效的问题

目录 场景&#xff1a; 问题&#xff1a; 问题原因&#xff1a; 解决方案&#xff1a; Step 1&#xff1a;编辑文件yolov5 &#xff0c;并查看文件类型 Step 2&#xff1a;修改文件类型 yolov5 Step 3&#xff1a;yolov5中的定时任务加入到crontab中,并查看crontab 列表…

前端性能优化总结(SPA篇)

性能优化 所有开发者都无法避免的一个问题&#xff0c;即关于项目的性能优化。性能优化是一个经久不衰的问题&#xff0c;它几乎贯穿于整个项目的开发过程。做好性能优化的项目不仅能在用户体验上更胜一筹&#xff0c;还能让服务资源的分配更加的合理。 关于SPA&#xff08;单…

互联网医院开发|线上问诊系统开发|互联网医院功能开发

互联网医院在智慧医疗版块可以算的上是“核心成员”&#xff0c;无论是出色的实战能力还是在管理功能模块上&#xff0c;都为行业带来了切实的便利&#xff0c;就例如平时的工作安排&#xff0c;省时省力&#xff0c;也让患者有更方便的就医条件&#xff0c;互联网医院系统源码…

必须掌握的重写,重载,equals,==

生活是晨起暮落&#xff0c;日子是柴米油盐&#xff0c;时光匆匆&#xff0c;我们终将释怀。 重写与重载的区别 重写(Override) 1.发生在父类与子类之间 2.方法名&#xff0c;参数列表&#xff0c;返回类型必须相同 3.访问修饰符的限制一定要大于被重写方法的访问修饰符,如果…

【sunny land】利用Animation编辑器实现近战敌人判定

昨晚研究了一晚Boss近战判定&#xff0c;也找了一些方法&#xff0c;但始终找不到合适的 今天终于让我找到了[泪目] 让我们先看演示 这个效果是我们的Boss挥刀时不造成伤害&#xff0c;当火焰冒出来时再对主角造成伤害。 这个我讲详细点吧 步骤&#xff1a; 首先&#xff…

矿井水行业氟超标的解决方法

高矿化度的废水是指含有高浓度溶解性矿物质的废水&#xff0c;通常指的是含有高浓度钠、钙、镁、铁、铝、钾等离子的废水。这些离子通常来自于废水所处的环境、工业或生产过程中使用的原材料和化学品。高矿化度的废水通常具有高盐度、高电导率、高硬度等特征&#xff0c;对环境…

三星弃Google用Bing?谷歌赶工新AI搜索Magi

“三星考虑将手机端的默认搜索引擎由Google换成Bing”&#xff0c;《纽约时报》上的这则消息披露次日&#xff0c;微软股价上涨2%&#xff0c;谷歌母公司Alphabet股价下跌3%。 过去20年里&#xff0c;谷歌一直是在线搜索领域无人能敌的霸主&#xff0c;微软旗下的Bing只在3%-5…

录屏文件太大怎么办?您可以这样做!

案例&#xff1a;录制的录屏文件体积比较大怎么办&#xff1f; 【我发现我录制的电脑录屏文件体积比较大&#xff0c;不好保存&#xff0c;会占用电脑的内存。我想知道怎样才可以录制体积较小的录屏&#xff1f;有没有小伙伴有解决的办法&#xff1f;】 录屏是我们经常需要用…

ATTCK v12版本战术介绍——防御规避(四)

一、引言 在前几期文章中我们介绍了ATT&CK中侦察、资源开发、初始访问、执行、持久化、提权战术理论知识及实战研究、部分防御规避战术&#xff0c;本期我们为大家介绍ATT&CK 14项战术中防御规避战术第19-24种子技术&#xff0c;后续会介绍防御规避其他子技术&#xf…

IO流复习

IO流 程序到文件&#xff0c;文件到程序分为输出流和输入流流分为字节流&#xff0c;字符流 字节流可以操作所有类型文件&#xff0c;字符流只能操作文本文件&#xff08;可以用windows记事本打开并且能正常读懂的文件&#xff09; 流的结构图&#xff1a;只有下面接口的实现…

如何利用Trimble RealWorks三维激光扫描仪进行外业测量和内业处理?

文章目录 0.引言1.Trimble RealWorks介绍2.外业测量3.内业处理 0.引言 笔者所在资源与环境工程学院实验室采购有一台Trimble RealWorks三维激光扫描仪&#xff08;仪器名&#xff1a;Trimble TX8&#xff09;&#xff0c;因项目需要&#xff0c;在学校实验场地进行实地测量训练…

MIT教授Tegmark:GPT-4敲响警钟,百年后人类何去何从丨智源大会嘉宾风采

导读 一封呼吁暂停大模型研究6个月的公开信让一家名为未来生命研究所&#xff08;Future of Life Institute 简称&#xff1a;FLI&#xff09;站上了风口浪尖。这家研究所的联合创始人Max Tegmark是来自麻省理工学院的物理学家和人工智能研究员&#xff0c;《生命3.0在人工智能…

Unity TextMeshPro文本描边outline存在黑底问题研究

在使用TextMeshPro的时候遇到了字体黑底的问题&#xff0c;类似下图这样 当字体较大的时候表现正常&#xff0c;当缩小到一定程度就会出现黑底。这个情况让人第一时间就是怀疑SDF计算缩放的时候存在问题。在我们重新导出字体&#xff0c;调整图集字体大小以及Padding后&#xf…

【深度学习】点云PointNet从0到1

文章目录 前言1 PointNet1.1 点云的数据集1.2 点云的挑战1.1 网络结构 前言 直接处理点云数据的深度学习技术PointNet End To end Learning for scattered&#xff0c; unordered point data Unified franework for various tasks Point-Based Methods 分为 PointNet 和 Poin…

万字长文 - Nature 综述系列 - 给生物学家的机器学习指南 1

生物数据的规模不断扩大和固有复杂性促使越来越多的人在生物学中使用机器学习来构建相关生物过程的信息和预测模型。所有机器学习技术都是把数据拟合到模型&#xff0c;然而&#xff0c;具体方法千差万别&#xff0c;乍一看似乎令人困惑。在这篇综述中&#xff0c;我们旨在向读…

好用免费,国内手机人人都能玩的GPT!

用了这个长时间的chatgpt真的是觉得离不开它&#xff0c;太好用的&#xff01;又是是写作&#xff0c;编程&#xff0c;日常的一些咨询搜索的事情全部交给它了&#xff01;但是很少有人在手机上能玩GPT! 对于大多数普通选手来说&#xff0c;想在手机上玩GPT&#xff0c;始终离不…