04 【Sass语法介绍-运算】

news2025/1/24 7:23:47

1.前言

运算是一种通过已知量可能的组合,获得新的量的行为。Sass 中也为我们提供了各种各样的运算,以便我们更好的处理样式代码。本节我们将学习 Sass 中的数字运算、关系运算、除法运算、颜色运算、字符串运算等等…

2.什么是 Sass 运算?

运算从我们小时候就开始学习了,那在 Sass 中的运算是什么呢?
在我们写样式的时候,很多场景我们是需要用到计算的,而一般我们都是通过 javascript 来计算,CSS3 中也提供了用于运算的函数 calc() ,可能在工作中你使用过这个函数用来计算长度值,能用到的地方也非常有限。而在 Sass 中,扩展出了很多计算方法,使得你不止是可以计算长度值,还能做一些关系运算甚至颜色值的运算等等。这使我们可以把运算应用于更多的场景,来解决更复杂的问题,运算也是 Sass 的基本特性之一,下面我们一起来学习它~

这部分我们将详细讲解 Sass 运算中的:

  • 数字运算
  • 圆括号
  • 除法运算
  • 关系运算
  • 颜色运算
  • 字符串运算
  • 布尔运算

3.数字运算

在 Sass 中我们可以对数字类型的值进行加减乘除、取整的运算。在使用运算的过程中,一定要注意不能使用不兼容的单位!(在除法运算中除外),什么意思呢?就是说两个数字相加,你不能一个数字单位是 px 另一个数字单位是 em 。还有一点需要注意的是,如果你使用乘法运算,你只需要为其中的一个数值写上单位就好。数值的运算包括加 (+)、减 (-)、乘 (*)、除 (/)、取模 (%),乘法只需要有一个数值带单位即可,还有就是除法稍有特殊,后面会单独讲解,下面我来写一段代码看一下 Sass 的数字运算:

p {
  width: 10px + 20px; // 加法运算 (不能使用不兼容的单位)
  height: 500px +50; // 加法运算无单位的数字可以与有单位的一起使用
  max-width: 800px - 100px; // 减法
  max-height: 400px * 2; // 乘法,一个数值带单位即可
  font-size: 30px % 4; // 模运算
}

上面这段代码转换成 CSS 为:

p {
  width: 30px;
  height: 550px;
  max-width: 700px;
  max-height: 800px;
  font-size: 2px;
}

上面我们对 Sass 数值运算的加减乘和模运算做了演示,在 Sass 的数字运算中还有一个需要特别注意的:减法运算符两边需要加空格或者都不加空格,也就是说运算符的两边是对称的;为什么要这样呢?因为减法运算符 - 不仅仅表示减法,对于负数或者一元否定则只需要在其前面加空格就好,也就是说这个标识符还可以表示负数和一元否定;我们举个例子来看下:

p {
  width: 10px - 5px; // 前后都有空格
  width: 10px-5px; // 前后都没有空格
  width:10px -5px; // 只有前面有空格
}

上面这段 Sass 代码将会被编译成如下的 CSS :

p {
  width: 5px;
  width: 5px;
  width: 10px -5px;
}

我们可以看到上面的代码,如果你只在 - 标识符前面加了空格,其两边不对称是不会对数值进行运算的,所以这个在你写代码的过程中一定要注意!

4.除法运算

在讲除法运算之前,一定要先讲一下这个圆括号 () ,圆括号和数学运算中一样,可以来控制运算顺序,这个我们从小就学过,在 Sass 运算中你同样可以使用它来控制运算顺序。

另外就是如果你直使用除法运算符, Sass 会把这当成一个分隔符来处理,但如果你是写在圆括号内就可以被当作除法操作处理了,这也是圆括号在 Sass 中的另外一个作用!

在 CSS 中,你要知道 / 这个标识符并不是代表除法的,一些 CSS 的属性值是支持使用 / 来分隔的,所以在 Sass 中直接使用 / 也是会当成分隔符来处理。但是呢,在以下情况下,Sass 将会把 / 视为除法运算:

  • 运算符前后的值存储在变量中或由函数返回
  • 运算符和前后的值被圆括号所包裹
  • 值是另外一个表达式的一部分

下面我们来举例看一下:

$one: 20px / 2;
$two: 10px;
p {
  width: 200px + 100px / 10; // 值是另外一个运算表达式的一部分
  font-size: $one; // 前后的值存储在变量中或由函数返回
  border-width: $two / 5; // 前后的值存储在变量中或由函数返回
  height: (800px / 2); // 被圆括号所包裹
  max-width: 800px / 2; // 会被当作分隔符来处理,而不是除法运算
}

上面这段 Sass 代码我对使用 / 的情况进行了注释,那么它转换为 CSS 代码是:

p {
  width: 210px;
  font-size: 10px;
  border-width: 2px;
  height: 400px;
  max-width: 800px/2;
}

上面我们看到了 Sass 除法运算的使用,还有一种情况是:假如我在两个变量之间使用 / 标识符,而且我又不想对这两个变量进行除法运算,我只是想对这两个变量的值进行分隔而已,那该怎么办呢?那我们需要使用插值 #{} 来将两个变量包裹住即可,关于插值以后的章节会有讲解,这里我们先看一下如何做:

$one: 20px;
$two: 10;
p {
  width: $one / $two; // 没有使用插值,会对变量值进行除法运算
  height: #{$one} / #{$two}; // 使用插值,不会进行除法运算
}

上面这段使用插值的代码将会转换为如下的 CSS 代码:

p {
  width: 2px;
  height: 20px/10;
}

好了,除法运算讲完了,通过上面的讲解,是不是感觉 Sass 中的除法运算和你脑海中的还是有差别的,还有一个值得注意的是,如果你使用除法运算前后的值都带有相同的单位,那么最后的结果是一个不带单位的数值。在以后你使用除法运算的时候一定要知道在 Sass 中 / 不仅仅代表除法运算,你要用正确的方式来使用它!

5.关系运算

在 Sass 中关系运算来比较数字与数字间的大小,和数字运算一样,关系运算也是不能使用不兼容的单位。关系运算的返回值是布尔值( true 或 false ),下面我们举个例子看下:

p {
  width: 10px > 5px; // 大于
  width: 10 < 5px; // 小于
  width: 10 >= 5; // 大于等于
  width: 5 <= 5; // 小于等于
  width: 5 == 5; // 等于
}

在上面这个例子中,width 属性的值是没有布尔类型的,我这里这么举例子是为了让大家可以更直观的感受,一般关系运算不会直接应用于样式表中,在 Sass 的函数中应用的比较多。那么上面这段代码转换成 CSS 如下:

p {
  width: true;
  width: false;
  width: true;
  width: true;
  width: true;
}

到这里你应该了解 Sass 中的关系运算了,切记我这里的代码举例只是为了让大家直观的感受,实际情况下并不会这么写。另外在 Sass 中使用相等运算符去做比较的时候,对于数字类型,数字具有相同的值和相同的单位,或者在单位之间转换时它们的值相等,则它们是相等的;对于字符串类型,具有相同内容的未加引号和带引号的字符串被认为是相等的;对于颜色类型,具有相同的红色、绿色、蓝色和alpha值,则颜色是相等的;

6.颜色运算

颜色要怎么运算呢?下面我们举个例子看一下:

body {
  color: #020304 + #050203;
}

在进行颜色值计算的时候是分段计算的,也就是 02 + 05 、03 + 02 、04 + 03,我们知道十六进制颜色值是分为三组的(两个数字一组),分别代表红、绿、蓝,所以在做运算的时候也是按照这个来运算的,那么上面这段代码转换成 CSS 为:

body {
  color: #070507;
}

上面我们讲了颜色运算,但是 Sass 官方给出了明确的说明:不推荐使用颜色运算,而使用颜色函数。什么原因呢?因为 Sass 颜色运算所产生出来的色值可能和你感知的并不一致,所以不推荐使用。如果你使用了的话, Sass 也是支持的,但是会给出警告,强烈建议用户避免使用颜色运算!所以我们的教程里只是做了个演示,你可以了解下,但在实际开发中不推荐使用颜色运算,可以使用颜色函数来实现你的需求!

7.字符串运算

在 Sass 中还允许对字符串进行运算,那对于字符串的运算都有哪些呢?我们先文字描述下:

  • 字符串1 + 字符串2:用于连接字符串,结果会返回包含两个字符串的新字符串,如果这其中一个字符串带引号,那么结果也会带引号,否则就不带引号(带引号的字符串要位于 + 号左侧);
  • 字符串1 / 字符串2:返回一个字符串,这里包含字符串 1 和 字符串 2 ,会用 / 分隔;
  • 字符串1 - 字符串2:返回一个字符串,这里包含字符串 1 和 字符串 2 ,会用 - 分隔。

下面我们使用代码来举例看下:

p {
  color: r + 'ed'; // 带引号的在加号右侧,返回一个不带引号的字符串
  color: 'r' + ed; // 带引号的在加号左侧,返回一个带引号的字符串
  color:r + ed; // 返回一个不带引号的字符串
  color: r/ed; // 返回一个使用 / 分隔的字符串
  color: r-ed; // 返回一个使用 - 分隔的字符串
}

上面这段代码会转换为如下的 CSS 代码:

p {
  color: red;
  color: "red";
  color: red;
  color: r/ed;
  color: r-ed;
}

同样此处举的例子只是为了方便大家感受,实际应用时可能并不会写这么多 color 属性,字符串运算可以让你很方便的拼接一些字符串来使用。

8.布尔运算

可能与其他的语言不太相同,Sass 中的布尔运算使用的不是运算符而是单词,所以 Sass 中的布尔运算是 not 、and 和 or,not 的意思是取反,and 的意思是两个都为真则返回真反之则返回假,or 的意思是其中一个为真则返回真。看到这你可能懂了,这不就是我们常说的逻辑非、逻辑与和逻辑或嘛,下面我们举个例子来看下:

{
  a: true and true;
  b: true or false; 
  c: true and false;
  d: not false;
}

那么上面这段代码在 Sass 中会转换为:

{
  a: true;
  b: true;
  c: false;
  d: true;
}

布尔运算在实际写样式的时候基本是不会用到的,大家也不会直接在样式中应用,一般布尔运算会应用在 Sass 函数中。

9.实战经验

上面讲了这么多,现在该说到实战了。在实际的项目开发中,可能最最常用的就是加减乘除的运算了,有时可能会用到字符串运算。在你写 CSS 的时候,相信你一定知道 rem 布局,这个简直太常用了。我们在做 rem 布局的时候经常会设置一个根元素的字体大小,然后其余所有的像素可能都根据这个去计算,所以为了便于维护,我把这个根元素的大小抽离出来作为一个变量,然后在每个元素的样式中对这个变量进行运算就可以了,同时呢,我们还可以在动画中运用一些运算,我们一起来看下:

$root: 28;

html {
  font-size: $root+px;
}
p {
  width: (460rem / $root);
  height: (320rem / $root);
}

@keyframes sacle {
  0% {
    width: (800px - $root);
  }
  50% {
    width: 800px - $root * 2;
  }
  100% {
    width: (800px / $root);
  }
}

上面这段代码我们动态的计算了 rem 还有动画中的一些需要的运算。而且这样做的好处是我们可以随时按需更改变量而不需要重新把没处样式都再手动进行更改,这样就让项目的代码更具有扩展性并且更易于维护。它将会被转换为如下的 CSS 代码:

html {
  font-size: 28px;
}

p {
  width: 16.4285714286rem;
  height: 11.4285714286rem;
}

@keyframes sacle {
  0% {
    width: 772px;
  }
  50% {
    width: 744px;
  }
  100% {
    width: 28.5714285714px;
  }
}

在我们的项目中,我们会把 $root 这个变量抽出来到专门维护变量的文件中,然后供项目中所有的页面做运算使用。

10.小结

本节我们讲解了 Sass 中的运算以及运算的应用,我们回忆一下都有哪些运算:

image-20220823191110579

在编写样式的时候加减乘除运算可能会应用的比较多,而字符串运算、布尔值运算、关系运算在 Sass 函数中应用比较多,后面的章节我们会讲解 Sass 函数,而颜色运算官方已经不推荐大家使用了,取而代之的是颜色函数,所以这里我们也尽量不要使用颜色运算了。

在 CSS 中的某些需要你自己计算的值你可以尝试使用 Sass 运算来提升你的开发效率,而且像一些经常使用到的运算完全可以抽离出来统一维护,这样项目会更加易于维护,管理起来也更清晰!Sass 的运算我个人认为是一个能特别提升开发 CSS 效率的扩展功能。

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

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

相关文章

ArcGIS Pro坐标系统

目录 1 测量学基础 1.1 地球的形状和大小 1.1.1 大地水准面 1.1.2 大地体 1.1.3 地球椭球 2 坐标系统 2.1 地理坐标系 2.2 投影坐标系 2.3 局部坐标系&#xff08;假定坐标系&#xff09; 2.4 高程坐标系 3 地图投影 3.1 投影概念 3.2 投影分类 3.3 投影类型 3.…

长按实现安卓端下载图片和安装包

①长按按钮保存图片至安卓手机相册 using System.Collections; using System.Collections.Generic; using UnityEngine;public class LongPress : MonoBehaviour {//设置变量记录触摸时间与bool触摸private float touchTime;private bool newTouch = false;void Update () {//判…

在线问诊小程序系统方案以及价值

方案价值zlzwgz0127 1.扩大医院流量 a.预约到院 在线展示专家的介绍&#xff0c;更能彰显实力&#xff0c;吸引患者来院就医&#xff0c; 用户可选择在线问诊和预约到院 b.社区团购导流 与我们合作社区团购给医院的体检产品导流 c.专家直播导流 通过专家直播吸引潜在患者…

( 哈希表) 1. 两数之和 ——【Leetcode每日一题】

哈希表使用 O ( N ) O(N) O(N) 空间复杂度存储数据&#xff0c;并且以 O ( 1 ) O(1) O(1) 时间复杂度求解问题。 ❓1. 两数之和 难度&#xff1a;简单 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&am…

计算机网络【1】 TCP/IP

OSI七层模型与TCP/IP四层模型 首先简单说一下OSI参考模型&#xff0c;OSI将网络分为七层&#xff0c;自下而上分别是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层&#xff0c;而TCP/IP体系结构则将网络分为四层&#xff0c;自下而上分别是网络接口层、网络层、…

如何冲破 GPT-4 的信息茧房?

由于大模型的成功经验&#xff0c;整个 AI 领域纷纷转向&#xff0c;要么是将模型架构换为 Transformer&#xff0c;要么是将小模型换为大模型&#xff0c;要么是将建模方式换为自监督、自回归范式等等。 GPT-4 推出后&#xff0c;各种 demo 充斥网络空间&#xff0c;写代码、…

论文投稿指南——如何让SCI论文英语更地道(细节掌握)

​ 学术论文英文写作都要符合ABC三个基本点&#xff1a;准确、简洁和清晰 (Accurate\Brief\Clear)&#xff0c;在此基础上做好必要的细节&#xff0c;可以让你的英文写作更地道化、学术化。以下建议可供各位小伙伴参考&#xff1a; 一、错误用法 ★ So/But/And/Also…等连接词…

如何判定自己适合自学编程还是报班?

首先在这里&#xff0c;不做偏向性推荐&#xff0c;主要还是看个人条件。 宝剑锋从磨砺出&#xff0c;学习本身是一件艰苦的事情。在决定之前&#xff0c;建议先按照下图问自己三个问题自我检测。 如果你还不能确定&#xff0c;自学和报班的优劣势分析&#xff0c;或许能帮你们…

Spring JDBC和事务控制

目录 Spring JDBC 和 事务控制主要内容Spring 整合 JDBC 环境构建项目添加依赖坐标添加 jdbc 配置文件编写 spring 配置文件配置数据源C3P0 数据源配置DBCP 数据源配置 模板类配置Spring JDBC 测试 &#xff08;入门&#xff09;创建指定数据库创建数据表使用 JUnit 测试JUnit …

面试题30天打卡-day14

1、线程的生命周期是什么&#xff0c;线程有几种状态&#xff0c;什么是上下文切换&#xff1f; 线程通常有五种状态&#xff1a;创建&#xff0c;就绪&#xff0c;运行、阻塞和死亡状态。 新建状态&#xff08;New&#xff09;&#xff1a;新创建了一个线程对象。就绪状态&am…

超赞的实用前端社区精选?

转载 作者&#xff1a;黑马程序员前端 链接&#xff1a;https://www.zhihu.com/question/39503897/answer/2998752442 社区精选 | 好的前端社区可以根据其特点和领域进行分类整理&#xff1a; 1. 问答社区 Stack Overflow&#xff08;https://stackoverflow.com/&#xf…

【一起撸个DL框架】3 前向传播

CSDN个人主页&#xff1a;清风莫追 欢迎关注本专栏&#xff1a;《一起撸个DL框架》 文章目录 3 前向传播&#x1f95d;3.1 前情提要3.2 前向传播&#xff1a;递归的forward方法3.3 再添乘法节点&#xff1a;搭建函数y2x13.4 小结 3 前向传播&#x1f95d; 3.1 前情提要 上一篇…

vue - 实现对div的拖动功能

实现对div的拖动功能&#xff0c;需要先要知道以下的一些原生事件和方法&#xff1b; 1&#xff0c;事件: 方法描述onmousedown鼠标按钮被按下onmousemove鼠标被移动onmouseup鼠标按键被松开 2&#xff0c;方法: 方法描述event.clientX返回当事件被触发时鼠标指针相对于浏览…

基于elementplus 实现多级表格 最后一级展示图片

想要实现的效果 总共四级 前三级是表格 第四级使用图片展示&#xff1b; 看了一下官网 计划使用官网的树形结构&#xff0c; 但是发现并不能满足最后一个是图片形式的展示 最后利用了表格的expand&#xff1b; 在过程中主要需要解决的问题有&#xff1a;vue3 递归使用组件&am…

JavaScript题解2652.倍数求和|容斥原理

解题思路 在JavaScript中计算7/3*3&#xff0c;结果是7&#xff0c;而不是6。这是因为JavaScript中除法运算符&#xff08;/&#xff09;得到的结果是一个浮点数&#xff0c;而不是一个整数。 具体来说&#xff0c;7/3得到的结果是2.3333…&#xff0c;然后再乘以3得到7.0000…

辞了外包,上岸字节我落泪了,400多个日夜没人知道我付出了多少....

前言&#xff1a; 没有绝对的天才&#xff0c;只有持续不断的付出。对于我们每一个平凡人来说&#xff0c;改变命运只能依靠努力幸运&#xff0c;但如果你不够幸运&#xff0c;那就只能拉高努力的占比。 2023年3月&#xff0c;我有幸成为了字节跳动的一名自动化测试工程师&am…

nacos搭建

1、查询对应的nacos版本 在pom.xml文件中&#xff0c;按住ctrl单击 spring-cloud-alibaba-dependencies 跳转到对应的页面&#xff0c;搜索nacos 2、下载软件nacos 官网&#xff1a;https://nacos.io/zh-cn/ 地址 https://github.com/alibaba/nacos/releases 这里我们根据我…

【架构】如何在微服务下保证事务的一致性

文章目录 背景一、事务的介绍1.1 事务1.1.1 事务的产生1.1.2 事务的概念1.1.3 事务的特性1.1.4 Mysql隔离级别1.1.5 启动事务 1.2 本地事务1.2.1 本地事务定义1.2.2 本地事务的缺点 二、分布式事务定义三、分布式事务-强一致性解决方案3.1 二阶段提交协议3.2 三阶段提交协议 四…

centos7 nbd 挂在qcow2或qcow,raw,虚机镜像,virsh,virt,使用qemu-nbd挂载qcow2镜像文件

[rootlocalhost linux-3.10.63]# cat ../../../readme https://blog.51cto.com/mshxuyi/5857760 https://blog.csdn.net/weixin_42097108/article/details/111414501 错误解决 &#xff11;、nbd 模块未安装 登录后复制 [rootlocalhost ~]# modprobe nbd modprobe: FATAL…

ElasticJob-Lite 3.x 集成springBoot 实战 (一次性作业、定时作业)

文章目录 前言ElasticJob-Lite 3.x 集成springBoot 实战 (一次性作业、定时作业)1. ElasticJob简介2. ElasticJob-Lite 是什么3. 功能列表4. 所需依赖包5. 定时作业配置5.1. 作业:5.2. yml配置:5.3. 测试 6. 一次性任务配置、并手动触发6.1. 作业:6.2. yml配置:6.3. 测试 7. 其…