Sass二三事(一)

写这篇文章是为了记录一下�平时忽略的Sass方面的知识点,发现虽然平时一直在用,但是对Sass真的是知之甚少。完整的用法可以参照官网。如有错误,请大神指出。

1.CSS预处理器

学过CSS的人都知道,CSS不能算是一门编程语言,只是一行行单纯的属性描述用来控制网页样式,写起来相当的费事,而且代码难易组织和维护。
CSS预处理器定义一种专门的语言,为 CSS 增加了一些编程的特性,将 CSS 作为目标生成文件,然后开发者就只要使用这种语言进行编码工作。可以在这种语言中使用变量简单的逻辑程序函数等等在编程语言中的一些基本特性,可以让你的 CSS 更加简洁适应性更强可读性更佳更易于代码的维护等诸多好处。
本文主要讲解Sass语言。

2.Sass和Scss有什么区别?

Sass有两种语法:
1)第一种比较老的称为缩排语法,由于 Sass 是基于 Ruby 写出来,所以其延续了 Ruby 的书写规范。在书写 Sass 时不带有大括号和分号,其主要是依靠严格的缩进方式来控制的,不能兼容现有的css代码,这也是Sass早期不受欢迎的原因。使用这种语法的样式表文件以.sass为后缀名。
Sass写法:

body
  color: #fff
  background: #f36

2)第二种称为 SCSS (Sassy CSS),是Sass进行改良后的结果,是 Sass 3 引入新的语法,其语法完全兼容 CSS3,并且继承了 Sass 的强大功能。以.scss作为后缀名。

Sscc VS Sass.png

这两种语法可以使用命令行工具sass-convert相互转换:

# 将 Sass 转换为 SCSS
$ sass-convert style.sass style.scss

# 将 SCSS 转换为 Sass
$ sass-convert style.scss style.sass

下面提到的sass文件都是指以.scss为后缀名的文件

3.基本用法

3.1编译
使用下面的命令可以将.scss文件

#单文件编译
sass input.sass:output.css
#多文件编译
sass input-dir:output-dir

在编译 Sass 时,开启“watch”功能, 一旦代码有任何修改,可以自动监测到代码的变化,并且直接编译出来:

sass --watch input.sass:output.css
sass --watch input-dir:output-dir

Sass提供4种编译风格,编译时代上参数 --style NAME
嵌套输出方式 nested (默认值)
展开输出方式 **expanded **
紧凑输出方式 **compact **
压缩输出方式 compressed
如下,原scss文件代码为:

table{
    tr{
        td{
            padding:5px;
        }
    }
    a{
      display:inline-block;
      padding:10px;
    }
}

4种风格编译后的结果为

//nested
table tr td {
  padding: 5px; }
table a {
  display: inline-block;
  padding: 10px; }
//expanded 与nested类似,大括号另起一行
table tr td {
  padding: 5px;
}
table a {
  display: inline-block;
  padding: 10px;
}
//compact 结果为单行css
table tr td { padding: 5px; }
table a { display: inline-block; padding: 10px; }
#compressed 一般生产环境中会选择压缩css代码,删掉注释与空格
table tr td{padding:5px}table a{display:inline-block;padding:10px}

3.2基本特性
1)变量
Sass中可以定义变量,以$打头,如果值后面加上!default则表示默认值

$green:#55b929 !default;
a{
    color:$green;
}

默认变量在组件化开发中非常有用。它很像css属性中 !important 标签的对立面,不同的是!default用于变量,含义是:如果这个变量被声明赋值了,那就用它声明的值,否则就用这个默认值。
如果变量需要镶嵌在字符串之中,就必须需要写在#{}之中。

$side : left;
.rect {
  border-#{$side}-color: $green;
}

2)属性嵌套
平时用的较多的是选择器嵌套,孰不知属性也可以嵌套

//属性嵌套
.title {
  font: {
   size: 12px;
   weight: bold;
  }  
}

3)~同层组合选择器
选择所有跟在article后的同层article元素,不管它们之间隔了多少其他元素:

article ~ article { border-top: 1px dashed #ccc }

4)混合宏 VS 继承 VS 占位符
什么时候用混合宏,什么时候用继承,什么时候使用占位符?其实他们各有各的优点与缺点:


混合宏 VS 继承 VS 占位符

看看三种方式编译出来的css

//SCSS中混合宏使用
@mixin mt($var){
  margin-top: $var;  
}

.block {
  @include mt(5px);

  span {
    display:block;
    @include mt(5px);
  }
}

.header {
  color: orange;
  @include mt(5px);

  span{
    display:block;
    @include mt(5px);
  }
}

//SCSS 继承的运用
.mt{
  margin-top: 5px;  
}

.block {
  @extend .mt;

  span {
    display:block;
    @extend .mt;
  }
}

.header {
  color: orange;
  @extend .mt;

  span{
    display:block;
    @extend .mt;
  }
}

//SCSS中占位符的使用
%mt{
  margin-top: 5px;  
}

.block {
  @extend %mt;

  span {
    display:block;
    @extend %mt;
  }
}

.header {
  color: orange;
  @extend %mt;

  span{
    display:block;
    @extend %mt;
  }
}

编译结果:

//SCSS中混合宏使用
.block {
  margin-top: 5px;
}
.block span {
  display: block;
  margin-top: 5px;
}

.header {
  color: orange;
  margin-top: 5px;
}
.header span {
  display: block;
  margin-top: 5px;
}
//SCSS 继承的运用
.mt, .block, .block span, .header, .header span {
  margin-top: 5px;
}

.block span {
  display: block;
}

.header {
  color: orange;
}
.header span {
  display: block;
}
//SCSS中占位符的使用
.block, .block span, .header, .header span {
  margin-top: 5px;
}

.block span {
  display: block;
}

.header {
  color: orange;
}
.header span {
  display: block;
}

总结:

  • 混合宏可以传参,如果代码中涉及变量,建议用混合宏
  • 如果代码不需要传参,且有一个基类已在文件中存在,那么建议使用 Sass 的继承
  • 占位符与继承类似,但是占位符是独立定义,不调用的时候是不会在 CSS 中产生任何代码;继承是首先有一个基类存在,不管调用与不调用,基类的样式都将会出现在编译出来的 CSS 代码中。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容