CSS预处理器—Sass

Sass是一款非常流行易用的css预处理器

一、安装

安装Sass前请确认是否安装了ruby环境,ruby安装请移步ruby官网。

直接在命令行中输入

gem install sass

可能会因为天朝防火墙的原因,安装失败,这是我们需要更换安装源,我们使用淘宝的ruby镜像。

gem sources --remove https://rubygems.org
gem sources -a https://ruby.taobao.org
gem install sass

二、Sass基本命令

1、查看版本

sass -v

或者

sass --version

2、将sass文件编译为css文件

sass demo.scss:demo.css

3、监听文件变化或文件变化实时编译

sass --watch demo.scss:demo.css
sass --watch sassDir:cssDir

4、声明编译后的css文件风格
css文件风格的配置提供了四种,nested、expanded、compact、compressed

sass --watch demo.scss:demo.css --style compact

compressed常用于生产环境,至于开发环境看个人习惯,我一般是用expanded
5、查看sass命令帮助选项

sass -h

sass --help

sass -?

三、语法

1、变量
Sass变量必须以$开头。
局部变量

body{
    $color:red;
    color:$color;
}
body {
  color: red;
}

局部变量同级不能访问

body{
    $color:red;
    color:$color;
}
footer{
    color:$color;
}

这段代码报错
局部变量子级可以访问

body{
    $color:red;
    color:$color;
    h1{
        background:$color;
    }
}
body {
  color: red;
}
body h1 {
  background: red;
}

布局变量变为全局变量,在变量后添加!global

body{
    $color:red !global;
    color:$color ;
}
footer{
    color:$color;
}
body {
  color: red;
}
footer {
  color: red;
}

或者不在选择器中声明变量,在文件头部声明

$color:red;
body{
    color:$color ;
}
footer{
    color:$color;
}
body {
  color: red;
}
footer {
  color: red;
}

注意声明变量同样会被覆盖

$color:red;
$color:blue;
body{
    color:$color ;
}
footer{
    color:$color;
}
body {
  color: blue;
}
footer {
  color: blue;
}

变量后添加!default为变量默认值。
多值变量,可以根据自己的需要选择相应的值

$paddings: 10px 20px 30px 40px;
body{
    padding:$paddings;
    padding-left:nth($paddings,2);
}
body {
  padding: 10px 20px 30px 40px;
  padding-left: 20px;
}

同时多值变量可以用map数据,以key—value形式出现

$maps:(color:red, border:1px solid #eee);
body{
    color:map-get($maps, color);
    border: map-get($maps, border);
}
body {
  color: red;
  border: 1px solid #eee;
}

变量一般是当做属性值来使用的,但是如果变量作为属性或者在某些特殊情况下等则必须要以#{$varialbes}形式使用

$direction: top;
$className: container;
.#{$className}{
    border-#{$direction}:1px solid #eee;
}
.container {
  border-top: 1px solid #eee;
}

当然sass的变量可以使用中划线也可以使用下划线,这完全取决于你的习惯。

$font-size:12px;
$border_style:1px solid #eee;
body{
    font-size:$font-size;
    border:$border_style;
}
body {
  font-size: 12px;
  border: 1px solid #eee;
}

sass编译的时候中划线和下划线是等同的,因此你甚至可以像下面一样随意使用,但是这当然是不推荐的

$font-size:12px;
$border_style:1px solid #eee;
body{
    font-size:$font_size;
    border:$border-style;
}
body {
  font-size: 12px;
  border: 1px solid #eee;
}

2、引入
sass中我们默认部分文件的文件名以下划线开头,这样监听文件夹的时候就不会将这个部分文件编译为css文件,引入部分文件时,我们可以写文件全称,也可以省略后缀名,甚至可以去掉下划线

@import "_part.scss";
@import "_part";
@import "part.scss";
@import "part";

3、嵌套
选择器嵌套

body{
    background-color:#eee;
    .header{
        background-color:#ccc;
        font-size:16px;
        &-container{
            margin:0 auto
        }
    }
}
body {
  background-color: #eee;
}
body .header {
  background-color: #ccc;
  font-size: 16px;
}
body .header-container {
  margin: 0 auto;
}

属性嵌套

body{
    background:{
        color:red;
        repeat:no-repeat;
    }
}

···
body {
background-color: red;
background-repeat: no-repeat;
}
···
可以通过地址符号&引用父选择器

a{
    color:#000;
    &:hover{
        color:#eee;
    }
}
.container{
    width:200px;
    &-info{
        height:20px;
    }
}
a {
  color: #000;
}
a:hover {
  color: #eee;
}
.container {
  width: 200px;
}
.container-info {
  height: 20px;
}

我们可以使用@at-root跳出选择器嵌套,当然这种使用方法常常是在嵌套比较深,我们不想嵌套这么深,但是在结构上这个又是属于父级的

body{
    .container{
        @at-root .info{
            color:#fff;
        }
    }
}
.info {
  color: #fff;
}

当然这并不能跳出媒体查询,如果需要跳出媒体查询的话需要使用@at-root (without: media)

@media screen and (max-width:1200px) {
    @at-root .container{
        height:300px;
    }
    @at-root (without:media) {
        .container{
            height:200px;
        }
    }
}
@media screen and (max-width: 1200px) {
  .container {
    height: 300px;
  }
}
.container {
  height: 200px;
}

这里的without有四个关键字media、rule、all、support,media表示跳出媒体查询,rule表示跳过普通css,all表示跳出所有,support不怎么使用,在此不表。
4、继承
sass中可以让选择器继承另一个选择器的所有样式,继承的样式编译后会采用联合声明,继承时采用@extend关键字

.container{
    margin:0 auto;
}
.title{
    @extend .container;
    border:1px solid #eee;
}
.container, .title {
  margin: 0 auto;
}
.title {
  border: 1px solid #eee;
}

继承多个选择器样式时,可以多次使用@extend,也可以使用逗号分隔需要继承的选择器

.container{
    margin:0 auto;
}
h1{
    font-size:12px;
}
.title{
    @extend .container;
    @extend h1;
    border:1px solid #eee;
}
.container{
    margin:0 auto;
}
h1{
    font-size:12px;
}
.title{
    @extend .container,h1;
    border:1px solid #eee;
}
.container, .title {
  margin: 0 auto;
}
h1, .title {
  font-size: 12px;
}
.title {
  border: 1px solid #eee;
}

当然也可以使用链式继承,不断继承

.container{
    margin:0 auto;
}
h1{
    font-size:12px;
}
.title{
    @extend .container,h1;
    border:1px solid #eee;
}
.info{
    @extend .title;
    border-radius:5px;
}
.container, .title, .info {
  margin: 0 auto;
}
h1, .title, .info {
  font-size: 12px;
}
.title, .info {
  border: 1px solid #eee;
}
.info {
  border-radius: 5px;
}

注意继承时,多选择器和毗邻兄弟选择器不支持继承,以下代码会报错

h1 span{
    font-size:15px;
}
h2{
    @extend h1 span;
}
h1 + span{
    font-size:15px;
}
h2{
    @extend h1 + span;
}

同时如果继承的选择器中有:hover这种伪类,同时也会被继承

.h1{
    font-size:15px;
    &:hover{
        color:red;
    }
}
.h2{
    @extend .h1;
    color:#000;
}
.h1, .h2 {
  font-size: 15px;
}
.h1:hover, .h2:hover {
  color: red;
}
.h2 {
  color: #000;
}

注意继承是不能继承自media之外的选择器的,以下代码会出错

.one{
    color:red;
}
@media screen and (max-width:1200px){
    .two{
        @extend .one;
    }
}

当你只是想把继承而来的选择器作为一种过渡,不想让它最终编译在css文件中,你可以使用占位选择器%

%footer{
    font-size:20px;
}
footer{
    @extend %footer;
    background:#eee;
}
footer .title-container{
    @extend %footer;
    line-height:1.5em;
}
footer, footer .title-container {
  font-size: 20px;
}
footer {
  background: #eee;
}
footer .title-container {
  line-height: 1.5em;
}

这非常适合将公共的样式分离出来。
5、混合
混合非常适合用来定义一些可重用的CSS代码片段,混合以@mixin定义,以@include使用,混合甚至可以使用参数,这就大大拓展了使用场景(当然如果没有参数,和使用选择器占位符的继承也没有区别)

@mixin cont{
    color:red;
}
body{
    @include cont;
}
body {
  color: red;
}
@mixin opacity($opacity:80){
    opacity:$opacity / 100;
    filter:alpha(opacity = $opacity)
}

body{
    background:red;
    @include opacity;
}
.con{
    @include opacity(50);
}
body {
  background: red;
  opacity: 0.8;
  filter: alpha(opacity=80);
}
.con {
  opacity: 0.5;
  filter: alpha(opacity=50);
}

使用参数的时候可以使用多个参数,当然你需要按照定义的顺序传递参数,如果你不想按顺序传参或者并不是需要传递全部参数,就需要在传递参数的时候采用键值对形式

@mixin mix($font-size:14px,$color:red){
    font-size:$font-size;
    color:$color;
};
.class1{
    @include mix(16px,#eee);
}
.class2{
    @include mix($color:blue);
}
.class1 {
  font-size: 16px;
  color: #eee;
}
.class2 {
  font-size: 14px;
  color: blue;
}

当我们不知道需要传递参数的个数时,我们可以在参数后面加...来表示,这通常是在background、box-shadow等可以定义多个值时使用

@mixin shadow($value...){
    box-shadow:$value;
}
.your-selector{
    @include shadow(0px 5px 5px #333,0px 10px 10px #555);
}
.your-selector {
  box-shadow: 0px 5px 5px #333, 0px 10px 10px #555;
}

混合还可以使用@content来接受一整块样式,这在响应式web设计中非常有用

@mixin style-for-iphone{
    @media screen and (min-width:320px) and (max-width:568px){
        @content;
    }
}
@include style-for-iphone{
    .mycontainer{
        width:98%;
    }
}
@media screen and (min-width: 320px) and (max-width: 568px) {
  .mycontainer {
    width: 98%;
  }
}

6、函数
sass中提供了很多函数,具体的函数可以在这里查到http://sass-lang.com/documentation/Sass/Script/Functions.html其中sass中的rgb函数可以将一个rgb颜色转换为十六进制颜色值

body{
    color:rgb(200,200,200);
}
body {
  color: #c8c8c8;
}

rgba函数可以将一个颜色值根据给定的透明度来转换为rgba颜色值

body{
    $color:rgb(200,200,200);
    color:$color;
    background:rgba($color,0.65);
}
body {
  color: #c8c8c8;
  background: rgba(200, 200, 200, 0.65);
}

此外sass中提供了很多其他的内置函数,不过在实际工作中用得会比较少,我们也可以通过@function关键字来自定义函数。

@function myfunction($width){
    @return $width * 2;
}
.myclass{
    width:myfunction(30px);
}
.myclass {
  width: 60px;
}

7、条件判断
if可以提供三目运算的功能,语法为if(value, value1, value2)当value为真时,采用value1的值,否则采用value2的值。

$screen:800;
body{
    font-size:if($screen > 768, 14px, 12px);
}
body {
  font-size: 14px;
}

@if、@else if、@else可以提供判断的功能。

$screen:700;
@if $screen > 768{
    body{
        color:red;
    }
}
@else if $screen > 560{
    body{
        color:blue;
    }
}
@else{
    body{
        color:yellow;
    }
}
body {
  color: blue;
}

8、循环
@for关键字可以提供循环功能,有两种语法

@for $var from <start> through <end>

@for $var from <start> to <end>

两种区别是through中包含end,而to不包含

@for $i from 1 through 3{
    .span-#{$i}{
        width:20% * $i;
    }
}
.span-1 {
  width: 20%;
}
.span-2 {
  width: 40%;
}
.span-3 {
  width: 60%;
}
@for $i from 1 to 3{
    .span-#{$i}{
        width:20% * $i;
    }
}
.span-1 {
  width: 20%;
}
.span-2 {
  width: 40%;
}

显然这非常适合数字连续的多个类的样式书写。
同样也可以使用@each实现遍历

$i:1;
@each $c in blue,red,green {
    .div#{$i}{
        color:$c
    }
    $i: $i + 3;
}
.div1 {
  color: blue;
}
.div4 {
  color: red;
}
.div7 {
  color: green;
}

7、调试
sass的调试可以使用@debug、@warn、@error三个关键字进行调试,相关信息将会在控制台输出

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

推荐阅读更多精彩内容

  • 1. CSS 的一些不那么美好的地方 CSS 不是一种编程语言,对于开发人员不是很友好。 CSS 在开发中会有许多...
    闷油瓶小张阅读 649评论 0 3
  • 上一节讲完了Sass安装与编译的入门支持,本节主要讲Sass的基础语法。 1.变量 在Sass中可以定义变量,变量...
    Rin阳阅读 502评论 0 0
  • ** 如果书写 CSS 让你感到十分痛苦,那么一定要试一试 Sass!** 首先参考 Sass 十分钟入门接下来会...
    Yi罐可乐阅读 948评论 3 11
  • 上一篇学完了Sass基础部分,这次要学习的是Sass的高级部分。 条件语句 在Sass中也有条件判断的语句,用法为...
    Rin阳阅读 783评论 0 0
  • 前言 Sass 是一门高于 CSS 的元语言,它能用来清晰地、结构化地描述文件样式,有着比普通 CSS 更加强大的...
    Rin阳阅读 534评论 0 1