百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

HTML/CSS 备忘录 - 17. Sass 基本语法

yuyutoo 2024-10-11 23:59 14 浏览 0 评论

一、注释

Sass 支持标准的 CSS 多行注释 /* */,以及单行注释 //,前者会被完整输出到编译后的 CSS 文件中,而后者则不会。

二、CSS 功能拓展

1. 嵌套规则

Sass 允许将一套 CSS 样式嵌套进另一套样式中,内层的样式将它外层的选择器作为父选择器,例如:

#main {
  width: 97%;
  p, div {
    font-size: 2em;
    a { font-weight: bold; }
  }
  pre { font-size: 3em; }
}

// --- 编译后 ---
#main {
  width: 97%;
}
#main p, #main div {
  font-size: 2em;
}
#main p a, #main div a {
  font-weight: bold;
}
#main pre {
  font-size: 3em;
}

嵌套功能避免了重复输入父选择器,而且令复杂的 CSS 结构更易于管理。

2. 父选择器 &

在嵌套 CSS 规则时,有时也需要直接使用嵌套外层的父选择器,例如,当给某个元素设定 hover 样式时,或者当 body 元素有某个 classname 时,可以用 & 代表嵌套规则外层的父选择器。

a {
  font-weight: bold;
  text-decoration: none;
  &:hover { 
    text-decoration: underline; 
  }
  body.firefox & { 
    font-weight: normal; 
  }
}

// --- 编译后 ---
a {
  font-weight: bold;
  text-decoration: none;
}
a:hover {
  text-decoration: underline;
}
body.firefox a {
  font-weight: normal;
}

编译后的 CSS 文件中 & 将被替换成嵌套外层的父选择器,如果含有多层嵌套,最外层的父选择器会一层一层向下传递。

3. 属性嵌套

有些 CSS 属性遵循相同的命名空间,比如 font-family, font-size, font-weight 都以 font 作为属性的命名空间。为了便于管理这样的属性,同时也为了避免了重复输入,Sass 允许将属性嵌套在命名空间中,例如:

.funky {
  font: {
    family: fantasy;
    size: 30em;
    weight: bold;
  }
}

// --- 编译后 ---
.funky {
  font-family: fantasy;
  font-size: 30em;
  font-weight: bold;
}

4. 占位符选择器

Sass 额外提供了一种特殊类型的选择器:占位符选择器。与常用的 id 与 class 选择器写法相似,只是 # 或 . 替换成了 %。必须通过 @extend 指令调用。

三、变量

1. 变量声明与引用

sass 使用 $ 符号来标识变量:

$highlight-color: #F90;
.selected {
  border: 1px solid $highlight-color;
}

// --- 编译后 ---
.selected {
  border: 1px solid #F90;
}

变量支持块级作用域,嵌套规则内定义的变量只能在嵌套规则内使用(局部变量),不在嵌套规则内定义的变量则可在任何地方使用(全局变量)。将局部变量转换为全局变量可以添加 !global 声明:

#main {
  $width: 5em !global;
  width: $width;
}
#sidebar {
  width: $width;
}

// --- 编译后 ---
#main {
  width: 5em;
}
#sidebar {
  width: 5em;
}

2. 插值语句

通过 #{} 插值语句可以在选择器或属性名中使用变量:

$name: foo;
$attr: border;
p.#{$name} {
  #{$attr}-color: blue;
}
  
// --- 编译后 ---
p.foo {
  border-color: blue; 
}

3. 变量默认值

可以在变量的结尾添加 !default 给一个未通过 !default 声明赋值的变量赋值,此时,如果变量已经被赋值,不会再被重新赋值,但是如果变量还没有被赋值,则会被赋予新的值。

$content: "First content";
$content: "Second content?" !default;
$new_content: "First time reference" !default;
#main {
  content: $content;
  new-content: $new_content;
}

// --- 编译后 ---
#main {
  content: "First content";
  new-content: "First time reference";
}

四、变量类型

SassScript 支持 6 种主要的数据类型:

  • 数字:1, 2, 13, 10px
  • 字符串:有引号字符串与无引号字符串,"foo", 'bar', baz
  • 颜色:blue, #04a3f9, rgba(255,0,0,0.5)
  • 布尔型:true, false
  • 空值:null
  • 数组 (list):用空格或逗号作分隔符,如 1.5em 1em 2em 与 Helvetica, Arial
  • maps:相当于 JavaScript 的 object,如 (key1: value1, key2: value2)

1. 算术运算

算术运算,如果必要会在不同单位间转换值:

p {
  width: 1in + 8pt;
}
// --- 编译后 ---
p {
  width: 1.111in; 
}

颜色运算:颜色值的运算是分段计算进行的,也就是分别计算 R、G、B 的值:

p {
  color: #010203 + #040506;
}
// --- 编译后 ---
p {
  color: #050709; 
}

在 CSS 中 “/” 通常起到分隔数字的用途,SassScript 同时也赋予了 “/” 除法运算的功能。以下三种情况 “/” 将被视为除法运算符号:

  • 如果值,或值的一部分,是变量或者函数的返回值
  • 如果值被圆括号包裹
  • 如果值是算数表达式的一部分
p {
  font: 10px/8px;             // 分隔符不做除法运算
  $width: 1000px;
  width: $width/2;            // 使用变量,进行除法运算
  width: round(1.5)/2;        // 使用函数,进行除法运算
  height: (500px/2);          // 使用小括号包裹,进行除法运算
  margin-left: 5px + 8px/2px; // 有其他算数表达式,进行除法运算
}

// --- 编译后 ---
p {
  font: 10px/8px;
  width: 500px;
  width: 1;
  height: 250px;
  margin-left: 9px;
}

如果需要使用变量,同时又要确保 / 不做除法运算而是完整地编译到 CSS 文件中,只需要用 #{} 插值语句将变量包裹。

2. 字符串与字符串运算

SassScript 支持 CSS 的两种字符串类型:有引号字符串与无引号字符串,在编译 CSS 文件时不会改变其类型。只有一种情况例外,使用 #{}时,有引号字符串将被编译为无引号字符串:

$selector: ".header";
#{$selector}:before {
  content: "Hi, Firefox users!";
}

// --- 编译后 ---
.header:before {
  content: "Hi, Firefox users!";
}

字符串运算:

// 字符串连接
p {
  cursor: e + -resize;
}
// --- 编译后 ---
p {
  cursor: e-resize; 
}

// 有引号字符串与无引号字符串链接,
// 以 + 前的字符串确定是否有引号
p:before {
  content: "Foo " + Bar;
  font-family: sans- + "serif";
}
// --- 编译后 ---
p:before {
  content: "Foo Bar";
  font-family: sans-serif; 
}

// 运算表达式与其他值连用时,用空格做连接符:
p {
  margin: 3px + 4px auto;
}
// --- 编译后 ---
p {
  margin: 7px auto; 
}

// 在有引号的文本字符串中使用 #{} 插值语句可以添加动态的值
p:before {
  content: "I ate #{5 + 10} pies!";
}
// --- 编译后 ---
p:before {
  content: "I ate 15 pies!"; 
}

相关推荐

Python操作Word文档神器:python-docx库从入门到精通

Python操作Word文档神器:python-docx库从入门到精通动动小手,点击关注...

Python 函数调用从入门到精通:超详细定义解析与实战指南 附案例

一、函数基础:定义与调用的核心逻辑定义:函数是将重复或相关的代码块封装成可复用的单元,通过函数名和参数实现特定功能。它是Python模块化编程的基础,能提高代码复用性和可读性。定义语法:...

等这么长时间Python背记手册终于来了,入门到精通(视频400集)

本文毫无套路!真诚分享!前言:无论是学习任何一门语言,基础知识一定要扎实,基础功非常的重要,找一个有丰富编程经验的老师或者师兄带着你会少走很多弯路,你的进步速度也会快很多,无论我们学习的目的是什么,...

图解Python编程:从入门到精通系列教程(附全套速查表)

引言本系列教程展开讲解Python编程语言,Python是一门开源免费、通用型的脚本编程语言,它上手简单,功能强大,它也是互联网最热门的编程语言之一。Python生态丰富,库(模块)极其丰富,这使...

Python入门教程(非常详细)从零基础入门到精通,看完这一篇就够

本书是Python经典实例解析,采用基于实例的方法编写,每个实例都会解决具体的问题和难题。主要内容有:数字、字符串和元组,语句与语法,函数定义,列表、集、字典,用户输入和输出等内置数据结构,类和对象,...

Python函数全解析:从入门到精通,一文搞定!

1.为什么要用函数?函数的作用:封装代码,提高复用性,减少重复,提高可读性。...

Python中的单例模式:从入门到精通

Python中的单例模式:从入门到精通引言单例模式是一种常用的软件设计模式,它保证了一个类只有一个实例,并提供一个全局访问点。这种模式通常用于那些需要频繁创建和销毁的对象,比如日志对象、线程池、缓存等...

【Python王者归来】手把手教你,Python从入门到精通!

用800个程序实例、5万行代码手把手教你,Python从入门到精通!...

Python从零基础入门到精通:一个月就够了

如果想从零基础到入门,能够全职学习(自学),那么一个月足够了。...

Python 从入门到精通:一个月就够了

要知道,一个月是一段很长的时间。如果每天坚持用6-7小时来做一件事,你会有意想不到的收获。作为初学者,第一个月的月目标应该是这样的:熟悉基本概念(变量,条件,列表,循环,函数)练习超过30个编...

Python零基础到精通,这8个入门技巧让你少走弯路,7天速通编程!

Python学习就像玩积木,从最基础的块开始,一步步搭建出复杂的作品。我记得刚开始学Python时也是一头雾水,走了不少弯路。现在回头看,其实掌握几个核心概念,就能快速入门这门编程语言。来聊聊怎么用最...

神仙级python入门教程(非常详细),从0到精通,从看这篇开始!

python入门虽然简单,很多新手依然卡在基础安装阶段,大部分教程对一些基础内容都是一带而过,好多新手朋友,对一些基础知识常常一知半解,需要在网上查询很久。...

Python类从入门到精通,一篇就够!

一、Python类是什么?大家在生活中应该都见过汽车吧,每一辆真实存在、能在路上跑的汽车,都可以看作是一个“对象”。那这些汽车是怎么生产出来的呢?其实,在生产之前,汽车公司都会先设计一个详细的蓝图...

学习Python从入门到精通:30天足够了,这才是python基础的天花板

当年2w买的全套python教程用不着了,现在送给有缘人,不要钱,一个月教你从入门到精通1、本套视频共487集,本套视频共分4季...

30天Python 入门到精通(3天学会python)

以下是一个为期30天的Python入门到精通学习课程,专为零基础新手设计。课程从基础语法开始,逐步深入到面向对象编程、数据处理,最后实现运行简单的大语言模型(如基于HuggingFace...

取消回复欢迎 发表评论: