美文网首页
Sass 基础

Sass 基础

作者: 夜幕小草 | 来源:发表于2017-01-07 12:46 被阅读551次

    1、SCSS 是 Sass 的新语法格式,从外形上来判断他和 CSS 长得几乎是一模一样,代码都包裹在一对大括号里,并且末尾结束处都有一个分号。其文件名格式常常以“.scss”为扩展名。
    2、有不少同学使用 Sass 新的语法规则,而文件扩展名依旧使用的是“.sass”,这也就造成血案了,编译时说编译不出来。在此特别提醒新同学:“.sass”只能使用 Sass 老语法规则(缩进规则),“.scss”使用的是 Sass 的新语法规则,也就是 SCSS 语法规则(类似 CSS 语法格式)。
    3、常常有人会问,使用 Sass 进行开发,那么是不是直接通过“<link>”引用“.scss”或“.sass”文件呢?那么这里告诉大家,在项目中还是引用“.css”文件,Sass 只不过是做为一个预处理工具,提前帮你做事情,只有你需要时候,他才有攻效。
    4、用webstrom,配置下watcher就可以自动编译了。
    5、编译错误:而最为常见的一个错误就是字符编译引起的。在Sass的编译的过程中,是不是支持“GBK”编码的。所以在创建 Sass 文件时,就需要将文件编码设置为“utf-8”。
    另外一个错误就是路径中的中文字符引起的。建议在项目中文件命名或者文件目录命名不要使用中文字符。而至于人为失误造成的编译失败,在编译过程中都会有具体的说明,大家可以根据编译器提供的错误信息进行对应的修改。
    6、scss不同样式风格的输出方法:嵌套输出方式 nested ; 展开输出方式 expanded ;紧凑输出方式 compact ;压缩输出方式 compressed
    7、[Sass]嵌套输出方式 nested:在编译的时候带上参数“ --style nested”:
    命令:

    sass --watch test.scss:test.css --style nested
    ```
    8、[Sass]展开输出方式 expanded:在编译的时候带上参数“ --style expanded”:
       命令:
    ```
    sass --watch test.scss:test.css --style expanded
    ```
    9、[Sass]紧凑输出方式 compact:在编译的时候带上参数“ --style compact”:
       命令:
    ```
    sass --watch test.scss:test.css --style compact
    ```
    10、[Sass]压缩输出方式 compressed:在编译的时候带上参数“ --style compressed”:
       命令:
    ```
    sass --watch test.scss:test.css --style compressed
    ```
    -------------------------------------------SCSS的基础特征-基础------------------------------------------
    1、定义变量的语法:$width: 300px    
    在有些编程语言中(如,JavaScript)声明变量都是使用关键词“var”开头,但是在 Sass 不使用这个关键词,而是使用大家都喜欢的美元符号“$”开头。
    2、[Sass]普通变量与默认变量:普通变量:定义之后可以在全局范围内使用。
      默认变量:sass 的默认变量仅需要在值后面加上 !default 即可。如
    ```
    $baseLineHeight:1.5 !default;
    ```
    3、[Sass]局部变量和全局变量
    ```
    $color: orange !default;//定义全局变量(在选择器、函数、混合宏...的外面定义的变量为全局变量)
    .block {
      color: $color;//调用全局变量
    }
    em {
      $color: red;//定义局部变量
      a {
        color: $color;//调用局部变量
      }
    }
    span {
      color: $color;//调用全局变量
    ```
    4、Sass 的嵌套分为三种:
    选择器嵌套:
    ```
    <header>
    <nav>
        <a href=“##”>Home</a>
        <a href=“##”>About</a>
        <a href=“##”>Blog</a>
    </nav>
    <header>
    ```
    ```
    -------scss-------------
    nav {
      a {
        color: red;
    
        header & {
          color:green;
        }
      }  
    }
    ```
    属性嵌套
    ```
    ---------css------------
    .box {
        border-top: 1px solid red;
        border-bottom: 1px solid green;
    }
    ------scss------------
    .box {
      border: {
       top: 1px solid red;
       bottom: 1px solid green;
      }
    }
    ```
    
    伪类嵌套
    ```
    .clearfix{
    &:before,
    &:after {
        content:"";
        display: table;
      }
    &:after {
        clear:both;
        overflow: hidden;
      }
    }
    ```
    5、--[Sass]混合宏-声明混合宏:如果你的整个网站中有几处小样式类似,比如颜色,字体等,在 Sass 可以使用变量来统一处理,那么这种选择还是不错的。但当你的样式变得越来越复杂,需要重复使用大段的样式时,使用变量就无法达到我们目了。这个时候Sass 中的混合宏就会变得非常有意义。在这一节中,主要向大家介绍 Sass 的混合宏。
    在 Sass 中,使用“@mixin”来声明一个混合宏
    复杂的混合宏:(带有逻辑关系的)
    ```
    @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);
      }
    }
    ```
    [Sass]混合宏-调用混合宏
    在 Sass 中通过 @mixin 关键词声明了一个混合宏,那么在实际调用中,其匹配了一个关键词“@include”来调用声明好的混合宏。例如:在你的样式中定义了一个圆角的混合宏“border-radius”:
    ```
    @mixin border-radius{
        -webkit-border-radius: 3px;
        border-radius: 3px;
    }
    ```
    调用:
    button {
        @include border-radius;
    }
    这个时候编译出来的 CSS:
    button {
      -webkit-border-radius: 3px;
      border-radius: 3px;
    }
    6、[Sass]混合宏的参数--传一个带值的参数
    在 Sass 的混合宏中,还可以给混合宏的参数传一个默认值,例如:
    @mixin border-radius($radius:3px){
      -webkit-border-radius: $radius;
      border-radius: $radius;
    }
    在混合宏“border-radius”传了一个参数“$radius”,而且给这个参数赋予了一个默认值“3px”。
    在调用类似这样的混合宏时,会多有一个机会,假设你的页面中的圆角很多地方都是“3px”的圆角,那么这个时候只需要调用默认的混合宏“border-radius”:
    .btn {
      @include border-radius;
    }
    编译出来的 CSS:
    .btn {
      -webkit-border-radius: 3px;
      border-radius: 3px;
    }
    7、[Sass]混合宏的参数--传多个参数
    Sass 混合宏除了能传一个参数之外,还可以传多个参数,如:
    @mixin center($width,$height){
      width: $width;
      height: $height;
      position: absolute;
      top: 50%;
      left: 50%;
      margin-top: -($height) / 2;
      margin-left: -($width) / 2;
    }
    在混合宏“center”就传了多个参数。在实际调用和其调用其他混合宏是一样的:
    .box-center {
      @include center(500px,300px);
    }
    编译出来 CSS:
    .box-center {
      width: 500px;
      height: 300px;
      position: absolute;
      top: 50%;
      left: 50%;
      margin-top: -150px;
      margin-left: -250px;
    }
    注意:  有一个特别的参数“…”。当混合宏传的参数过多之时,可以使用参数来替代,如:
    @mixin box-shadow($shadows...){
      @if length($shadows) >= 1 {
        -webkit-box-shadow: $shadows;
        box-shadow: $shadows;
      } @else {
        $shadows: 0 0 2px rgba(#000,.25);
        -webkit-box-shadow: $shadow;
        box-shadow: $shadow;
      }
    }
    在实际调用中:
    .box {
      @include box-shadow(0 0 1px rgba(#000,.5),0 0 2px rgba(#000,.2));
    }
    编译出来的CSS:
    .box {
      -webkit-box-shadow: 0 0 1px rgba(0, 0, 0, 0.5), 0 0 2px rgba(0, 0, 0, 0.2);
      box-shadow: 0 0 1px rgba(0, 0, 0, 0.5), 0 0 2px rgba(0, 0, 0, 0.2);
    }
    8、[Sass]扩展/继承
    在 Sass 中也具有继承一说,也是继承类中的样式代码块。在 Sass 中是通过关键词 “@extend”来继承已存在的类样式块,从而实现代码的继承。如下所示:
    //SCSS
    .btn {
      border: 1px solid #ccc;
      padding: 6px 10px;
      font-size: 14px;
    }
    .btn-primary {
      background-color: #f36;
      color: #fff;
      @extend .btn;
    }
    .btn-second {
      background-color: orange;
      color: #fff;
      @extend .btn;
    }
    编译出来之后:
    //CSS
    .btn, .btn-primary, .btn-second {
      border: 1px solid #ccc;
      padding: 6px 10px;
      font-size: 14px;
    }
    .btn-primary {
      background-color: #f36;
      color: #fff;
    }
    .btn-second {
      background-clor: orange;
      color: #fff;
    }
    9、[Sass]占位符 %placeholder    Sass 中的占位符 %placeholder 功能是一个很强大,很实用的一个功能,这也是我非常喜欢的功能。他可以取代以前 CSS 中的基类造成的代码冗余的情形。因为 %placeholder 声明的代码,如果不被 @extend 调用的话,不会产生任何代码
    %mt5 {
      margin-top: 5px;
    }
    %pt5{
      padding-top: 5px;
    }
    这段代码没有被 @extend 调用,他并没有产生任何代码块,只是静静的躺在你的某个 SCSS 文件中。只有通过 @extend 调用才会产生代码:
    //SCSS
    %mt5 {
      margin-top: 5px;
    }
    %pt5{
      padding-top: 5px;
    }
    .btn {
      @extend %mt5;
      @extend %pt5;
    }
    .block {
      @extend %mt5;
      span {
        @extend %pt5;
      }
    }
    编译出来的CSS
    //CSS
    .btn, .block {
      margin-top: 5px;
    }
    .btn, .block span {
      padding-top: 5px;
    }
    从编译出来的 CSS 代码可以看出,通过 @extend 调用的占位符,编译出来的代码会将相同的代码合并在一起。这也是我们希望看到的效果,也让你的代码变得更为干净。
    10、[Sass]混合宏 VS 继承 VS 占位符     疑问?什么时候用混合宏?什么时候用继承?什么时候用占位符?
      混合宏:他不会自动合并相同的样式代码,如果在样式文件中调用同一个混合宏,会产生多个对应的样式代码,造成代码的冗余,这也是 CSSer 无法忍受的一件事情。不过他并不是一无事处,他可以传参数。
      继承:使用继承后,编译出来的 CSS 会将使用继承的代码块合并到一起,通过组合选择器的方式向大家展现,比如 .mt, .block, .block span, .header, .header span。这样编译出来的代码相对于混合宏来说要干净的多,也是 CSSer 期望看到。但是他不能传变量参数。
      个人建议:如果你的代码块不需要专任何变量参数,而且有一个基类已在文件中存在,那么建议使用 Sass 的继承。
      占位符: CSS 代码和使用继承基本上是相同,只是不会在代码中生成占位符 mt 的选择器。那么占位符和继承的主要区别的,“占位符是独立定义,不调用的时候是不会在 CSS 中产生任何代码;继承是首先有一个基类存在,不管调用与不调用,基类的样式都将会
    出现在编译出来的 CSS 代码中。
    ***见图10** http://www.imooc.com/code/7041
    
    ![10、继承、宏、占位符.jpg](https://img.haomeiwen.com/i2494507/5a204817134bbc36.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    11、[Sass]插值#{}    使用 CSS 预处理器语言的一个主要原因是想使用 Sass 获得一个更好的结构体系。比如说你想写更干净的、高效的和面向对象的 CSS。Sass 中的插值(Interpolation)就是重要的一部分。
    如:
    $properties: (margin, padding);
    @mixin set-value($side, $value) {
        @each $prop in $properties {
            #{$prop}-#{$side}: $value;
        }
    }
    .login-box {
        @include set-value(top, 14px);
    }
    它可以让变量和属性工作的很完美,上面的代码编译成 CSS:
    .login-box {
        margin-top: 14px;
        padding-top: 14px;
    }
    另一个有用的用法是构建一个选择器。可以这样使用:
    @mixin generate-sizes($class, $small, $medium, $big) {
        .#{$class}-small { font-size: $small; }
        .#{$class}-medium { font-size: $medium; }
        .#{$class}-big { font-size: $big; }
    }
    @include generate-sizes("header-text", 12px, 20px, 40px);
    编译出来的 CSS:
    .header-text-small { font-size: 12px; }
    .header-text-medium { font-size: 20px; }
    .header-text-big { font-size: 40px; }
    11、[Sass]注释  类似 CSS 的注释方式,使用 ”/* ”开头,结属使用 ”*/ ”
    12、[Sass]数据类型     Sass 和 JavaScript 语言类似,也具有自己的数据类型,在 Sass 中包含以下几种数据类型:
     数字: 如,1、 2、 13、 10px;
     字符串:有引号字符串或无引号字符串,如,"foo"、 'bar'、 baz;
     颜色:如,blue、 #04a3f9、 rgba(255,0,0,0.5);
     布尔型:如,true、 false;
     空值:如,null;
     值列表:用空格或者逗号分开,如,1.5em 1em 0 2em 、 Helvetica, Arial, sans-serif。
    13、[Sass]字符串
    有引号字符串 (quoted strings),如 "Lucida Grande" 、'http://sass-lang.com';
    无引号字符串 (unquoted strings),如 sans-serifbold。
    14、[Sass]值列表
    所谓值列表 (lists) 是指 Sass 如何处理 CSS 中: margin: 10px 15px 0 0
         或者  font-face: Helvetica, Arial, sans-serif
        像上面这样通过空格或者逗号分隔的一系列的值。
     Sass列表函数(Sass list functions)赋予了值列表更多功能
    nth函数(nth function) 可以直接访问值列表中的某一项;
    join函数(join function) 可以将多个值列表连结在一起;
    append函数(append function) 可以在值列表中添加值; 
    @each规则(@each rule) 则能够给值列表中的每个项目添加样式。
    ----------------------------------- Sass的基本特性-运算------------------------------------
    1、[Sass运算]加法 减法  在变量或属性中都可以做加法运算  width: 20px + 8in;  携带不同类型的单位时,在 Sass 中计算会报错
    2、[Sass运算]乘法 Sass 中的乘法运算和前面介绍的加法与减法运算还略有不同。虽然他也能够支持多种单位(比如 em ,px , %),但当一个单位同时声明两个值时会有问题。    如: width:10px * 2px;  这个是错误的。。。     width: 10px * 2; 正确的
    3、[Sass运算]除法 Sass 的乘法运算规则也适用于除法运算。不过除法运算还有一个特殊之处。众所周知“/”符号在 CSS 中已做为一种符号使用。因此在 Sass 中做除法运算时,直接使用“/”符号做为除号时,将不会生效,编译时既得不到我们需要的效果,也不
    会报错。 
    .box {
      width: 100px / 2;  
    }
    编译出来的结果是:
    .box {
      width: 100px / 2;
    }这样的结果对于大家来说没有任何意义。要修正这个问题,只需要给运算的外面添加一个小括号( )即可:
    .box {
      width: (100px / 2);  
    } 编译后:
    .box {
      width: 50px;
    }
    除了上面情况带有小括号,“/”符号会当作除法运算符之外,如果“/”符号在已有的数学表达式中时,也会被认作除法符号。如下面
    示例:.box {
      width: 100px / 2 + 2in;  
    }编译后:
    .box {
      width: 242px;
    }
    另外,在 Sass 除法运算中,当用变量进行除法运算时,“/”符号也会自动被识别成除法,如下例所示:
     综合上述,”/  ”符号被当作除法运算符时有以下几种情况:
    •    如果数值或它的任意部分是存储在一个变量中或是函数的返回值。
    •    如果数值被圆括号包围。
    •    如果数值是另一个数学表达式的一部分。
    //SCSS
    p {
      font: 10px/8px;             // 纯 CSS,不是除法运算
      $width: 1000px;
      width: $width/2;            // 使用了变量,是除法运算
      width: round(1.5)/2;        // 使用了函数,是除法运算
      height: (500px/2);          // 使用了圆括号,是除法运算
      margin-left: 5px + 8px/2px; // 使用了加(+)号,是除法运算
    }编译出来的CSS
    p {
      font: 10px/8px;
      width: 500px;
      height: 250px;
      margin-left: 9px;
     }
    Sass 的除法运算还有一个情况。我们先回忆一下,在乘法运算时,如果两个值带有相同单位时,做乘法运算时,出来的结果并不是我们需要的结果。但在除法运算时,如果两个值带有相同的单位值时,除法运算之后会得到一个不带单位的数值。如下所示:
    .box {
      width: (1000px / 100px);
    }编译出来的CSS如下
    .box {
      width: 10;
    }
    4、[Sass运算]数字运算   在 Sass 运算中数字运算是较为常见的,数字运算包括前面介绍的:加法、减法、乘法和除法等运算。而且还可以通过括号来修改他们的运算先后顺序。和我们数学运算是一样的
    .box {
      width: ((220px + 720px) - 11 * 20 ) / 12 ;  
    }编译后:
    .box {
      width: 60px;
    }
    5、[Sass运算]颜色运算   所有算数运算都支持颜色值,并且是分段运算的。也就是说,红、绿和蓝各颜色分段单独进行运算
      如:color: #010203 + #040506;   =>  color: #050709;

    相关文章

      网友评论

          本文标题:Sass 基础

          本文链接:https://www.haomeiwen.com/subject/telfbttx.html