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

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

yuyutoo 2024-10-11 23:59 3 浏览 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!"; 
}

相关推荐

如何在HTML中使用JavaScript:从基础到高级的全面指南!

“这里是云端源想IT,帮你...

推荐9个Github上热门的CSS开源框架

大家好,我是Echa。...

前端基础知识之“CSS是什么?”_前端css js

...

硬核!知网首篇被引过万的论文讲了啥?作者什么来头?

整理|袁小华近日,知网首篇被引量破万的中文论文及其作者备受关注。知网中心网站数据显示,截至2021年7月23日,由华南师范大学教授温忠麟等人发表在《心理学报》2004年05期上的学术论文“中介效应检验...

为什么我推荐使用JSX开发Vue3_为什么用vue不用jquery

在很长的一段时间中,Vue官方都以简单上手作为其推广的重点。这确实给Vue带来了非常大的用户量,尤其是最追求需求开发效率,往往不那么在意工程代码质量的国内中小企业中,Vue占据的份额极速增长...

【干货】一文详解html和css,前端开发需要哪些技术?
【干货】一文详解html和css,前端开发需要哪些技术?

网站开发简介...

2025-02-20 18:34 yuyutoo

分享几个css实用技巧_cssli

本篇将介绍几个css小技巧,目录如下:自定义引用标签的符号重置所有标签样式...

如何在浏览器中运行 .NET_怎么用浏览器运行代码

概述:...

前端-干货分享:更牛逼的CSS管理方法-层(CSS Layers)

使用CSS最困难的部分之一是处理CSS的权重值,它可以决定到底哪条规则会最终被应用,尤其是如果你想在Bootstrap这样的框架中覆盖其已有样式,更加显得麻烦。不过随着CSS层的引入,这一...

HTML 基础标签库_html标签基本结构
HTML 基础标签库_html标签基本结构

HTML标题HTML标题(Heading)是通过-...

2025-02-20 18:34 yuyutoo

前端css面试20道常见考题_高级前端css面试题

1.请解释一下CSS3的flexbox(弹性盒布局模型),以及适用场景?display:flex;在父元素设置,子元素受弹性盒影响,默认排成一行,如果超出一行,按比例压缩flex:1;子元素设置...

vue引入外部js文件并使用_vue3 引入外部js

要在Vue中引入外部的JavaScript文件,可以使用以下几种方法:1.使用``标签引入外部的JavaScript文件。在Vue的HTML模板中,可以直接使用``标签来引入外部的JavaScrip...

网页设计得懂css的规范_html+css网页设计

在初级的前端工作人员,刚入职的时候,可能在学习前端技术,写代码不是否那么的规范,而在工作中,命名的规范的尤为重要,它直接与你的代码质量挂钩。网上也受很多,但比较杂乱,在加上每年的命名都会发生一变化。...

Google在Chrome中引入HTML 5.1标记

虽然负责制定Web标准的WorldWideWebConsortium(W3C)尚未宣布HTML5正式推荐规格,而Google已经迁移到了HTML5.1。即将发布的Chrome38将引入H...

HTML DOM 引用( ) 对象_html中如何引用js

引用对象引用对象定义了一个同内联元素的HTML引用。标签定义短的引用。元素经常在引用的内容周围添加引号。HTML文档中的每一个标签,都会创建一个引用对象。...

取消回复欢迎 发表评论: