sass

1. sass介绍

Sass 是一个CSS预处理程序,强化 CSS 的辅助工具,它在 CSS 语法的基础上增加了变量 (variables)、嵌套 (nested rules)、混合 (mixins)、导入 (inline imports) 等高级功能,这些拓展令 CSS 更加强大与优雅。

Sass 有两种语法格式。

  1. 首先是 SCSS (Sassy CSS) —— 这种格式仅在 CSS3 语法的基础上进行拓展,所有 CSS3 语法在 SCSS 中都是通用的,同时加入 Sass 的特色功能。此外,SCSS 也支持大多数 CSS hacks 写法以及浏览器前缀写法 (vendor-specific syntax),以及早期的 IE 滤镜写法。这种格式以 .scss 作为拓展名。
$font-stack: Helvetica, sans-serif
body {
  font: 100% $font-stack
}
  1. 另一种也是最早的 Sass 语法格式,被称为缩进格式 (Indented Sass) 通常简称 "Sass",是一种简化格式。它使用 “缩进” 代替 “花括号” 表示属性属于某个选择器,用 “换行” 代替 “分号” 分隔属性,很多人认为这样做比 SCSS 更容易阅读,书写也更快速。缩进格式也可以使用 Sass 的全部功能,这种格式以 .sass 作为拓展名。
$font-stack: Helvetica, sans-serif
body
  font: 100% $font-stack

2. sass 优点

  1. 全局变量
  2. 方便嵌套,SCSS 使我们能够在样式表中拥有相同的 HTML 视觉层次结构,这样我们就可以以一种更容易理解的方式来设计样式
  3. 它能够将可重用的样式打包在一起,并允许根据需要将样式导入到另一个样式块中,从而减少代码中的冗余

3.环境搭建

sass 的安装方式有很多种,可以查看这个地址,这里我们使用查看

如果是自己本地尝试,建议使用npm

//全局下载 sass
npm install -g sass

// 编译单个文件 
sass input.scss output.css

//单文件监听命令
sass --watch input.scss:output.css

//如果你有很多的sass文件的目录,你也可以告诉sass监听整个目录:app和stylesheets分别为scss和生成css文件夹
sass --watch app:stylesheets

4.使用

SCSS中的@import用于将部分内容获取到其他SCSS文件中,如果需要导入 SCSS 或者 Sass 文件,但又不希望将其编译为 CSS,只需要在文件名前添加下划线,这样会告诉 Sass 不要编译这些文件,但导入语句中却不需要添加下划线。(可以将 @import 嵌套进 CSS 样式或者 @media 中)

4.1 变量($)

SCSS中的变量以美元符号$开头。
编译前

$color:red;
.color{
    $text_color: #ddd;
    color:$text_color;
    background-color: $color;
    .name{
        color:$text_color;
    }
}

编译后

.color {
  color: #ddd;
  background-color: red;
}
.color .name {
  color: #ddd;
}

4.2 嵌套

4.2.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;
}

4.2.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;
}

& 必须作为选择器的第一个字符,其后可以跟随后缀生成复合的选择器

编译前

#main {
    color: black;
    &-sidebar { border: 1px solid; }
}

编译后

#main {
  color: black;
}
#main-sidebar {
  border: 1px solid;
}

4.3 插值语句 #{}

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

编译前

$name: foo;
$attr: border;
p.#{$name} {
  #{$attr}-color: blue;
}

编译后

p.foo {
  border-color: blue;
}

4.4 变量定义 !default

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

编译前

$content: "First content";
$content: "Second content?" !default;
$new_content: null;
$new_content: "First time reference" !default;

.main {
  content: $content;
  new-content: $new_content;
}

编译后

.main {
  content: "First content";
  new-content: "First time reference";
}

4.5 Mixins(使用 @include 引入)

SCSS 的另一个了不起的特性是它能够将可重用的样式打包在一起,并允许根据需要将样式导入到另一个样式块中,从而减少代码中的冗余。但是相同的代码被引入了多次

编译前

@mixin button{
    font-size: 1em;  
    padding: 0.5em 1.0em;
}
@mixin back($back:red){
    text-align: center;
    background-color: $back;
}
.button-green{
      @include button;
      @include back(green);
}
.button-red{
    @include button;
    @include back;
}

编译后

.button-green {
  font-size: 1em;
  padding: 0.5em 1em;
  text-align: center;
  background-color: green;
}

.button-red {
  font-size: 1em;
  padding: 0.5em 1em;
  text-align: center;
  background-color: red;
}

4.6 @extend

使用相同样式,基础类会被引入,并且编译后合并在一起

编译前

.icon {
    transition: background-color ease .2s;
    margin: 0 .5em;
}
  
.error-icon {
    @extend  .icon;
}
  
.info-icon {
    @extend .icon;
}

编译后

.icon, .info-icon, .error-icon {
  transition: background-color ease 0.2s;
  margin: 0 0.5em;
}

4.6 占位符(%)

%变量不会进行编译,只是会引用

编译前

%icon {
    transition: background-color ease .2s;
    margin: 0 .5em;
}
.error-icon {
    @extend %icon;
}
.info-icon {
    @extend %icon;
}
#context a%extreme {
    color: blue;
    font-weight: bold;
    font-size: 2em;
}
.notice {
    @extend %extreme;
}

编译后

.info-icon, .error-icon {
  transition: background-color ease 0.2s;
  margin: 0 0.5em;
}
#context a.notice {
  color: blue;
  font-weight: bold;
  font-size: 2em;
}

4.7 控制流条件样式

4.7.1 if()

if() 是 Sass 的一个内建函数,与之相似的 @if 则是一个内建指令。if() 用来做条件判断并返回特定值

编译前

@mixin test($condition) { 
    $color: if($condition, blue, red); 
    color:$color 
}  
.firstClass { 
    @include test(true); 
}   
.secondClass { 
    @include test(false); 
}

编译后

.firstClass {
  color: blue;
}
.secondClass {
  color: red;
}

@if达式返回值不是 false 或者 null 时,条件成立,输出 {} 内的代码

编译前

$type: monster;
p {
  @if $type == ocean {
    color: blue;
  } @else if $type == matador {
    color: red;
  } @else if $type == monster {
    color: green;
  } @else {
    color: black;
  }
}

编译后

p {
  color: green;
}

4.7.2 @for

@for 指令常用于循环输出。@for 有两种使用方式:from start through end 和 from start to end,两者的区别在于,前者遍历的范围是 [start, end], 而后者的遍历范围是 [start, end-1]

编译前

@for $i from 1 through 4 { 
    .col-#{$i} { 
      width: 100/4 * $i + '%';
    } 
}
@for $i from 1 to 4 { 
    .span-#{$i} { 
      width: 100/4 * $i + '%';
    } 
}

编译后

col-1 {
  width: "25%";
}
.col-2 {
  width: "50%";
}
.col-3 {
  width: "75%";
}
.col-4 {
  width: "100%";
}
.span-1 {
  width: "25%";
}
.span-2 {
  width: "50%";
}
.span-3 {
  width: "75%";
}

4.7.3 @each

@each 指令的格式是 var in <list>,var 可以是任何变量名,比如 length 或者name,而 <list> 是一连串的值,也就是值列表。

编译前

@each $animal in puma, sea-slug, egret, salamander {
    .#{$animal}-icon {
      background-image: url('/images/#{$animal}.png');
    }
}

编译后

.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");
}

4.8 函数指令

Sass 支持自定义函数,并能在任何属性值或 Sass script 中使用:

编译前

$grid-width: 40px;
$gutter-width: 10px;
@function grid-width($n) {
  @return $n * $grid-width + ($n - 1) * $gutter-width;
}
#sidebar { width: grid-width(5); }

编译后

#sidebar {
  width: 240px;
}

5. 区别

  1. 4.4@mixin,4.5@extend,4.5占位符%中可以看出三者编译后结果的不同,具体查看sass中的占位符%,@extend,@mixin(@include)的编译区别和使用场景
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容