简介

1. Sass 和 Scss

Sass 和 Scss 其实是同一种东西,我们平时都称之为 Sass;Scss 是 Sass 3 引入新的语法,其语法完全兼容 CSS3,并且继承了 Sass 的强大功能。也就是说,任何标准的 CSS3 样式表都是具有相同语义的有效的 Scss文件。

两者之间不同之处有以下两点:

  1. 文件扩展名不同,Sass 是以“.sass”后缀为扩展名,而 Scss 是以“.scss”后缀为扩展名
  2. 语法书写方式不同,Sass 是以严格的缩进式语法规则来书写,不带大括号({})和分号(;),而 SCSS 的语法书写和我们的 CSS 语法书写方式非常类似。

示例:

// Sass 语法
$w:200px; //定义变量
$h:300px; //定义变量
body
    width:$w;
    height:$h;
// Scss 语法
$w:200px;
$h:300px;
body{
    width:$w;
    height:$h;
}
/* 编译出来的css*/
body{
    width:200px;
    height:300px;
}

2. Sass/Scss 和 Css

  • Sass 和 Css

    Sass 和 CSS 写法的确存在一定的差异,由于 Sass 是基于 Ruby 写出来,所以其延续了 Ruby 的书写规范。在书写 Sass 时不带有大括号和分号,其主要是依靠严格的缩进方式来控制的。

  • Scss 和 Css

    SCSS 和 CSS 写法无差别,这也是 Sass 后来越来越受大众喜欢原因之一。简单点说,把你现有的“.css”文件直接修改成“.scss”即可使用。

安装

Mac 系统

1. Ruby 安装

确认是否安装了Ruby,打开终端,输入 ruby -v .

  • 有 ruby 信息 -- 已安装 .
  • 没有 ruby 信息,使用 brew install ruby 安装 ruby .

    链接: 安装 Ruby .

2. Sass 安装

使用 sass -v 查看 sass 版本号,检查是否安装了 sass .

  • 在线安装

    • 使用 sudo gem install sass 进行安装 sass .
  • 本地安装

    由于有时候直接使用上面的命令安装会让你无法正常实现安装(网络受限原因),当碰到这种情况之时,那么安装需要特殊去处理,可以通过下面的方法来实现 Sass 的正常安装:

  • 使用 sudo gem install XXX/sass-3.7.4.gem 进行安装 sass .

    XXX :下载的 sass 文件路径。

Windows 系统

1. Ruby 安装
  • 下载 Ruby 安装包,链接: Ruby 的官网 .

  • 安装 Ruby,将Ruby可执行文件添加到您的PATH

  • Ruby 安装完成后,在开始菜单中找到新安装的 Ruby,并启动 Ruby 的 Command 控制面板

2. Sass 安装
  • 在线安装

    • 使用 gem install sass 进行安装 sass .

    • 或者:使用 gem install compass 通过 Compass 来安装 Sass.

      Compass 是基于 Sass 开发的一个框架。也就是说,你安装了 Compass,也就同时安装好了 Sass。

      Compass 是一个成熟的、基于 Sass 开发的一个框架,这里面集成了很多写好的 mixins 和 Sass 函数。

  • 本地安装 (通 Mac 系统 Sass 的本地安装)

查测、更新及卸载

// 查看
sass -v

// 更新
gem update sass

// 卸载
gem uninstall sass

语法格式

1. Sass 语法格式

这里说的 Sass 语法是 Sass 的最初语法格式,他是通过 tab 键控制缩进的一种语法规则,而且这种缩进要求非常严格。另外其不带有任何的分号和大括号。常常把这种格式称为 Sass 老版本,其文件名以“.sass”为扩展名。

2. Scss 语法格式

SCSS 是 Sass 的新语法格式,从外形上来判断他和 CSS 长得几乎是一模一样,代码都包裹在一对大括号里,并且末尾结束处都有一个分号。其文件名格式常常以“.scss”为扩展名。

【注】:

“.sass”只能使用 Sass 老语法规则(缩进规则),“.scss”使用的是 Sass 的新语法规则,也就是 SCSS 语法规则(类似 CSS 语法格式)。

编译调试

1. Sass 编译

①、命令编译

使用电脑中的命令终端,通过输入 Sass 指令来编译 Sass

  • 单文件编译 sass <要编译的Sass文件路径>/style.scss:<要输出CSS文件路径>/style.css .

    // ex: 有一个 test.scss 文件需需要编译
    sass test.scss:test.css
  • 多文件编译 sass sass/:css/.

    上面的命令表示将项目中“sass”文件夹中所有“.scss”(“.sass”)文件编译成“.css”文件,并且将这些 CSS 文件都放在项目中“css”文件夹中。

  • 开启“watch”功能 sass --watch <要编译的Sass文件路径>/style.scss:<要输出CSS文件路径>/style.css.

    // 单文件
    sass --watch test.scss:test.css
    
    // 多文件
    sass --watch sass/:css/

    这样只要你的代码进行任保修改,都能自动监测到代码的变化,并且给你直接编译出来:

②、GUI 界面工具编辑

推荐:Koala .

③、自动化编译(X)

2. 不同样式风格的输出方法

①、嵌套输出方式 nested
sass --watch test.scss:test.css --style nested

②、展开输出方式 expanded

输出的 CSS 样式风格和 nested 类似,只是大括号在另起一行

sass --watch test.scss:test.css --style expanded

③、紧凑输出方式 compact
sass --watch test.scss:test.css --style compact

④、压缩输出方式 compressed

压缩输出方式会去掉标准的 Sass 和 CSS 注释及空格

sass --watch test.scss:test.css --style compressed

3. 调试(X)

基本特性

基础

1. 变量

Sass 的变量包括三个部分:

  1. 声明变量的符号“$”
  2. 变量名称
  3. 赋予变量的值

  • 默认变量

    值后面加上!default 。

    $color : #fff !default;

    sass 的默认变量一般是用来设置默认值,然后根据需求来覆盖,覆盖的方式 - 只需要在调用该变量之前重新声明下变量即可。

  • 全局变量和局部变量

    定义全局变量(在选择器、函数、混合宏...的外面定义的变量为全局变量)。

    可以简单的理解成,全局变量就是定义在元素外面的变量,而定义在元素内部的变量就是局部变量

  • 全局变量的影子

    当在局部范围(选择器内、函数内、混合宏内...)声明一个已经存在于全局范围内的变量时,局部变量就成为了全局变量的影子。基本上,局部变量只会在局部范围内覆盖全局变量

2. 嵌套
  • 选择器嵌套

  • 属性嵌套

    避免选择器嵌套:

    • 选择器嵌套最大的问题是将使最终的代码难以阅读。开发者需要花费巨大精力计算不同缩进级别下的选择器具体的表现效果。
    • 选择器越具体则声明语句越冗长,而且对最近选择器的引用(&)也越频繁。在某些时候,出现混淆选择器路径和探索下一级选择器的错误率很高,这非常不值得。
  • 伪类嵌套

3. 混合宏

在 Sass 中,使用“@mixin”来声明一个混合宏。
使用“@include”来调用声明好的混合宏。

  • 不带参数混合宏

    @mixin bdr{
        -webkit-border-radius: 5px;
        border-radius: 5px;
    }

    @mixin 是用来声明混合宏的关键词;
    bdr 是混合宏的名称;
    大括号里面是复用的样式代码。

  • 带参数混合宏

    参数:不带值的参数、带值的参数、多个参数
    有一个特别的参数“”。当混合宏传的参数过多之时,可以使用参数来替代。

    // 带值的参数
    @mixin bdr($radius:10px){
        -webkit-border-radius: $radius;
        border-radius: $radius;
    }
  • 复杂的混合宏

    @mixin box-shadow($shadow...) {
      @if length($shadow) >= 1 {
        @include prefixer(box-shadow, $shadow);
      } @else{
        $shadow:0 0 4px rgba(0,0,0,.3);
        @include prefixer(box-shadow, $shadow);
      }
    }

    这个 box-shadow 的混合宏,带有多个参数,这个时候可以使用“ … ”来替代。简单的解释一下,当 $shadow 的参数数量值大于或等于“ 1 ”时,表示有多个阴影值,反之调用默认的参数值“ 0 0 4px rgba(0,0,0,.3) ”。

  • 调用混合宏

  • 混合宏的不足

    混合宏在实际编码中给我们带来很多方便之处,特别是对于复用重复代码块。但其最大的不足之处是会生成冗余的代码块。

    在调用相同的混合宏时,并不能智能的将相同的样式代码块合并在一起。这也是 Sass 的混合宏最不足之处。

4. 扩展/继承

在 Sass 中是通过关键词 “@extend”来继承已存在的类样式块,从而实现代码的继承。

在 Sass 中的继承,可以继承类样式块中所有样式代码,而且编译出来的 CSS 会将选择器合并在一起,形成组合选择器。

5. 占位符

Sass 中的占位符 %placeholder 功能是一个很强大,很实用的一个功能。
他可以取代以前 CSS 中的基类造成的代码冗余的情形。
因为 %placeholder 声明的代码,如果不被 @extend 调用的话,不会产生任何代码。

从编译出来的 CSS 代码可以看出,通过 @extend 调用的占位符,编译出来的代码会将相同的代码合并在一起,让你的代码变得更为干净。

6. 混合宏 VS 继承 VS 占位符
  • Sass 中的混合宏使用

    总结:编译出来的 CSS 清晰告诉了大家,他不会自动合并相同的样式代码,如果在样式文件中调用同一个混合宏,会产生多个对应的样式代码,造成代码的冗余,这也是 CSSer 无法忍受的一件事情。不过他并不是一无事处,他可以传参数。

    个人建议:如果你的代码块中涉及到变量,建议使用混合宏来创建相同的代码块。

  • Sass 中继承

总结:使用继承后,编译出来的 CSS 会将使用继承的代码块合并到一起,通过组合选择器的方式向大家展现。这样编译出来的代码相对于混合宏来说要干净的多,也是 CSSer 期望看到。但是他不能传变量参数。

个人建议:如果你的代码块不需要传任何变量参数,而且有一个基类已在文件中存在,那么建议使用 Sass 的继承。

  • 占位符

    总结:编译出来的 CSS 代码和使用继承基本上是相同,只是不会在代码中生成占位符 mt 的选择器。那么占位符和继承的主要区别的,“占位符是独立定义,不调用的时候是不会在 CSS 中产生任何代码;继承是首先有一个基类存在,不管调用与不调用,基类的样式都将会出现在编译出来的 CSS 代码中。”

7. 插值

{}

可构建属性、选择器、@extend 中;
不能在 Sass 变量、@include 中调用。

8. 注释
  • 单行注释

    类似 JavaScript 的注释方式,使用“//”

    在编译出来的 CSS 中不会显示

  • 多行注释

    类似 CSS 的注释方式,使用 ”/* ”开头,结尾使用 ”*/ ”

    在编译出来的 CSS 显示

运算

1. 加/减

携带单位类型要一致。

in 是英寸。8in 即 8英寸。
1英寸约等于 2.54厘米,1英寸大约是96像素
width: 20px + 8in;
8in = 8 * 96px = 768px
即width = 20px + 768px = 788px;

2. 乘

进行乘法运算时,两个值单位相同时,只需要为一个数值提供单位即可。

乘法运算和加法、减法运算一样,在运算中有不同类型的单位时,也将会报错。

3. 除

规则 通 乘法运算,有一个特殊之处:“/” 符号在 CSS 中已做为一种符号使用。因此在 Sass 中做除法运算时,直接使用 “/” 符号做为除号时,将不会生效,编译时既得不到我们需要的效果,也不会报错。

p {
    font: 10px/8px;             // 纯 CSS,不是除法运算

    $width: 1000px;
    width: $width/2;            // 使用了变量,是除法运算

    width: round(1.5)/2;        // 使用了函数,是除法运算

    height: (500px/2);          // 使用了圆括号,是除法运算

    margin-left: 5px + 8px/2px; // 使用了加(+)号,是除法运算
}

编译之后

p {
    font: 10px/8px;
    width: 500px;
    height: 250px;
    margin-left: 9px;
}

如果两个值带有相同的单位值时,除法运算之后会得到一个不带单位的数值。

4. 颜色运算

所有算数运算都支持颜色值,并且是分段运算的。也就是说,红、绿和蓝各颜色分段单独进行运算。
也能将数字和颜色值 一起运算,同样也是分段运算的

计算公式为:

01 + 04 = 05、02 + 05 = 07 和 03 + 06 = 09, 并且被合成。
01 * 2 = 02、02 * 2 = 04 和 03 * 2 = 06, 并且被合成。

5. 字符运算

在 Sass 中可以通过加法符号“+”来对字符串进行连接。

除了在变量中做字符连接运算之外,还可以直接通过 +,把字符连接在一起。

div {
  cursor: e + -resize;
}

// 编译之后
div {
  cursor: e-resize;
}

注意,如果有引号的字符串被添加了一个没有引号的字符串 (也就是,带引号的字符串在 + 符号左侧), 结果会是一个有引号的字符串。 同样的,如果一个没有引号的字符串被添加了一个有引号的字符串 (没有引号的字符串在 + 符号左侧), 结果将是一个没有引号的字符串。

附录

Sass 教程 .

Sass 中文网 .

Sass 中文文档 .

CSS 预处理语言之 Scss 篇的更多相关文章

  1. CSS 预处理语言之 less 篇

    less 前言 Less 是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量.混合(mixin).函数等功能,让 CSS 更易维护.方便制作主题.扩充. 安装 客户端使用 // 引入 ...

  2. css预处理语言--让你的css编写更加简单方便

    CSS预处理语言之一-------LESS Less 是一门 CSS 预处理语言,它扩展了 CSS 语言,增加了变量.Mixin.函数等特性,使 CSS 更易维护和扩展. Less 可以运行在 Nod ...

  3. CSS预处理语言

    CSS预处理语言 Less,Sass,Stylus 安装 Less yarn add less 运行命令 ./node_modules/.bin/lessc 嵌套规则 Less.Sass嵌套规则一样 ...

  4. CSS预处理语言-less 的使用

    Less 是一门 CSS 预处理语言,它扩展了 CSS 语言,增加了变量.Mixin.函数等特性,使 CSS 更易维护和扩展. Less 可以运行在 Node 或浏览器端. Less的编译处理 作为一 ...

  5. Less:Less(CSS预处理语言)

    ylbtech-Less:Less(CSS预处理语言) Less 是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量.混合(mixin).函数等功能,让 CSS 更易维护.方便制作主题 ...

  6. css预处理语言的模块化实践

    编写css是前端工作中,一项普通而又频繁的劳动,由于css并不是一门语言,所以在程序设计上显得有些简陋.对于小型项目来说,css的量还不至于庞大,问题没有凸显,而如果要开发和持续维护一个较为大型的项目 ...

  7. LESS,强大的CSS预处理语言

    虽然写的css不多,但是我已经切身感觉到了书写css的恶心...抛开最令人烦的浏览器兼容问题不说,这个语言本身就有不少问题. 最简单的,比如多个地方是同一个颜色的,如果可以写在一个样式里还没什么,但是 ...

  8. CSS预处理语言——less与sass的使用

    我们一般所使用的Less跟Sass一般是将其编译成我们所熟悉的CSS再导入使用,当然不经编译,直接在浏览器使用 我是习惯用Koala来进行编译,简单智能方便,Hbuilder也自带编译功能,不过要手动 ...

  9. css预处理scss环境配置

    css 预处理器 CSS 预处理器用一种专门的编程语言,进行 Web css编码,然后再编译成正常的 CSS 文件,以供项目使用:说简单点就是在某个环境下写css 可以写变量.表达式.嵌套等,在通过该 ...

随机推荐

  1. CF1072A Palindromic Twist 思维

    Palindromic Twist time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  2. CSS动效集锦,视觉魔法的碰撞与融合(二)

    引言 长久以来,我认识到.CSS,是存在极限的.正如曾经替你扛下一切的那个男人,也总有他眼含热泪地拼上一切,却也无法帮你做到的事情,他只能困窘地让你看到他的无能为力,怅然若失. 然后和曾经他成长的时代 ...

  3. js中鼠标点击、移动和光标移动的事件触发

    事件有三要素:事件源.事件数据.事件处理程序 事件冒泡:当元素嵌套的时候,内部元素激发某个事件后,默认情况下外部元素相应的事件也会跟着依次触发 可以加return false;是阻止默认操作 oncl ...

  4. MySQL连接方式小结

    1.   连接方式 1.1  方式1 /usr/local/mysql5./bin/mysql -p 此方法默认采用root@localhost用户登录, 1.2  方式2 /usr/local/my ...

  5. Erlang模块supervisor翻译

    概要: 通用监督者行为   描述: 一个实现监督者的行为模块,一个监督被称为子进程的其它进程的进程.一个子进程可以是另一个监督者或工作者进程.工作者进程通常的实现使用gen_event,gen_fsm ...

  6. 【Linux】一些常用命令(待整理)

    一.关机重启命令 二.查询ip 三.查询杀死进程 四.CentOS7 关闭防火墙 五.vim常用 5.1 搜索 5.2 设置行号 剪切 替换 一.关机重启命令 shutdown -h 10 #计算机将 ...

  7. 小米下拉框jQuery实现

    <div class="daohanglan"> <div class="dh">小米手机 <--多个自己定义--> < ...

  8. Go语言基础之单元测试

    不写测试的开发不是好程序员.我个人非常崇尚TDD(Test Driven Development)的,然而可惜的是国内的程序员都不太关注测试这一部分. 这篇文章主要介绍下在Go语言中如何做单元测试和基 ...

  9. CopyOnWriteArrayList实现原理以及源码解析

    1.CopyOnWrite容器(并发容器) Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正 ...

  10. Termux 高级终端安装使用配置教程

    Termux 高级终端安装使用配置教程,这篇文章拖了有小半年.因为网上相关的文章相对来说还是比较少的,恰好今天又刷了机,所以就特意来总结一下,希望本文可以帮助到其他的小伙伴.发挥Android平台更大 ...