Sass语法介绍-运算

04 【Sass语法介绍-运算】

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.mzph.cn/pingmian/10076.shtml

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

相关文章

OSPF虚链路

原理概述 通常情况下&#xff0c;一个OSPF网络的每个非骨干区域都必须与骨干区域通过ABR路由器直接连接&#xff0c;非骨干区域之间的通信都需要通过骨干区域进行中转。但在现实中&#xff0c;可能会因为各种条件限制&#xff0c;导致非骨干区域和骨干区域无法直接连接&#x…

[muduo网络库]——muduo库三大核心组件之 Poller/EpollPoller类(剖析muduo网络库核心部分、设计思想)

接着上文&#xff0c;[muduo网络库]——muduo库三大核心组件之Channel类&#xff08;剖析muduo网络库核心部分、设计思想&#xff09;&#xff0c;本章我们来学习muduo网络库中第二大核心组件Poller/EpollPoller类。 先回顾一下三大核心组件之间的关系。 接着我们进入正题。 P…

解决VScode -正在本地下载 VS Code 服务器

不知道怎么回事再次连接服务器的时候一直卡在这里了&#xff0c;查看输出信息发现一直卡在下载处&#xff0c;报错信息如图1&#xff0c;输出信息如图2。 1.报错信息 图1 报错信息 图2 输出信息 2.尝试 【已解决】设置SSH主机&#xff1a;VS Code-正在本地下载 VS Code 服务器…

代码随想录算法训练营第二十五天 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 题目链接/文章讲解&#xff1a; 代码随想录 视频讲解&#xff1a; 你修剪的方式不对&#xff0c;我来给你纠正一下&#xff01;| LeetCode&#xff1a;669. 修剪二叉搜索树_哔哩哔哩_bilibili 解题思路 在上一题的删除二叉树节点中&#xff0c;我们通过在…

无线收发模块家电控制实验

zkhengyang可申请加入数字音频系统研究开发交流答疑群(课题组) 当然可以先用固定电平发送&#xff0c;可以实现&#xff0c;0/1数据发送&#xff0c;接收。 可以使用51单片机来编码码&#xff0c;解码&#xff0c;或者任何MCU或者SOC&#xff0c;DSP&#xff0c;FPGA。 注意G…

初识指针(4)<C语言>

前言 前面的文章&#xff0c;已经对指针的基础概念以及运用有了初步了解&#xff0c;我们可以进一步探究指针比较深入的知识&#xff0c;下文将主要介绍&#xff1a;使用指针数组模拟二维数组、字符指针变量、数组指针、二维数组传参的本质、函数指针、typedef关键字等。 目录…

F. Circle Perimeter

思路&#xff1a;线性时间复杂度就可以解决&#xff0c;不用二分&#xff0c;我们枚举横坐标&#xff0c;然后看当前横坐标情况下多少个纵坐标满足条件。 代码&#xff1a; void solve(){int r;cin >> r;int y r, ans 0;for(int x 0;x < r;x ){ //枚举横坐标x&am…

只需3步,使用Stable Diffusion无限生成AI数字人视频(附安装包)

基本方法 搞一张照片&#xff0c;搞一段语音&#xff0c;合成照片和语音&#xff0c;同时让照片中的人物动起来&#xff0c;特别是头、眼睛和嘴。 语音合成 语音合成的方法很多&#xff0c;也比较成熟了&#xff0c;大家可以选择自己方便的&#xff0c;直接录音也可以&#…

Codeforces Round 944 (Div. 4) A - G

div.4只写部分题解了&#xff0c;都比较基础&#xff0c;数学偏多一点&#xff0c;几乎没有算法&#xff0c;有不懂的欢迎评论区提问&#xff01; A. My First Sorting Problem #include<bits/stdc.h> using namespace std ; typedef long long ll ; const int maxn 2…

org.hsqldb.jdbcDriver 类,导致 ClassNotFoundException 异常如何解决?

确保JDBC驱动包存在&#xff1a;检查系统是否已经安装了HSQLDB JDBC驱动。如果没有安装或驱动没有正确放置在类路径中&#xff0c;需要下载并添加它。你可以从 HSQLDB官网 下载JDBC驱动包。 添加JDBC驱动到类路径&#xff1a;将下载的HSQLDB JDBC驱动&#xff08;通常是一个JA…

2024年,Web开发新趋势!

随着我们迈入新的一年&#xff0c;现在正是审视2024年网页开发领域开始流行哪些趋势的绝佳时机。回顾2023年的一系列更新&#xff0c;以下是来年一些热门话题的概览。 自主托管有回归的趋势 近些年&#xff0c;自主托管一直是网页开发者和公司托管其应用程序的默认方式。开发…

【Linux系统编程】第十六弹---冯诺依曼体系结构与操作系统

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、冯诺依曼体系结构 2、操作系统原理 2.1、什么是操作系统&#xff1f; 2.2、用图解释操作系统 2.3、理解操作系统 总结 …

centos7.9系统rabbitmq3.8.5升级为3.8.35版本

说明 本文仅适用rabbitmq为RPM安装方式。 升级准备 查看环境当前版本&#xff1a; # cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) # rabbitmqctl status Status of node rabbitmq01 ... RuntimeOS PID: 19333 OS: Linux Uptime (seconds): 58 Is under …

在Tiled中制作动画瓦片图

什么是瓦片图&#xff1f;瓦片图是指用图块把游戏场景评出来 工具安装链接&#xff1a;Tiled | Flexible level editor 资源下载教程 资源下载&#xff1a;Mystic Woods - 16x16 Pixel Art Asset Pack by Game Endeavor 解压后得到一些资源 新建图块集合 Tiled的安装就不介绍…

【MySQL】——课程平台的创建设计

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

element-plus表单上传,唯一替换文件校验,封装方法统一管理

<el-formref"ruleFormRef":model"ruleForm":rules"rules"label-width"110px" ><el-form-item label"语言成绩材料" prop"languageList"><div class"dis-flex w100"><el-uploadref…

什么是Meme币?——区块链技术的加密货币

Meme代币是一种基于区块链技术的加密货币&#xff0c;旨在为用户提供一种简单、有趣且易于传播的方式来进行数字资产交易和投资。Meme代币通常与特定的主题或故事相关联&#xff0c;通过社交媒体等渠道进行传播和推广&#xff0c;吸引更多的用户参与并增加其价值。 Meme代币的…

英语学习笔记4——Is this your ...?

Is this your …? 词汇 Vocabulary suit /sut/ n. 西装&#xff0c;正装 suit 的配套&#xff1a; shirt n. 衬衫tie n. 领带&#xff0c;领结belt n. 腰带trousers n. 裤子shoes n. 鞋子 school /skuːl/ n. 学校 所有学校 搭配&#xff1a;middle school 初中    hig…

浅谈现代消息队列与云存储

一、前言 1970 年代末&#xff0c;消息系统用于管理多主机的打印作业&#xff0c;这种削峰解耦的能力逐渐被标准化为“点对点模型”和稍复杂的“发布订阅模型”&#xff0c;实现了数据处理的分布式协同。随着时代的发展&#xff0c;Kafka&#xff0c;Amazon SQS&#xff0c;Ro…

C++牛客小白月赛题目分享(1)生不逢七,交换数字,幻兽帕鲁

目录 1.前言 2.三道题目 1.生不逢七 1.题目描述 2.输入描述: 3.输出描述: 4.示例&#xff1a; 5.题解&#xff1a; 2.交换数字 1.题目描述&#xff1a; 2.输入描述&#xff1a; ​编辑 3.输出描述&#xff1a; 4.示例&#xff1a; 5.题解&#xff1a; 3.幻兽帕…