SASS 入门笔记
参考资料:
sass 有两种后缀名文件:一种后缀名为 sass,不使用大括号和分号;另一种就是我们这里使用的 scss 文件,这种和我们平时写的 css 文件格式差不多,使用大括号和分号。
关于 sass 的编译,采用 gulp + gulp-sass + browser-sync 的组合,详见 Gulp 常用插件 一文中「热重载」一节。
基本用法
变量
SASS 允许使用变量,所有的变量以 $ 开头,用过 PHP 的同学会很熟悉。
值得注意的是,SASS 中的变量通常都不需要加引号,如果加了引号,则生成的 CSS 也带引号,如果没有引号,则生成的 CSS 也没有引号。
$borderRadius: 30px;
div.main {
height: 100px;
width: 100px;
background-color: black;
border-radius: $borderRadius;
}
如果变量需要镶嵌在字符串之中,就需要写在 #{} 之中。
$side: left;
$borderRadius: 30px;
div.main {
height: 100px;
width: 100px;
background-color: black;
border-top-#{$side}-radius: $borderRadius;
}
除了普通变量外,SASS 还支持 list 类型和 map 类型,list 类型有点像 JavaScript 中的数组,而 map 类型有点像 JavaScript 中的对象。
list 类型可通过空格,逗号,或者小括号分隔多个值,可用 nth($var, $index) 取值。其他函数请参考 sass Functions(搜索 list functions)
map 类型以 key-value 键值对出现,其中 value 又可以是 list 类型。格式为 $map: (key1: value1, key2: value2),可通过 map-get($map, $key) 取值。其他函数请参考 sass Functions(搜索 map functions)
计算功能
SASS 允许在代码中使用算式。
$base: 30px;
div.main {
height: 100px;
width: 100px;
background-color: black;
border-top-left-radius: 10px + 20px;
border-top-right-radius: $base * 2;
border-bottom-left-radius: (100px / 2);
border-bottom-right-radius: 50px - 40px;
}
注意运算时单位(比如 px)要紧跟着数字,不能 (10+20)px,会被解析成 30 px(数字和单位中间会有个空格)
嵌套
SASS 允许选择器嵌套。比如下面的 CSS 代码:
div.main h1 {
color: red;
}
可以写成:
div.main {
h1 {
color: red;
}
}
属性也可以嵌套:
div.main {
height: 100px;
width: 100px;
// background-color: red;
// 等价于下面的代码
background: {
color: red;
}
}
和选择器嵌套不同的是,这里要注意 background 后必须加上冒号。
在嵌套的代码块内,可以使用 & 引用父元素,在写伪类的时候比较常用:
a {
color: red;
&:hover {
color: black;
}
}
.post {
font-size: 1em;
&-head {
font-size: 1.8em;
}
}
注释
SASS 共有两种注释风格。
标准的 CSS 注释 /* comment */ ,会保留到编译后的文件。
单行注释 // comment,只保留在 SASS 源文件中,编译后被省略。
在 /* 后面加一个感叹号,表示这是 "重要注释"。即使是压缩模式编译,也会保留这行注释,通常可以用于声明版权信息。
/*!
重要注释!
*/
@at-root
Sass3.3.0 中新增的功能,用来跳出选择器嵌套的。默认所有的嵌套,继承所有上级选择器,但有了这个就可以跳出所有上级选择器。
// sass style
.content {
@at-root #{&}-header {
color: red;
}
@at-root #{&}-content {
color: blue;
}
}
// css style
.content-header {
color: red;
}
.content-content {
color: blue;
}
代码复用
继承
SASS 允许一个选择器,继承另一个选择器。
div.first {
height: 100px;
width: 100px;
background-color: green;
}
div.second {
@extend div.first;
border: {
color: red;
width: 10px;
style: solid;
}
}
也就是说,某个选择器可以继承另一个选择器的所有样式,并在它的基础上添加样式。
占位选择器 %
这里我们得强势插入占位选择器 %,配合 @entend 风味更佳。从 Sass 3.2.0 以后就可以定义占位选择器 %。这种选择器的优势在于:如果不调用则不会有任何多余的 css 文件,避免了以前在一些基础的文件中预定义了很多基础的样式,然后实际应用中不管是否使用了 @extend 去继承相应的样式,都会解析出来所有的样式。占位选择器以 % 标识定义,通过 @extend 调用。
比如这段代码:
.base {
height: 100px;
width: 100px;
background-color: green;
}
div.second {
@extend .base;
border: {
color: red;
width: 10px;
style: solid;
}
}
编译的结果是:
.base, div.second {
height: 100px;
width: 100px;
background-color: green;
}
div.second {
border-color: red;
border-width: 10px;
border-style: solid;
}
但是 .base 这个类实际并没有用到,我们不希望它在样式表中,可以用占位选择器:
%base {
height: 100px;
width: 100px;
background-color: green;
}
div.second {
@extend %base;
border: {
color: red;
width: 10px;
style: solid;
}
}
这时我们再看生成的样式表:
div.second {
height: 100px;
width: 100px;
background-color: green;
}
div.second {
border-color: red;
border-width: 10px;
border-style: solid;
}
Mixin
还是上面的例子,有两个 div,它们有一些基础样式,但是又不能用继承关系,这时就可以用 Mixin 定义可以复用的代码块。
使用 @mixin 命令,定义一个代码块。
@mixin divBase {
width: 100px;
height: 100px;
}
使用 @include 命令,调用这个 mixin。
div.first {
@include divBase;
background-color: green;
}
div.second {
@include divBase;
background-color: red;
}
其实这个例子举的不好,用 @extend 也能实现,但是mixin 的强大之处,在于可以指定参数和缺省值。
@mixin divBase($width: 100px, $height: 100px) {
width: $width;
height: $height;
}
div.first {
@include divBase;
background-color: green;
}
div.second {
@include divBase(20px, 50px);
background-color: red;
}
颜色函数
SASS 提供了一些内置的颜色函数,以便生成系列颜色。
lighten(#cc3, 10%) // #d6d65c
darken(#cc3, 10%) // #a3a329
grayscale(#cc3) // #808080
complement(#cc3) // #33c
插入文件
@import 命令,用来插入外部文件(.scss 和 .css 的后缀可以省略)。
@import 'b.scss';
@import 'c.css';
高级用法
条件语句
@if 以及 @else 以及 @else if 命令:
div.second {
width: 100px;
height: 100px;
@if (1 + 1 != 2) {
background-color: red;
} @else {
background: {
color: black;
}
}
}
注意 SASS 中只有 == 、!= 没有 ===。
循环语句
循环语句我觉得是 SASS 中最好用的功能,让我觉得 SASS 真的是一种 "编程语言"。
比如有一张雪碧图,如果仅仅用 CSS,我们可能会写出如下 "又臭又长" 的代码:
div.bg_1 {
float: left;
width: 50px;
height: 50px;
background-image: url(bg.jpg);
background-position: 0 0;
}
div.bg_2 {
float: left;
width: 50px;
height: 50px;
background-image: url(bg.jpg);
background-position: -50px 0;
}
div.bg_3 {
float: left;
width: 50px;
height: 50px;
background-image: url(bg.jpg);
background-position: -100px 0;
}
我们先用 SASS 的 Mixin 复用一些代码(用 @extend 也可以):
@mixin divBase {
float: left;
width: 50px;
height: 50px;
background-image: url(bg.jpg);
}
div.bg_1 {
@include divBase;
background-position: 0 0;
}
div.bg_2 {
@include divBase;
background-position: -50px 0;
}
div.bg_3 {
@include divBase;
background-position: -100px 0;
}
接着我们就来用循环语句进一步精简代码。
SASS 支持 for 循环:
@mixin divBase {
float: left;
width: 50px;
height: 50px;
background-image: url(bg.jpg);
}
@for $i from 1 to 4 { // [1, 4)
div.bg_#{$i} {
@include divBase;
background-position: -50px * ($i - 1) 0;
}
}
我们注意下上面的循环次数,是 [1, 4),如果想要 [1, 4],则要用 through 关键字:
@for $i from 1 through 4 { // [1, 4]
div.bg_#{$i} {
@include divBase;
background-position: -50px * ($i - 1) 0;
}
}
支持 while 循环:
@mixin divBase {
float: left;
width: 50px;
height: 50px;
background-image: url(bg.jpg);
}
$i: 1;
@while $i < 4 {
div.bg_#{$i} {
@include divBase;
background-position: -50px * ($i - 1) 0;
}
$i: $i + 1;
}
我们还可以用 each,语法为 @each $var in <list or map>
@each $i in (1, 2, 3) {
div.bg_#{$i} {
@include divBase;
background-position: -50px * ($i - 1) 0;
}
}
我们可以把 (1, 2, 3) 抽象为一个变量,有点 JavaScript 中数组的意思,这样更灵活,这样数字不一定是等比数列,适用范围就更广了。我喜欢 each!
$num: (1, 2, 3);
@each $i in $num {
div.bg_#{$i} {
@include divBase;
background-position: -50px * ($i - 1) 0;
}
}
自定义函数
@function double($n) {
@return $n * 2;
}
div.second {
width: 100px;
height: double(100px);
background-color: red;
}
SASS 入门笔记的更多相关文章
- 每天成长一点---WEB前端学习入门笔记
WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...
- Ruby小白入门笔记之 <Gemfile 文件>
因为初学Ruby,四处查资料无果,才来的贴出亲自试过的操作,覆盖整个个人入门笔记博客中,故所有的操作,都以最明了的方式阐述,当你创建完一个新的Rails应用后,你发现JAVA中我们可以编写maven聚 ...
- ES6入门笔记
ES6入门笔记 02 Let&Const.md 增加了块级作用域. 常量 避免了变量提升 03 变量的解构赋值.md var [a, b, c] = [1, 2, 3]; var [[a,d] ...
- [Java入门笔记] 面向对象编程基础(二):方法详解
什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...
- React.js入门笔记
# React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...
- redis入门笔记(2)
redis入门笔记(2) 上篇文章介绍了redis的基本情况和支持的数据类型,本篇文章将介绍redis持久化.主从复制.简单的事务支持及发布订阅功能. 持久化 •redis是一个支持持久化的内存数据库 ...
- redis入门笔记(1)
redis入门笔记(1) 1. Redis 简介 •Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure serv ...
- OpenGLES入门笔记四
原文参考地址:http://www.cnblogs.com/zilongshanren/archive/2011/08/08/2131019.html 一.编译Vertex Shaders和Fragm ...
- OpenGLES入门笔记三
在入门笔记一中比较详细的介绍了顶点着色器和片面着色器. 在入门笔记二中讲解了简单的创建OpenGL场景流程的实现,但是如果在场景中渲染任何一种几何图形,还是需要入门笔记一中的知识:Vertex Sha ...
随机推荐
- ASP.NET Core 中文文档 第三章 原理(12)托管
原文:Hosting 作者:Steve Smith 翻译:娄宇(Lyrics) 校对:何镇汐.许登洋(Seay) 为了运行 ASP.NET Core 应用程序,你需要使用 WebHostBuilder ...
- Python 正则表达式入门(初级篇)
Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...
- 手把手教从零开始在GitHub上使用Hexo搭建博客教程(三)-使用Travis自动部署Hexo(1)
前言 前面两篇文章介绍了在github上使用hexo搭建博客的基本环境和hexo相关参数设置等. 基于目前,博客基本上是可以完美运行了. 但是,有一点是不太好,就是源码同步问题,如果在不同的电脑上写文 ...
- EC笔记:第3部分:15、对原始资源的访问
使用对象来管理资源,可以避免因个人疏忽带来的一些低级错误,但是不是每件事都是称心如意的. 一些函数依然使用原始的资源对象,那么我们就需要为这些函数提供一个接口,让他们可以获取到原始对象. 继续拿13节 ...
- java JSP(原创新手可进)
一. 同等编程方式jsp与asp.net的不同 app需要做一个简单网站,和几个用户推广链接,所以涉及到web这块开发,原本昨天想直接使用asp.net来做,但是之后放弃了这个想法,因为数据访问接口都 ...
- 20个不可思议的 WebGL 示例和演示
WebGL 是一项在网页浏览器呈现3D画面的技术,有别于过去需要安装浏览器插件,通过 WebGL 的技术,只需要编写网页代码即可实现3D图像的展示.WebGL 可以为 Canvas 提供硬件3D加速渲 ...
- 【移动前端开发实践】从无到有(统计、请求、MVC、模块化)H5开发须知
前言 不知不觉来百度已有半年之久,这半年是996的半年,是孤军奋战的半年,是跌跌撞撞的半年,一个字:真的是累死人啦! 我所进入的团队相当于公司内部创业团队,人员基本全部是新招的,最初开发时连数据库都没 ...
- Linux常用命令大全
系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIO ...
- InfoPath错误,此文档库已被重命名或删除
在使用InfoPath发布表单,发布到SharePoint服务器报错,如下介绍: 环境:Windows 2012 DateCenter + Sql 2012 + SharePoint 2013 + O ...
- Android Studio多渠道打包
本文所讲述的多渠道打包是基于友盟统计实施的. 多渠道打包的步骤: 1.在AndroidManifest.xml里设置动态渠道变量 <meta-data android:name="UM ...