Sass的学习笔记

    Sass被称为“CSS预处理器”,就是用一种编程的思想去写CSS样式表。在还没接触Sass的时候,很多人都不愿意去了解,认为都会了CSS,为什么还要去写Sass,Sass最终生成的还是CSS文件呀。

    最初,我也是这么认为的。

    在我认真的学了Sass之后,原来使用Sass对CSS有很大的帮助,对于经常性写CSS文件的设计师们,节省了很多的开发时间,并且可以写出扩展性更强、更易于维护的代码。下面是我记录了Sass的学习笔记。

一. sass安装

1.1 Ruby安装

    主要针对的是window系统下的安装,因为Sass依赖于Ruby环境,所以应先安装Ruby,Ruby安装包下载链接:http://rubyinstaller.org/downloads/

    下载之后,安装过程中,请勾选Add Ruby executables to your PATH,添加环境变量。

    如果没有勾选,需在安装完成之后配置Ruby环境变量。

    在window系统中,新建系统变量RUBY_HOME,存放Ruby安装路径(D:\Program Files\Ruby23-x64)。

    在系统变量Path中,添加Ruby运行环境路径(%RUBY_HOME%\bin),Ruby环境变量配置完成。

1.2 运行gem命令

    安装完成之后,在开始菜单中找到Ruby,打开Start Command Prompt with Ruby,输入ruby -v,如果显示ruby的版本信息,表示安装成功。

1.3 安装sass

    A. 安装方法一:原配置源安装

    在命令行中直接输入gem install sass,按回车键即可。等待一段时间会提示安装成功。(因为国内网络原因,估计会安装不成功,所以可以翻墙或者选择下面淘宝镜像安装)

    安装Sass测试版本 gem install sass –pre

    升级Sass版本 gem update sass

    查看Sass版本 sass –v

    帮助命令行 sass -h

    B. 安装方法二:淘宝镜像安装

    首先移除默认的配置源(https://rubygems.org/),然后添加淘宝镜像的配置源(https://ruby.taobao.org/),在命令行中输入

    gem source --removehttps://rubygems.org/ 

    gem source --addhttps://ruby.taobao.org/

    输入gem source查看当前的源是否为淘宝镜像配置源,如果为淘宝源,再输入gem install sass,等待一段时间,会提示安装成功。

    C. 安装方法三:本地安装

    还可以选择本地安装,需要在网上找到Sass的gem文件,下载链接:https://rubygems.org/gems/sass

    下载之后,存放在任意位置,在命令行中输入gem install E://sass-3.4.22.gem,安装路径,根据自己存放的路径填写。


二. Sass基本用法

2.1 导入

    我们都知道CSS文件,都有导入功能,@import ‘reset.css’,但是在建站方面,这种导入效果和页面分别link两个CSS文件样式表的效果是一样的,因为HTTP请求的数目并不会减少。

    在Sass中,也有导入功能,如果导入的是CSS文件,@import ‘reset.css’,那效果和CSS文件导入效果是一样的,它还是以@import存在,并不会合并到编译后的CSS文件中。Sass导入可以省略.scss后缀名,如果以@import ‘reset’方式导入,会合并到编译后的CSS文件。一般需要导入的Sass文件是以_开头命名,如_reset.scss,导入只要引入reset即可。

    被导入Sass文件,_a.scss:

$fontSize: 12px;
    需要导入样式的Sass文件,b.scss:
@import 'a';
body {
  font-size: $fontSize;
}
    编译后的CSS样式:
body {
  font-size: 12px;
}
2.2 注释

    Sass文件添加注释有两种方式:

   /* 这是注释 */

    这种方式和CSS文件中的注释是一样的。如果在压缩模式下使用这种注释方式,那么在最终生产的CSS文件中注释将会被删除。但如果不用压缩输出方式,注释将保留在CSS文件中。

   // 这是注释

    Sass有可以用两条正斜杠表示单行注释,这和JavaScript、Java文件的单行注释方式相同。这种方式的注释,不会显示在输出的CSS文件中。  

2.3 变量

    Sass中定义变量的语法是:美元符号、变量名、冒号、变量值。

    A.普通变量$variable-name: value;

$colorMain: orange;
a {
  color: $colorMain;
}

    编译后的CSS样式:

a {
  color: orange;
}

    B.默认变量$variable-name: value !default;

$fontSize: 13px !default;
body {
  font-size: $fontSize;
}

    编译后的CSS样式:

body {
  font-size: 13px;
}

    如果需要改变默认变量,在默认变量前面,重新赋值即可。(!default标识告诉Sass,只有在没有其他值赋值的情况下才使用默认值。

$fontSize: 12px;
$fontSize: 13px !default;
body {
  font-size: $fontSize;
}

    编译后的CSS样式:

body {
  font-size: 12px;
}

    C.多值变量$variable-name: value1 value2 value3;

    Sass可以定义多值变量, 多值变量可以分为list类型和map类型,对应于JavaScript的数组和对象。

    list类型变量,是以空格,逗号或者括号来分割多个值,可用nth($list, n)函数来取值。

$colorLink: #222 $colorMain; //第一个为默认颜色值,第二个为鼠标滑过颜色值
a {
  color: nth($colorLink, 1);
  &:hover {
    color: nth($colorLink, 2);
  }
}

    编译后的CSS样式:

a {
  color: #222;
}
a:hover {
  color: orange;
}

    上面这部分类似为一维数组的定义和使用,下面为多维数组:

$px: 20px 15px, 15px 20px; //二维数组

    或者用括号来分割:

$px: (20px 15px) (15px 20px); //二维数组

   map类型变量,是以key-value成对定义的,其中value值又可以为普通变量或者list变量。格式为:$map(key1: value1, key2: value2, key3: value3)可用map-get($map, $key)来取值。
$heading: (h1: 20px, h2: 16px, h3: 13px);
body {
  font-size: map-get($heading, h3);
}

    编译后的CSS样式:

body {
  font-size: 13px;
}
2.4 嵌套

    嵌套语法是:选择器,左大括号,属性-值对,右大括号。在多值变量的时候,我们用到了一个&这样的符号,指的是父元素选择器,在嵌套伪选择器的时候经常用到。(在使用嵌套的时候要注意,尽量不要超过三层。

div {
  background: $colorMain;
  a {
    color: #fff;
    text-decoration: none;
    &:hover, &:active {
      text-decoration: underline;
    }
  }
}

    编译后的CSS样式:

div {
  background: orange;
}
div a {
  color: #fff;
  text-decoration: none;
}
div a:hover, div a:active {
  text-decoration: underline;
}
    在上面我们讲述的是选择器的嵌套,在Sass中,还有一种属性嵌套:
.div {
  background: {
    image: url("img/img_01.png");
    repeat: no-repeat;
    position: center;
  }
  border: {
    style: solid;
    color: $colorMain;
    left: {
      width: 5px;
    }
    right: {
      width: 2px;
    }
  }
}

    编译后的CSS样式:

.div {
  background-image: url("img/img_01.png");
  background-repeat: no-repeat;
  background-position: center;
  border-style: solid;
  border-color: orange;
  border-left-width: 5px;
  border-right-width: 2px;
}

    注意:属性嵌套书写时,一定不要忘了属性后面所跟的冒号在对div的背景定义上,其实背景直接可以写为background: url(“img/img_01.png”) no-repeat center,不用像上面那么麻烦,所以在写样式的时候,也要注意减少不必要的麻烦。

2.5 继承

    使用@extend命令可让任何元素继承其他样式定义好的属性和值。如果有好几个元素有共同的样式属性,这种情况可使用@extend命令。

.div {
  background: $colorMain;
  padding: 20px;
}
.div-01 {
  @extend .div;
  border: 2px solid #eee;
}
.div-02 {
  @extend .div;
  border: 2px solid #ccc;
}

    编译后的CSS样式:

.div, .div-01, .div-02 {
  background: orange;
  padding: 20px;
}
.div-01 {
  border: 2px solid #eee;
}
.div-02 {
  border: 2px solid #ccc;
}
2.6 占位符

    占位符与继承@extend命令一起使用,有些情况下,一些代码只是用来做扩展用,就可以用占位符选择器,以此来减少冗余代码。以继承的例子来,只需将开头的.div换为%div即可。这样在生成的CSS文件中就不会有.div的样式。

%div {
  background: $colorMain;
  padding: 20px;
}
.div-01 {
  @extend %div;
  border: 2px solid #eee;
}
.div-02 {
  @extend %div;
  border: 2px solid #ccc;
}

    编译后的CSS样式:

.div-01, .div-02 {
  background: orange;
  padding: 20px;
}
.div-01 {
  border: 2px solid #eee;
}
.div-02 {
  border: 2px solid #ccc;
}
2.7 混合宏

    混合宏以@mixin命令声明,基本语法是:@mixin mixin-name($parameter) {…: $parameter},混合宏既可以不传递参数,也可以有参数,并且可以是单个,也可以有多个参数。Compass提供了许多现成的混合宏。

    A.无参数混合宏

    无参数混合宏相当于继承,可以直接用继承代替。

@mixin center-block {
  margin-left: auto;
  margin-right: auto;
}
.div {
  @include center-block;
}

    编译后的CSS样式:

.div {
  margin-left: auto;
  margin-right: auto;
}

    B.有参数的混合宏

    以圆角为例(通常在定义混合宏的参数时,都会设定一个默认值,当然,也可以不设定。):

@mixin border-radius($radius: 4px) {
  -moz-border-radius: $radius;
  -webkit-border-radius: $radius;
  -o-border-radius: $radius;
  -ms-border-radius: $radius;
  border-radius: $radius;
}
.div {
  @include border-radius(5px);
}

    编译后的CSS样式:

.div {
  -moz-border-radius: 5px;
  -webkit-border-radius: 5px;
  -o-border-radius: 5px;
  -ms-border-radius: 5px;
  border-radius: 5px;
}

    C.多个参数混合宏

    对于#{$direction},可能有点陌生,这是变量的一种特殊使用方法,在字符串中使用,用#{}包含变量。

@mixin border-direction-radius($direction: top-left, $radius: 4px) {
  -moz-border-#{$direction}-radius: $radius;
  -webkit-border-#{$direction}-radius: $radius;
  -o-border-#{$direction}-radius: $radius;
  -ms-border-#{$direction}-radius: $radius;
  border-#{$direction}-radius: $radius;
}
.div {
  @include border-direction-radius(top-left, 5px)
}

    编译后的CSS样式:

.div {
  -moz-border-top-left-radius: 5px;
  -webkit-border-top-left-radius: 5px;
  -o-border-top-left-radius: 5px;
  -ms-border-top-left-radius: 5px;
  border-top-left-radius: 5px;
}

    D.多组值参数

    如果一个参数可以有多组值,如box-shadow,transition等,那么参数则需要在变量后加三个点表示,如:$variables… 。以box-shadow为例,box-shadow: h-shadow v-shadow blur spread color inset,都指的是box-shadow: 水平偏量 垂直偏量 模糊值 阴影扩散值 阴影的颜色 inset值

@mixin box-shadow ($shadow...){
  -moz-box-shadow: $shadow;
  -webkit-box-shadow: $shadow;
  -o-box-shadow: $shadow;
  -ms-box-shadow: $shadow;
  box-shadow: $shadow;
}
.div {
  @include box-shadow(1px 1px 2px 0px gray, 0px 1px 0px 1px lighten(gray, 0.5));
}

    编译后的CSS样式:

.div {
  -moz-box-shadow: 1px 1px 2px 0px gray, 0px 1px 0px 1px #818181;
  -webkit-box-shadow: 1px 1px 2px 0px gray, 0px 1px 0px 1px #818181;
  -o-box-shadow: 1px 1px 2px 0px gray, 0px 1px 0px 1px #818181;
  -ms-box-shadow: 1px 1px 2px 0px gray, 0px 1px 0px 1px #818181;
  box-shadow: 1px 1px 2px 0px gray, 0px 1px 0px 1px #818181;
}

 


三. Sass编程

3.1 数学计算

    Sass可进行加、减、乘、除计算。注意,进行计算时,数值的单位必须一致,并且运算符号最好两边都有一个空格,以免计算出错。

    A.加法

$widthContainer: 1200px;
$widthLeft: 20%;
$widthRight: 80%;
.div {
  width: $widthLeft + $widthRight;
}

    编译后的CSS样式:

.div {
  width: 100%;
}

    B.减法

.div {
  width: $widthRight - $widthLeft;
}

    编译后的CSS样式:

.div {
  width: 60%;
}

    C.乘法

    在计算乘法的时候要注意,当相乘时,如果值后面都带单位,会出现问题。

.addition {
  width: 20px * 40px;
}

    编译时,报错:

800px*px isn't a valid CSS value.

    如果只给一个值带单位,就正常了

.addition {
  width: 20 * 40px;
}

    编译后的CSS样式:

.addition {
  width: 800px;
}

    D.除法

    在计算除法的时候,跟乘法一样,只需要一个值带单位即可,并且表达式放在括号内,才能正常使用。

.addition {
  width: 80% / 20%;
}

    对此,编译之后,在CSS中,是没有意义的

.addition {
  width: 80% / 20%;
}

    如果使用括号:

.addition {
  width: (80% / 20);
}

    编译之后的CSS样式:

.addition {
  width: 4%;
}
3.2 条件

    @if@else if控制命令,举个简单例子:

$div: left;
.div {
  @if $div == left {
    float: left;
  }@else if $div == right {
    float: right;
  }
}

    编译后的CSS样式:

.div {
  float: left;
}
3.3 循环

   @for循环命令,有两种形式:@for $variable from startNum to endNum,和@for $variable from startNum through endNum,startNum表示起始值,endNum表示结束值,关键字to循环时不包括endNum这个数,through循环时包括endNum这个数。

@for $i from 1 through 3 {
  .div-#{$i} {
    width: 100px * $i; 
  }
}

    编译后的CSS样式:

.div-1 {
  width: 100px;
}
.div-2 {
  width: 200px;
}
.div-3 {
  width: 300px;
}

    @for $variable from startNum to endNum

@for $i from 2 to 4 {
  .div-#{$i} {
    width: 100px * $i;
  }
}

    编译后的CSS样式:

.div-2 {
  width: 100px;
}
.div-3 {
  width: 200px;
}

   @each循环命令,基本语法是:@each $variable in list/map,list/map表示list类型或者map类型变量。

    A.循环list类型变量

@each $list in a,b,c {
  .#{$list} {
    background-image: url("img/#{$list}.png");
  }
}

    编译后的CSS样式:

.a {
  background-image: url("img/a.png");
}
.b {
  background-image: url("img/b.png");
}
.c {
  background-image: url("img/c.png");
}

    多组值的循环:

$listData: (a, no-repeat, left top) (b, no-repeat, left bottom);
@each $name, $repeatType, $sizeType in $listData {
  .#{$name} {
    background-image: url("img/#{$name}.png");
    background-repeat: $repeatType;
    background-position: $sizeType;
  }
}

    编译后的CSS样式:

.a {
  background-image: url("img/a.png");
  background-repeat: no-repeat;
  background-position: left top;
}
.b {
  background-image: url("img/b.png");
  background-repeat: no-repeat;
  background-position: left bottom;
}

    B.循环map类型变量

$headings: (h1: 20px, h2: 16px, h3: 13px);
@each $header, $size in $headings {
  #{$header} {
    font-size: $size;
  }
}

    编译后的CSS文件:

h1 {
  font-size: 20px;
}
h2 {
  font-size: 16px;
}
h3 {
  font-size: 13px;
}
3.4函数

    Sass提供了好多现成的函数,我们也可以自己定义函数,用@function命令定义函数,@return定义函数返回值。

@function func() {
  @return 13px;
}
body {
  font-size: func();
}

    编译之后的CSS样式:

body {
  font-size: 13px;
}
 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值