CSS预处理语言Sass入门 css3预处理器
yuyutoo 2024-10-12 00:00 11 浏览 0 评论
1. 引言
CSS3之前的CSS都大都是枚举属性样式,而编程语言强大的变量、函数、循环、分支等功能基本都不能在CSS中使用,让CSS的编程黯淡无光,Sass就是一种增强CSS编程的扩展语言(CSS4也可以期待),有了像Sass这种预处理语言后,CSS的编程不再局限在枚举属性了,可以有更广阔的舞台。
2. Sass的原理
Sass本质就是在CSS的语法的基础上增加了自定义的变量、循环、分支、函数、mixin、继承、运算等功能,让CSS编程变得异常强大。
当然浏览器是不认识Sass语法。开发人员写完了Sass的语法文件后需要通过工具转成原始的CSS代码。
//sass 代码 //------------------------------- $fontSize: 12px; body{ font-size:$fontSize; } // 通过工具将上面的sass代码可以转成下面的CSS代码↓↓↓ //css 代码 //------------------------------- body{ font-size:12px; }
3. Sass的编译环境
Sass代码的编译转换工具可以用sass命令行工具、gulp、开发工具插件、webpack等。
我推荐大家学习阶段直接用开发工具的插件自动生成即可。如果你是在项目阶段使用,那肯定有自动化的流程构建工具比如:gulp、webpack都有对应的插件或者loader,直接对应配置即可。
老马推荐vscode的自动编译Sass文件的插件:Live Sass Compiler
使用方法:
第一步: 用vscode打开scss文件。
第二步:
ctrl+shift+p
macctrl→command
输入sass选择入下图选项
4. Sass的两种文件后缀
sass有两种后缀名文件:一种后缀名为sass,语法要求不使用大括号和分号;另一种就是我们这里使用的scss文件,这种和我们平时写的CSS文件格式差不多,使用大括号和分号。
//文件后缀名为sass的语法 body background: #eee font-size:12pxp background: #0982c1 //文件后缀名为scss的语法 body { background: #eee; font-size:12px; } p{ background: #0982c1; }
老马推荐使用scss文件后缀及使用括号和分号的编写方式。
5. Sass中的变量和注释
5.1 定义变量及使用
Sass的变量必须是$开头,后面紧跟变量名,而变量值和变量名之间就需要使用冒号(:)分隔开(就像CSS属性设置一样)。
$a-color: blue; // 定义变量。 .box { color: $a-color; // => blue 使用变量 }
用vscode插件转换一下试试?
5.2 局部变量和全局变量。
变量支持块级作用域,嵌套规则内定义的变量只能在嵌套规则内使用(局部变量),不在嵌套规则内定义的变量则可在任何地方使用(全局变量)。将局部变量转换为全局变量可以添加 !global 声明。
//sass style //------------------------------- $a-color: blue; // 全局变量 .box { $a-color: red; // 局部变量,box内部不使用。 color: $a-color; // => red 局部变量 } .child { color: $a-color; // => blue 全局变量 $main-width: 16em !global; // 在局部定义全局的变量。 } .main { width: $main-width; // 使用在内部定义的全局变量。 } /*===============生成的CSS代码===================*/ .box { color: red; } .child { color: blue; } .main { width: 16em; }
从以上代码中也可以看到Sass支持CSS的注释/**/之外还支持双斜线的注释: //
5.3 特殊变量
如果变量作为CSS属性或在某些特殊情况下等则必须要以 #{$variables}形式使用。
//sass style //------------------------------- $side: top; .box { border-#{$side}: 1px solid #09c; } //css style //------------------------------- .box { border-top: 1px solid #0098cc; }
6. 嵌套(Nesting)
6.1 嵌套规则 (Nested Rules)
Sass 允许将一套 CSS 样式嵌套进另一套样式中,内层的样式将它外层的选择器作为父选择器。
//sass style //------------------------------- #main p { color: #00ff00; width: 97%; .redbox { background-color: #ff0000; color: #000000; } } //css style //------------------------------- #main p { color: #00ff00; width: 97%; } #main p .redbox { background-color: #ff0000; color: #000000; }
6.2 父选择器 & (Referencing Parent Selectors: &)
在嵌套 CSS 规则时,有时也需要直接使用嵌套外层的父选择器,可以用 & 代表嵌套规则外层的父选择器。
//sass style //------------------------------- .box { border-#{$side}: 1px solid #09c; &::before { content: ''; display: block; position: absolute; left: 100px; top: 5px; } } //css style //------------------------------- .box { border-top: 1px solid #09c; } .box::before { content: ''; display: block; position: absolute; left: 100px; top: 5px; }
& 必须作为选择器的第一个字符,其后可以跟随后缀生成复合的选择器。
//sass style //------------------------------- #main { color: black; &-sidebar { border: 1px solid; } } //css style //------------------------------- #main { color: black; } #main-sidebar { border: 1px solid; }
6.3 @at-root
@at-root用来跳出当前选择器嵌套。
//sass style //------------------------------- .demo { ... animation: motion 3s infinite; @at-root { @keyframes motion { ... } } } //css style //------------------------------- .demo { ... animation: motion 3s infinite; } @keyframes motion { ... }
7. 运算
Sass支持多种数据类型的变量,比如:
数字,1, 2, 13, 10px
字符串,有引号字符串与无引号字符串,"foo", 'bar', baz
颜色,blue, #04a3f9, rgba(255,0,0,0.5)
布尔型,true, false
空值,null
所有数据类型均支持相等运算 == 或 !=,此外,每种数据类型也有其各自支持的运算方式。
7.1 数值运算
Sass支持数字的加减乘除、取整等运算 (+, -, *, /, %),如果必要会在不同单位间转换值。
//sass style //------------------------------- .box { height: 17px + 20px; // => 37px 数字加法运算 width: (75rem/16); // => 4.6875rem 除法运算 color: #303030*2; // => #606060; 乘法运算(颜色运算) padding: 20px - 3; // => 17pex 数字减法 font-family: sans- + "serif"; // => sans-serif 字符串加法 width: 1em + (2em * 3); // 带括号的运算 } //css style //------------------------------- .box { height: 37px; width: 4.6875rem; color: #606060; padding: 17px; font-family: sans-serif; width: 7em; }
8. Sass语句
Sass提供了常用的循环、判断分支语句的相关指令,可以让我们按照编程语言一样编写Sass代码。
8.1 if语句
当 @if 的表达式返回值不是 false 或者 null 时,条件成立,输出 {} 内的代码。
//sass style //------------------------------- $w: 960px; $type: monster; .box { @if 2*3 > 5 { // 简单if判断语句 color: red; } @if $w > 900px { width: $w; } @else { // if else 语句 width: 900px; } @if $type == ocean { // 多个if和else语句 color: blue; } @else if $type == matador { color: red; } @else if $type == monster { color: green; } @else { color: black; } } //css style //------------------------------- .box { color: red; width: 960px; color: green; }
@if 声明后面可以跟多个 @else if 声明,或者一个 @else 声明。如果 @if 声明失败,Sass 将逐条执行 @else if 声明,如果全部失败,最后执行 @else 声明
8.2 for循环语句
@for 指令可以在限制的范围内重复输出格式。类似for循环。两种格式:
@for $var from <start> through <end>
:条件范围包含 <start> 与 <end> 的值@for $var from <start> to <end>
: 围只包含 <start> 的值不包含 <end> 的值
//scss style //------------for througth循环------------------- @for $i from 1 through 3 { .item-#{$i} { width: 2em * $i; } } //css style //------------------------------- .item-1 { width: 2em; } .item-2 { width: 4em; } .item-3 { width: 6em; }
//scss style//------------for to 循环------------------- @for $i from 1 to 3 { .item-#{$i} { width: 2em * $i; } } //css style //------------------------------- .item-1 { width: 2em; } .item-2 { width: 4em; }
8.3 each循环
@each 指令的格式是 $var in <list>, $var 可以是任何变量名,比如 $length 或者 $name,而 <list> 是一连串的值,也就是值列表。
//sass style //------------------------------- @each $animal in puma, sea-slug, egret, salamander { .#{$animal}-icon { background-image: url('/images/#{$animal}.png'); } } //css style//------------------------------- .puma-icon { background-image: url("/images/puma.png"); } .sea-slug-icon { background-image: url("/images/sea-slug.png"); } .egret-icon { background-image: url("/images/egret.png"); } .salamander-icon { background-image: url("/images/salamander.png"); }
复杂对应each
//sass style //------------------------------- @each $header, $size in (h1: 2em, h2: 1.5em, h3: 1.2em) { #{$header} { font-size: $size; } } //css style //------------------------------- h1 { font-size: 2em; } h2 { font-size: 1.5em; } h3 { font-size: 1.2em; }
9. 混合指令 (Mixin Directives)
9.1 不带参数的简单Mixin
混合指令(Mixin)用于定义可重复使用的样式,可以直接把一整段Sass代码替换到某个地方去。
//sass style //------------------------------- // 定义mixin reset, 用@mixin开头,后面跟空格和混合块的名字。然后是语句块 @mixin reset { padding: 0; margin: 0; } html, body, div , input { @include reset(); // 引用 reset 混合块。用@include指令引用混合块。 } //css style //------------------------------- html, body, div, input { padding: 0; margin: 0; }
9.2 带参数的Mixin
Mixin还可也添加参数,跟函数一样使用。
//sass style //------------------------------- @mixin sexy-border($color, $width) { border: $width solid $color; } p { @include sexy-border(blue, 1px); } //css style //------------------------------- p { border: 1px solid blue; }
10. 函数指令 (Function Directives)
虽然Mixin功能强大,但是某些场景下还是函数应用更方便,Sass也提供了自定义函数的用法。
//sass style //------------------------------- $grid-width: 40px; $gutter-width: 10px; // 定义自定义函数 grid-width @function grid-width($n) { // 接受一个参数$n @return $n * $grid-width + ($n - 1) * $gutter-width; // 返回值。 } #sidebar { width: grid-width(5); } // 在属性中调用函数 //css style //------------------------------- #sidebar { width: 240px; }
11. 继承(扩展)
11.1 基本继承
sass中,选择器继承可以让选择器继承另一个选择器的所有样式,并联合声明。使用选择器的继承,要使用关键词 @extend,后面紧跟需要继承的选择器。
//sass style //------------------------------- h1{ border: 4px solid #ff9aa9; } .speaker{ @extend h1; border-width: 2px; } //css style //------------------------------- h1, .speaker{ border: 4px solid #ff9aa9; } .speaker{ border-width: 2px; }
11.2 占位符%
可以定义占位选择器 %。这种选择器的优势在于:如果不调用则不会有任何多余的css文件,避免了以前在一些基础的文件中预定义了很多基础的样式,然后实际应用中不管是否使用了 @extend去继承相应的样式,都会解析出来所有的样式。占位选择器以 %标识定义,通过 @extend调用。
//sass style //------------------------------- %ir { // 定义占位符。没有选择器名字的一段代码而已。 color: transparent; text-shadow: none; background-color: transparent; border: 0; } #header{ h1{ @extend %ir; width:300px; } } .ir{ @extend %ir; } //css style //------------------------------- #header h1, .ir { color: transparent; text-shadow: none; background-color: transparent; border: 0; } #header h1 { width: 300px; }
12. 导入文件
Sass的导入( @import)Sass文件规则和CSS的有所不同,编译时会将 @import的scss文件合并进来只生成一个CSS文件。但是如果你在Sass文件中导入css文件如 @import 'reset.css',那效果跟普通CSS导入样式文件一样,导入的css文件不会合并到编译后的文件中,而是以 @import方式存在。
所有的Sass导入文件都可以忽略后缀名 .scss。一般来说基础的文件命名方法以_开头,如 _mixin.scss。这种文件在导入的时候可以不写下划线,可写成 @import "mixin"。
例如: a.scss 文件
//a.scss //------------------------------- body { background: #eee; }
main.scss 主文件。
//sass style //------------------------------- @import "reset.css"; // 导入css文件,不会进行编译。 @import "a"; // 导入a.scss 文件,后缀省略 p { background: #0982c1; } //css style //------------------------------- @import "reset.css"; body { background: #eee; } p { background: #0982c1; }
相关推荐
- 对volatile,synchronized,AQS的加锁解锁原理的一些理解
-
一、为什么要加锁,要实现同步多线程编程中,有可能会出现多个线程同时访问同一个共享、可变资源的情况,这个资源我们称之其为临界资源;这种资源可能是:对象、变量、文件等。...
- 注意,不能错过的CAS+volatile实现同步代码块
-
前言:最近看到有人说可以使用CAS+volatile实现同步代码块。心想,确实是可以实现的呀!因为AbstractQueuedSynchronizer(简称AQS)内部就是通过CAS+...
- 面试并发volatile关键字时,我们应该具备哪些谈资?
-
提前发现更多精彩内容,请访问https://dayarch.top/提前发现更多精彩内容,请访问https://dayarch.top/提前发现更多精彩内容,请访问https://dayarch...
- 无锁同步-JAVA之Volatile、Atomic和CAS
-
1、概要本文是无锁同步系列文章的第二篇,主要探讨JAVA中的原子操作,以及如何进行无锁同步。关于JAVA中的原子操作,我们很容易想到的是Volatile变量、java.util.concurrent....
- C/C++面试题(二):std::atomic与volatile
-
volatile是C/C++中的一个关键字,用于告知编译器某个变量的值可能会在程序的控制之外被意外修改(例如被硬件、中断服务程序、多线程环境或其他外部代理)。为了防止编译器对代码进行某些可能破坏...
- VOCs(Volatile Organic Compounds)挥发性有机化合物及测试方法
-
经常看到一些三防漆、涂料、油漆类产品的介绍中提到VOC、VOCs等概念,那么什么是VOC、VOCs和TVOC,VOCs主要包括哪些物质?VOCs的来源有哪些?VOCs的危害及国家标准是什么?一、V...
- 对volatile 及happen—before的理解
-
happen—before规则介绍Java...
- 这一篇我们来了解Synchronized、Volatile、Final关键字
-
题外话:蓝银王觉醒了!!--来自于一个斗罗大陆动漫爱好者(鹅,打钱!)湿兄这两天回家了,办了点大事,回来的时候我弟弟还舍不得我,哭着不愿意让我回京(我弟还是小学),我也心里很不舍,但是还是要回京奋斗...
- 关于 Java 关键字 volatile 的总结
-
1什么是volatilevolatile是Java的一个关键字,它提供了一种轻量级的同步机制。相比于重量级锁synchronized,volatile更为轻量级,因为它不会引起线程上下文...
- 大白话聊聊Java并发面试问题之volatile到底是什么?
-
用最简单的大白话,加上多张图给大家说一下,volatile到底是什么?...
- 为什么要有volatile关键字(volatile 关键字为什么不能保证原子性)
-
在嵌入式编程和多线程编程中,我们常会见到volatile关键字声明的变量。下面说一下volatile关键字的作用:1.保持变量内存可见简而言之就是用volatile声明的变量会告诉编译器和处理器,这个...
- Java的volatile到底怎么理解?(java volatitle)
-
我们都知道,在Java中有很多的关键字,比如synchronize比如volatile,这些都是一些比较关键的,还有final,今天我们就来聊一下这个volatile因为这个vo...
- Java多线程编程中的volatile关键字:解密神秘的共享内存
-
Java多线程编程中的volatile关键字:解密神秘的共享内存在Java多线程编程的世界里,volatile关键字就像一位低调却至关重要的守护者。它默默无闻地站岗放哨,确保多个线程之间能够正确地共享...
- 你了解volatile关键字的作用吗?(关键字volatile有什么含意?并举出三个不同的例子?)
-
【死记硬背】volatile关键字主要用于保持内存的变量可见性和禁止重排序。变量可见性:当一个线程改变了变量的值,那么新的值对于其他线程也是可以立即获取到的。禁止重排序:...
- 谈谈你对volatile 关键字作用和原理的理解
-
一位6年工作经验的小伙伴,在某里二面的时候被问到“volatile”关键字。然后,就没有然后了…同样,还有一位4年的小伙伴,去某团面试也被问到“volatile关键字“。然后,也没有然后了…...
你 发表评论:
欢迎- 一周热门
-
-
前端面试:iframe 的优缺点? iframe有那些缺点
-
带斜线的表头制作好了,如何填充内容?这几种方法你更喜欢哪个?
-
漫学笔记之PHP.ini常用的配置信息
-
推荐7个模板代码和其他游戏源码下载的网址
-
其实模版网站在开发工作中很重要,推荐几个参考站给大家
-
[干货] JAVA - JVM - 2 内存两分 [干货]+java+-+jvm+-+2+内存两分吗
-
正在学习使用python搭建自动化测试框架?这个系统包你可能会用到
-
织梦(Dedecms)建站教程 织梦建站详细步骤
-
【开源分享】2024PHP在线客服系统源码(搭建教程+终身使用)
-
2024PHP在线客服系统源码+完全开源 带详细搭建教程
-
- 最近发表
-
- 对volatile,synchronized,AQS的加锁解锁原理的一些理解
- 注意,不能错过的CAS+volatile实现同步代码块
- 面试并发volatile关键字时,我们应该具备哪些谈资?
- 无锁同步-JAVA之Volatile、Atomic和CAS
- C/C++面试题(二):std::atomic与volatile
- VOCs(Volatile Organic Compounds)挥发性有机化合物及测试方法
- 对volatile 及happen—before的理解
- 这一篇我们来了解Synchronized、Volatile、Final关键字
- 关于 Java 关键字 volatile 的总结
- 大白话聊聊Java并发面试问题之volatile到底是什么?
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)