当前位置: 首页 > news >正文

9.19 Sass

官网地址:https://www.sass.hk/

中文文档地址:https://www.sass.hk/docs/

说明:世界上最成熟、最稳定、最强大的专业级CSS扩展语言!

Sass,less,stylus [ˈstaɪləs],他们在本质上都是一样的,都是预编译语言,编译成了css

css中的问题

择器层数太多,中间使用很多个空格叠加,需要把前面的父元素写完整,否则优先级不够

sass是什么

sass写出来的代码跟css差不多,但是不是css,浏览器对于样式只能识别css,其他的都是不行的,sass可以加快我们css的编码速度,但是刚开始学习会觉得麻烦;

怎么使用sass

1.安装插件

通过vscode打开项目,并且安装插件
![[1280X1280 (16).PNG]]
本质上来说实现sass并不是依赖于插件,点击进入到sass的安装中会发现,安装非常麻烦,需要安装各种各样的东西,必须项ruby等
![[1280X1280 (17).PNG]]

2.注意:开始编辑安装md文档

安装插件 live sass complier
![[8c836f45-053c-4795-81f6-2a61281feaaf.png]]
安装插件后,在.scss(.sass)文件中,独步的状态栏上会有一个选项。
![[8363937e-72ec-4753-a49d-1f3b3e9ce243.png]]
注意,得先创建scss文件才会出现这个选项,创建style.scss文件

这时候会发现文件的后缀名是scss而不是sass,这个先不管,后面咱们再说区别
![[da5ea961-db79-40bf-9f22-cb1253bc1eb3.png]]

3.现在已经开始监听了,但是如果里面没有代码,则会显示以下信息

有代码之后,就会显示以下信息
![[83196a26-f6ba-4f43-beb9-7539e48f1b73.png]]
![[8b201ecc-3143-4cff-87e8-f8bbb3f160a9.png]]
![[59a4408f-402b-46a7-8ac0-e22f66aae091.png]]
Generated 产生,产生什么东西呢?一个style.css.map文件和style.css文件

  1. 添加更多sass代码

查看scss和css没什么太大的差别,就是简单的复制粘贴,我们再写点东西

div{color: red;p{font-size: 12px;}
}

兄弟选择器和父子关系选择器

div{color:red;p {font-size:12px;}span{font-size:12px;}
}

注意:最早的文件格式为 .sass,但是这种格式对css用户不够友好;并且新的特新支持不够好,所以sass官方也不推荐使用该格式,推荐使用.scss格式 这种格式对css格式进行了精简,不能写大括号和分号;选择器和属性纯靠锁进实现,容易出错,并且刚开始使用,不便于使用 一般使用sass我们会使用.scss作为我们的文件格式

5.修改生成文件的路径

默认情况下,生成的css文件,会出现在当前sass所在的目录,需要配置

配置流程

插件的配置肯定要找到这个插件 插件 - 车轮 - 扩展设置 - Formats
![[bd76fc77-c472-40bc-b05e-d27c67858876.png]]
点击进去之后,需要使用json格式配置,但是我们也不知道格式; 可以查看手册

查看配置格式

点击标题 - setting设置 -
![[7892af9d-37d4-4478-9559-4660c8d62506.png]]
![[48c39a41-909f-4ce8-b934-9905da5e9855.png]]
点击进去之后是个github的地址,第一个模块就是了
![[a41d13f7-0868-46d0-b57f-b6bb951133b2.png]]
里面可以设置这么多信息,但是我们常用的就2个,不知道格式怎么写,可以打开Examples 打开设置后,选择 formats,window会自动生成一套配置,没有生成的直接去github上复制就可以了

format输出css中的格式,
extensionName输出的后缀名
savePath保存路径(导出的css文件路径,这个路径从项目根目录开始),如果要单词生成css文件夹 ‘./css
savePathSegmentKeysnull
savePathReplaceSegmentsWithnull

“extensionName”: 现在不太能理解,后面讲小程序,小程序中生成的css后缀名为wxss,所以这样可以用来控制格式

“savePath”: 我们现在打开的是sass,这时候的./就是sass,那么./css/表示的是对应的css文件夹
所以:我们只需要更改savaPath的值就可以了

"liveSassCompile.settings.formats": [{// compressed 压缩格式// 嵌套格式 展开格式// compact 紧凑格式// nested 嵌套格式"format": "expanded","extensionName": ".css","savePath": "~./css/" //编译后的文件生成路径 "./css/"}
]
6.生成的map文件是干什么用的

map:地图;map是用来做映射的

浏览器中加载的是scss,scss是源文件,但是我们真正使用的是css文件;

如果我们要修改颜色,显示是在style.scss的第4行;

那我们直接找到文件对应的第四行修改就可以了

嵌套语法结构

sass语法特点
  • 完全兼容 CSS3

  • 在 CSS 基础上增加变量、嵌套 (nesting)、混合 (mixins) 等功能

  • 通过函数进行颜色值与属性值的运算

  • 提供控制指令 (control directives)等高级功能

  • 自定义输出格式

sass中的注释

sass中支持单行注释: // 也支持多行注释:/**/

嵌套

1.基础语法格式

div{样式属性:属性值;P{样式属性:属性值;Span{样式属性:属性值;}}
}

注意:这种嵌套形式很容易让我们陷进去,会导致选择器的多层嵌套,如果选择器越多,则性能越差

2.子代,兄弟各种选择器的写法

div{// div的子代子代选择器{}// div的兄弟兄弟选择器 {}
}

(2)加:hover(类似的相同)

3.& 选择器本身 如果想要在这添加一个hover状态,怎么添加 正常情况下 div:hover 和 div :hover 一样么? !!!不一样的!!!

div{// &表示divp{// &表示div p}
}
  1. @at-root给选择器添加动画
    需求给p标签下的span添加文本颜色的过渡 现在添加动画直接在对应的标签下面写就可以了,之前还需要在前面添加@at-root 过渡效果是可以实现的,但是,会发现生成的css中会有一个带有-webkit-前缀的

  2. 属性嵌套
    除了选择器嵌套,还有一个东西叫做属性嵌套 属性嵌套相对来说,并不是太好用; 咱们又很多符合属性:font,margin,padding,border等等都属于复合属性
    ![[3ed7467d-3513-4512-a4d4-cccd9a69d873.png]]
    ![[2c6ea2f7-14f0-4982-9282-33409c32d2b0.png]]
    这个叫做属性嵌套,看完之后大家可能觉得还不如自己写css呢,大家可以慢慢用上这些东西,慢慢用着用着就会觉得很方便,很顺手; 等到你熟练之后,明显感觉使用sass你的速度会快很多; 将来工作中很可能会用这个东西,但是你用或者不用,不会影响咱们的页面布局,只是会让你做一种样式的选择,推荐大家以后的项目都适用sass来写样式

变量的定义

语法: $变量名:变量值

变量以美元符号开头,赋值方法与css属性的写法一样

格式: 必须以$开头 后面可以使用数字字母下划线,中划线

至于前面那个美元”$”符号,它其实是一个标识,告诉Sass, 这是一个外号,并不是一个真SB。 使用场景:整体页面的色系为红色

// 主题颜色
$color:#f00;
// 主体大小
$fsize:16px;
div{width: 600px;height: 200px;margin: 0 auto;background-color: 
$color;font-size: $
fsize;
}

![[3234f509-d693-451b-82f3-a27e5861e7fd.png]]

变量的作用域

sass中的变量支持会计作用域,嵌套规则内定义的变量只能在嵌套规则中使用(局部变量),不在嵌套规则内定义的变量则可在任何地方使用(全局变量)。将局部变量专为全局变量可以添加!global声明 !global:把局部变量变成全局,但是感觉很少能用得到,既然这么多选择器要使用,直接定义成全局不是更方便么?

$color: orange;//定义全局变量(在选择器、函数、混合宏...的外面定义的变量为全局变量)
.div {color: $color;//调用全局变量
}
.box {$color: red;//定义局部变量$size:16px !global; // 将局部变量 变成 全局a {color: $color;//调用局部变量}
}
span {color: $color;//调用全局变量font-size: $size;
}

什么时候使用变量?

  1. 该值至少重复出现了两次;

  2. 该值至少可能会被更新一次;

  3. 该值所有的表现都与变量有关(非巧合)。

基本上,没有理由声明一个永远不需要更新或者只在单一地方使用变量。

sass数据类型(数字,字符串,颜色,布尔值,数组-list,maps-object)

1.sassScript数据类型

SassScript 支持 6 种主要的数据类型: 数字,1, 2.3, 13, 10px, 5a 字符串,有引号字符串与无引号字符串,“foo”, ‘bar’, baz 颜色,blue, #04a3f9, rgba(255,0,0,0.5)

布尔型,true, false 空值,null 数组 (list),用空格或逗号作分隔符,1.5em 1em 0 2em, Helvetica, Arial, sans-serif maps, 相当于 JavaScript 的 object,(key1: value1, key2: value2)

判断数据类型的方式:type-of($value)

2.数字类型

在sass中,10,12.5,24px这些都是数字类型 sassScript支持两种数字类型:带单位数字和不带单位数字(可正可负可零可浮点型) 只要是以数字开头的都是数字类型 注意:单位会和数组当做一个整体,进行运算 有单位的:width,height 无单位的:透明度0.5

$num :25px;
.box {width: $num * 6;height: $num * 4 - 10px;background-color: #f00;padding: $num + 2px;font-size: $num - 4;// font-size: $num - 1em; 25px and 1em have incompatible units. [25px和1em的单位不兼容]
}

原来在css中想要运算,需要使用calc函数

3.字符串

sass的字符串有两种类型: 有引号字符串:路径地址 - http://sass-lang.com 无引号字符串: 颜色 - red

$color:'red';
$color1:red;
$url:'http://www.yhit.org/content/themes/yhit/resource/index/images/index/hj1.jpg';
div{width: 300px;height: 300px;font-size: 30px;background-image: url($url);// color: $color1; // 颜色值不能带字符串color: #{$color};// 非要使用$color,可以添加#{},有引号字符串将被编译为无引号字符串
}
4.颜色运算

注意事项: 两个十六进制的颜色值,进行运算的时候,会分为rgb三个色段分别进行运算 颜色值也可以进行乘法运算 rgba的颜色运算,后面的透明度要保持一致,否则会报错

// 案例一:颜色值相加
color: #010203 + #040506;
返回值为:color: #050709;// 案例二:乘法运算
color: #010203 * 2;
返回值:color: #020406;// 案例三:透明度保持一直
如果颜色值包含alpha channel(rgba或hsla两种颜色值),必须拥有相等的alpha 值才能进行运算,因为算数运算不会作用于alpha值
color: rgba(255,0,0,0.55) + rgba(255,255,0,0.35);// 正常使用:
color: rgba(255,0,0,0.55) + rgba(0,255,0,0.55);
结果为:color: rgba(255, 255, 0, 0.55);// 案例四:定义变量颜色,并对颜色进行计算【不能使用】
$color:#04a3f9;
div{width: 300px;height: 300px;font-size: 30px;background-color: $color + 1;
}

循环(for,each,while)【重要】

for循环

在Sass中,可以使用“@for”来实现循环操作。其中有2种方式。 @for $i from 开始值 through 结束值 @for $i from 开始值 to 结束值 这2种方式是相似的,唯一的区别是:方式1包括结束值,方式2不包括结束值。其中“开始值”和“结束值”都是正整数。 思考循环:从几开始循环,循环到几,中间间隔(不需要管,人家定义好了) 案例一:使用from - through循环

@for 
$i from 1 through 3{.width#{$i} {width: $i * 10px;}
}

上述代码中,循环一共循环了三次,从 $i 的值为 1 开始循环,一直到 3 结束,并且包括了 3。

案例二:使用for-to循环

@for 
$i from 1 to 3{.width#{$i} {width: $i * 10px;}
}

和 through 关键字不同,to 关键字的循环虽然也是从 $i 的值为 1 开始循环,但是不包括 3 ,所以整个循环只循环两遍。

@while指令

@while 指令也可以用于循环样式,后面接 SassScript 表达式,循环会一直到表达式的值为 false 时停止。

语法结构: @while 表达式{ 循环的内容 }

注意:表达式不需要添加();循环的内容中需要添加更新循环变量 简单while案例:循环输出 1-5

$num: 1;
@while 
$num < 5 {.box{ font-size: #{$num}px;}$num: $
num + 1;
}

案例一:给第一个li设置字体12,第二个设置为14,第三个设置为16

$num: 12;
@while 
$num < 18 {.f-#{$num} {font-size: #{$num}px; }$num: $num + 2;
}

变量 $num 的初始值为 12,首先会输出 font-size:12px 样式,然后每次循环都会在原有的基础上加 2,一直到 不满足 $num < 18 这个条件,则循环会停止执行。

@each 指令

@each 指令可以用于遍历一个列表,然后从列表中取出对应的值。

语法格式:@each $i in <list>

$i 就是一个变量名,<list> 是一个 SassScript 表达式,返回一个列表值。

$list: 5 10 15 20 25;
@each $i in $list {.p-#{$i}{padding: #{$i}px;}
}

可以看到上述代码中,我们遍历了定义好的 $list 中的5个值,一直到列表中的值遍历完后,循环才会停止。 一般情况下each会用来遍历列表中的内容;(有点类似于for-in遍历,遍历完内容之后自动停止)

if判断-三元运算

if判断

@if可一个条件单独使用,也可以和@else结合多条件使用 if的条件必须是一个boolean类型;并且这里不会自动进行数字类型转换; 所以只有true的情况才能执行if的内容

语法:@if 表达式{ 表达式为true,执行代码 }
案例:if判断基础案例

$bool:true;
header{color:green;@if $true{color: yellow;}
}

案例:if-else基础案例

$type:five;
header{@if $type==one{color: red;}@else if $type==two{color:blue;}@else if $type==three{color:green;}@else {color: pink;}
}

案例:鼠标悬浮改变颜色

$$bool:true;header{color:green;&:hover{@if $$bool{color: yellow;}@else{color:red;}}
}

案例:给所有的偶数行添加背景颜色

@for $i from 1 through 10{@if $i % 2 == 0{.box:nth-child(#{$i}){color:red;}} 
}

注意:必须使用 through,否则不包含10这个数字;头不包含结束的数字

三元运算符

语法:if($condition, $if_true, $if_false)

在三元运算符中,是可以添加()括号的;

$true:true;
$color:false;
header{font-size: if($true,5px,10px);
}
footer{color: if($color,red,blue);
}

函数指令(function)

定义函数

@function grid-width($n,$m) {@return $n + $m;
}
#sidebar { width: grid-width(5,3); }

更多详细信息,查看sass官网:https://www.sassmeister.com/

http://www.dtcms.com/a/390974.html

相关文章:

  • 设计模式详解:单例模式、工厂方法模式、抽象工厂模式
  • 终端同居物语:Shell咏唱术式与权限结界の完全解析书
  • XeLaTeX 中文删除线自动换行问题的解决方案
  • R语言中的因子(Factor)详解 factor_path <- as.factor(char_path)
  • 软件测试之⾃动化测试常⽤函数(沉淀中)
  • 火山引擎多模态数据湖:基于 Daft 与 Lance,构筑 AI 时代数据湖新范式
  • 关于强化学习的一篇经典学习文章
  • 【JavaScript 性能优化实战】第四篇:webpack 与 vite 打包优化实战
  • maven-profile实现springboot多版本配置打包
  • OpenLayers地图交互 -- 章节二:绘制交互详解:从基础几何到复杂图形的完整绘制方案
  • Java 工厂模式 + 策略模式实战:工具管理器的设计与实现
  • 污水处理厂远程调试与智能化运维解决方案
  • 【提示工程】Ch2-提示技术(Prompt Technique)
  • vLLM - Worker
  • GitHub上面仓库名写错了,怎么改
  • 项目中的图形验证码是前端还是后端实现?
  • ✅ 基于Scrapy与朴素贝叶斯的校园舆情监测与预警系统 Django+B/S架构 可视化大屏 机器学习
  • Unity UI 插件 | Easy Popup System
  • AI证件照制作 API 快速生成证件照
  • @RequestParam和 @RequestBody能一起用吗
  • 构建高效的电商爬虫代理池:从架构设计到实战优化
  • 使用cJSON库实现JSON与C结构体的互转
  • Cursor :Python 运行路径设置自定义模块导入报错:No module named ‘xxx’ 的解决方案
  • 数图信息科技亮相唐山社区零售论坛,数字化赋能行业高质量发展
  • LLM大模型 - 实战篇 - Assistant API 原理与实战应用
  • python微博舆情分析系统 情感分析 爬虫 机器学习 新浪微博 数据采集 大数据技术(源码)✅
  • FreeRTOS消息队列剖析讲解(思路+源码)
  • Trillium Engineering-无人机万向节有效负载 - 用于战术 UAS 的 EO 和 EO/IR 无人机相机万向节
  • 【Linux网络】Socket编程预备
  • pyAutoGUI 模块主要功能介绍-(4)消息框功能