美文网首页
SASS学习笔记

SASS学习笔记

作者: EL_PSY_CONGROO | 来源:发表于2018-01-20 16:00 被阅读0次

    SASS学习笔记

    文件后缀名

    sass有两种后缀名文件:一种后缀名为sass不使用大括号和分号;另一种是scss文件,这种和我们平时写的css文件格式差不多,使用大括号和分号。建议使用后缀名为scss的文件,以避免sass后缀名的严格格式要求报错。

    导入

    sass的导入( @import)规则和css的有所不同,编译时会将 @importscss文件合并进来只生成一个css文件。但是如果你在sass文件中导入css文件如 @import 'reset.css',那效果跟普通css导入样式文件一样,导入的css文件不会合并到编译后的文件中,而是以@import方式存在。

    所有的sass导入文件都可以忽略后缀名 .scss

    //a.scss
    //-------------------------------
    body {
      background: #eee;
    }
    
    @import "reset.css";
    @import "a";
    p{
      background: #0982c1;
    } 
    

    结果如下:

    @import "reset.css";
    body {
      background: #eee;
    }
    p{
      background: #0982c1;
    }
    

    变量

    sass的变量必须是$开头,后面紧跟变量名,而变量值和变量名之间就需要使用冒号(:)分隔开(就像css属性设置一样),如果值后面加上!default则表示默认值。

    普通变量

    定义之后可以在全局范围内使用。

    //sass style
    //-------------------------------
    $fontSize: 12px;
    body{
        font-size:$fontSize;
    }
    
    //css style
    //-------------------------------
    body{
        font-size:12px;
    }
    

    默认变量

    //sass style
    //-------------------------------
    $baseLineHeight:1.5 !default;
    body{
        line-height: $baseLineHeight; 
    }
    
    //css style
    //-------------------------------
    body{
        line-height:1.5;
    }
    

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

    //sass style
    //-------------------------------
    $baseLineHeight:2;
    $baseLineHeight:1.5 !default;
    body{
        line-height: $baseLineHeight; 
    }
    
    //css style
    //-------------------------------
    body{
        line-height:2;
    }
    

    特殊变量

    一般我们定义的变量都为属性值,可直接使用,但是如果变量作为属性或在某些特殊情况下等则必须要以 #{$variables}形式使用。

    //sass style
    //-------------------------------
    $borderDirection:top !default; 
    $baseFontSize:12px !default;
    $baseLineHeight:1.5 !default;
    
    //应用于class和属性
    .border-#{$borderDirection}{
      border-#{$borderDirection}:1px solid #ccc;
    }
    //应用于复杂的属性值
    body{
        font:#{$baseFontSize}/#{$baseLineHeight};
    }
    
    //css style
    //-------------------------------
    .border-top{
      border-top:1px solid #ccc;
    }
    body {
      font: 12px/1.5;
    }
    

    多值变量

    多值变量分为list类型和map类型,简单来说list类型有点像js中的数组,而map类型有点像js中的对象

    list类型

    list数据可通过空格逗号小括号分隔多个值,可用 nth($var,$index)取值。

    定义:

    //一维数据
    $px: 5px 10px 20px 30px;
    
    //二维数据,相当于js中的二维数组
    $px: 5px 10px, 20px 30px;
    $px: (5px 10px) (20px 30px);
    

    使用:

    //sass style
    //-------------------------------
    $linkColor:#08c #333 !default;//第一个值为默认值,第二个鼠标滑过值
    a{
      color:nth($linkColor,1);
    
      &:hover{
        color:nth($linkColor,2);
      }
    }
    
    //css style
    //-------------------------------
    a{
      color:#08c;
    }
    a:hover{
      color:#333;
    }
    

    map类型

    map数据以keyvalue成对出现,其中value又可以是list。格式为: $map: (key1: value1, key2: value2, key3: value3);。可通过map-get($map,$key)取值。

    定义:

    $heading: (h1: 2em, h2: 1.5em, h3: 1.2em);
    

    使用:

    //sass style
    //-------------------------------
    $headings: (h1: 2em, h2: 1.5em, h3: 1.2em);
    @each $header, $size in $headings {
      #{$header} {
        font-size: $size;
      }
    }
    
    //css style
    //-------------------------------
    h1 {
      font-size: 2em; 
    }
    h2 {
      font-size: 1.5em; 
    }
    h3 {
      font-size: 1.2em; 
    }
    

    全局变量:

    在变量值后面加上 !global即为全局变量。

    目前变量机制:

    在选择器中声明的变量会覆盖外面全局声明的变量。(这也就人们常说的sass没有局部变量)

    //sass style
    //-------------------------------
    $fontSize:12px;
    body{
        $fontSize: 14px;        
        font-size:$fontSize;
    }
    p{
        font-size:$fontSize;
    }
    
    //css style
    //-------------------------------
    body{
        font-size:14px;
    }
    p{
        font-size:14px;
    }
    

    启用global之后的机制:

    //sass style
    //-------------------------------
    $fontSize:12px;
    $color:#333;
    body{
        $fontSize: 14px;        
        $color:#fff !global;
        font-size:$fontSize;
        color:$color;
    }
    p{
        font-size:$fontSize;
        color:$color;
    }
    
    //css style
    //注意,这个目前还无法使用,所以样式不是真实解析出来的。
    //-------------------------------
    body{
        font-size:14px;
        color:#fff;
    }
    p{
        font-size:12px;
        color:#fff;
    }
    

    嵌套

    选择器嵌套

    所谓选择器嵌套指的是在一个选择器中嵌套另一个选择器来实现继承,从而增强了sass文件的结构性和可读性。

    在选择器嵌套中,可以使用 &表示父元素选择器

    //sass style
    //-------------------------------
    #top_nav{
      line-height: 40px;
      text-transform: capitalize;
      background-color:#333;
      li{
        float:left;
      }
      a{
        display: block;
        padding: 0 10px;
        color: #fff;
    
        &:hover{
          color:#ddd;
        }
      }
    }
    
    //css style
    //-------------------------------
    #top_nav{
      line-height: 40px;
      text-transform: capitalize;
      background-color:#333;
    }  
    #top_nav li{
      float:left;
    }
    #top_nav a{
      display: block;
      padding: 0 10px;
      color: #fff;
    }
    #top_nav a:hover{
      color:#ddd;
    }
    

    属性嵌套

    所谓属性嵌套指的是有些属性拥有同一个开始单词,如border-widthborder-color都是以border开头。拿个官网的实例看下:

    //sass style
    //-------------------------------
    .fakeshadow {
      border: {
        style: solid;
        left: {
          width: 4px;
          color: #888;
        }
        right: {
          width: 2px;
          color: #ccc;
        }
      }
    }
    
    //css style
    //-------------------------------
    .fakeshadow {
      border-style: solid;
      border-left-width: 4px;
      border-left-color: #888;
      border-right-width: 2px;
      border-right-color: #ccc; 
    }
    

    @at-root

    此语句用来跳出选择器嵌套的。默认所有的嵌套,继承所有上级选择器,但有了这个就可以跳出所有上级选择器。

    普通跳出嵌套

    //sass style
    //-------------------------------
    //没有跳出
    .parent-1 {
      color:#f00;
      .child {
        width:100px;
      }
    }
    
    //单个选择器跳出
    .parent-2 {
      color:#f00;
      @at-root .child {
        width:200px;
      }
    }
    
    //多个选择器跳出
    .parent-3 {
      background:#f00;
      @at-root {
        .child1 {
          width:300px;
        }
        .child2 {
          width:400px;
        }
      }
    }
    
    //css style
    //-------------------------------
    .parent-1 {
      color: #f00;
    }
    .parent-1 .child {
      width: 100px;
    }
    
    .parent-2 {
      color: #f00;
    }
    .child {
      width: 200px;
    }
    
    .parent-3 {
      background: #f00;
    }
    .child1 {
      width: 300px;
    }
    .child2 {
      width: 400px;
    }
    

    @at-root (without: ...)

    默认 @at-root只会跳出选择器嵌套,而不能跳出 @media@support,如果要跳出这两种,则需使用 @at-root (without: media)@at-root (without: support)。这个语法的关键词有四个: allrule(表示常规css), mediasupport。我们默认的 @at-root其实就是 @at-root (without:rule)

    //sass style
    //-------------------------------
    //跳出父级元素嵌套
    @media print {
        .parent1{
          color:#f00;
          @at-root .child1 {
            width:200px;
          }
        }
    }
    
    //跳出media嵌套,父级有效
    @media print {
      .parent2{
        color:#f00;
    
        @at-root (without: media) {
          .child2 {
            width:200px;
          } 
        }
      }
    }
    
    //跳出media和父级
    @media print {
      .parent3{
        color:#f00;
    
        @at-root (without: all) {
          .child3 {
            width:200px;
          } 
        }
      }
    }
    
    //sass style
    //-------------------------------
    @media print {
      .parent1 {
        color: #f00;
      }
      .child1 {
        width: 200px;
      }
    }
    
    @media print {
      .parent2 {
        color: #f00;
      }
    }
    .parent2 .child2 {
      width: 200px;
    }
    
    @media print {
      .parent3 {
        color: #f00;
      }
    }
    .child3 {
      width: 200px;
    }
    

    @at-root&配合使用

    //sass style
    //-------------------------------
    .child{
        @at-root .parent &{
            color:#f00;
        }
    }
    
    //css style
    //-------------------------------
    .parent .child {
      color: #f00;
    }
    

    应用于@keyframes

    //sass style
    //-------------------------------
    .demo {
        ...
        animation: motion 3s infinite;
    
        @at-root {
            @keyframes motion {
              ...
            }
        }
    }
    
    //css style
    //-------------------------------   
    .demo {
        ...   
        animation: motion 3s infinite;
    }
    @keyframes motion {
        ...
    }
    

    混合(mixin

    sass中使用 @mixin声明混合(有些类似于编程语言中的函数),可以传递参数,参数名以$符号开始,多个参数以逗号分开,也可以给参数设置默认值。声明的 @mixin通过 @include来调用。

    无参数mixin

    //sass style
    //-------------------------------
    @mixin center-block {
        margin-left:auto;
        margin-right:auto;
    }
    .demo{
        @include center-block;
    }
    
    //css style
    //-------------------------------
    .demo{
        margin-left:auto;
        margin-right:auto;
    }
    

    有参数mixin

    //sass style
    //-------------------------------   
    @mixin opacity($opacity:50) {
      opacity: $opacity / 100;
      filter: alpha(opacity=$opacity);
    }
    
    //css style
    //-------------------------------
    .opacity{
      @include opacity; //参数使用默认值
    }
    .opacity-80{
      @include opacity(80); //传递参数
    }
    

    多组值参数mixin

    如果一个参数可以有多组值,如box-shadowtransition等,那么参数则需要在变量后加三个点表示,如 $variables...

    //sass style
    //-------------------------------   
    //box-shadow可以有多组值,所以在变量参数后面添加...
    @mixin box-shadow($shadow...) {
      -webkit-box-shadow:$shadow;
      box-shadow:$shadow;
    }
    .box{
      border:1px solid #ccc;
      @include box-shadow(0 2px 2px rgba(0,0,0,.3),0 3px 3px rgba(0,0,0,.3),0 4px 4px rgba(0,0,0,.3));
    }
    
    //css style
    //-------------------------------
    .box{
      border:1px solid #ccc;
      -webkit-box-shadow:0 2px 2px rgba(0,0,0,.3),0 3px 3px rgba(0,0,0,.3),0 4px 4px rgba(0,0,0,.3);
      box-shadow:0 2px 2px rgba(0,0,0,.3),0 3px 3px rgba(0,0,0,.3),0 4px 4px rgba(0,0,0,.3);
    }
    

    @content

    @content可以用来解决css3@media等带来的问题。它可以使 @mixin接受一整块样式,接受的样式从@content开始。(相当于在调用mixin时自定义函数体)

    //sass style
    //-------------------------------                     
    @mixin max-screen($res){
      @media only screen and ( max-width: $res )
      {
        @content;
      }
    }
    
    @include max-screen(480px) {
      body { color: red }
    }
    
    //css style
    //-------------------------------
    @media only screen and (max-width: 480px) {
      body { color: red }
    }                   
    

    继承

    sass中,选择器继承可以让选择器继承另一个选择器的所有样式,并联合声明。使用选择器的继承,要使用关键词 @extend,后面紧跟需要继承的选择器。

    //sass style
    //-------------------------------
    h1{
      border: 4px solid #ff9aa9;
    }
    .speaker{
      @extend h1;
      border-width: 2px;
    }
    
    //css style
    //-------------------------------
    h1,.speaker{
      border: 4px solid #ff9aa9;
    }
    .speaker{
      border-width: 2px;
    }
    

    占位选择器%

    sass 3.2.0以后就可以定义占位选择器 %。这种选择器的优势在于:如果不调用则不会有任何多余的css文件,避免了以前在一些基础的文件中预定义了很多基础的样式,然后实际应用中不管是否使用了 @extend去继承相应的样式,都会解析出来所有的样式。占位选择器以%标识定义,通过 @extend调用。

    //sass style
    //-------------------------------
    %ir{
      color: transparent;
      text-shadow: none;
      background-color: transparent;
      border: 0;
    }
    %clearfix{
      @if $lte7 {
        *zoom: 1;
      }
      &:before,
      &:after {
        content: "";
        display: table;
        font: 0/0 a;
      }
      &:after {
        clear: both;
      }
    }
    #header{
      h1{
        @extend %ir;
        width:300px;
      }
    }
    .ir{
      @extend %ir;
    }
    
    //css style
    //-------------------------------
    #header h1,
    .ir{
      color: transparent;
      text-shadow: none;
      background-color: transparent;
      border: 0;
    }
    #header h1{
      width:300px;
    }
    

    继承与混合

    继承与混合能够完成相同的工作,不过,@mixin通过 @include调用后解析出来的样式是以拷贝形式存在的,而下面的继承则是以联合声明的方式存在的,所以从3.2.0版本以后,建议传递参数的用 @mixin,而非传递参数类的使用继承 %

    函数

    sass定义了很多函数可供使用,也可以自己定义函数,以@fuction开始。

    //sass style
    //-------------------------------                     
    $baseFontSize:      10px !default;
    $gray:              #ccc !defualt;        
    
    // pixels to rems 
    @function pxToRem($px) {
      @return $px / $baseFontSize * 1rem;
    }
    
    body{
      font-size:$baseFontSize;
      color:lighten($gray,10%);
    }
    .test{
      font-size:pxToRem(16px);
      color:darken($gray,10%);
    }
    
    //css style
    //-------------------------------
    body{
      font-size:10px;
      color:#E6E6E6;
    }
    .test{
      font-size:1.6rem;
      color:#B3B3B3;
    }
    

    运算

    sass具有运算的特性,可以对数值型的Value(如:数字、颜色、变量等)进行加减乘除四则运算。请注意运算符前后请留一个空格,不然会出错

    $baseFontSize:          14px !default;
    $baseLineHeight:        1.5 !default;
    $baseGap:               $baseFontSize * $baseLineHeight !default;
    $halfBaseGap:           $baseGap / 2  !default;
    $samllFontSize:         $baseFontSize - 2px  !default;
    
    //grid 
    $_columns:                     12 !default;      // Total number of columns
    $_column-width:                60px !default;   // Width of a single column
    $_gutter:                      20px !default;     // Width of the gutter
    $_gridsystem-width:            $_columns * ($_column-width + $_gutter); //grid system width
    

    条件判断及循环

    @if判断

    @if可一个条件单独使用,也可以和 @else结合多条件使用。

    //sass style
    //-------------------------------
    $lte7: true;
    $type: monster;
    .ib{
        display:inline-block;
        @if $lte7 {
            *display:inline;
            *zoom:1;
        }
    }
    p {
      @if $type == ocean {
        color: blue;
      } @else if $type == matador {
        color: red;
      } @else if $type == monster {
        color: green;
      } @else {
        color: black;
      }
    }
    
    //css style
    //-------------------------------
    .ib{
        display:inline-block;
        *display:inline;
        *zoom:1;
    }
    p {
      color: green; 
    }
    

    三目判断

    语法为: if($condition, $if_true, $if_false) 。三个参数分别表示:条件,条件为真的值,条件为假的值。

    if(true, 1px, 2px) => 1px
    if(false, 1px, 2px) => 2px
    

    for循环

    for循环有两种形式,分别为: @for $var from <start> through <end>@for $var from <start> to <end>$i表示变量,start表示起始值,end表示结束值,这两个的区别是关键字through表示包括end这个数,而to则不包括end这个数。

    //sass style
    //-------------------------------
    @for $i from 1 through 3 {
      .item-#{$i} { width: 2em * $i; }
    }
    
    //css style
    //-------------------------------
    .item-1 {
      width: 2em; 
    }
    .item-2 {
      width: 4em; 
    }
    .item-3 {
      width: 6em; 
    }
    

    @each循环

    语法为: @each $var in <list or map>。其中 $var表示变量,而listmap表示list类型数据和map类型数据。sass 3.3.0新加入了多字段循环和map数据循环。

    单个字段list数据循环

    //sass style
    //-------------------------------
    $animal-list: puma, sea-slug, egret, salamander;
    @each $animal in $animal-list {
      .#{$animal}-icon {
        background-image: url('/images/#{$animal}.png');
      }
    }
    
    //css style
    //-------------------------------
    .puma-icon {
      background-image: url('/images/puma.png'); 
    }
    .sea-slug-icon {
      background-image: url('/images/sea-slug.png'); 
    }
    .egret-icon {
      background-image: url('/images/egret.png'); 
    }
    .salamander-icon {
      background-image: url('/images/salamander.png'); 
    }
    

    多个字段list数据循环

    //sass style
    //-------------------------------
    $animal-data: (puma, black, default),(sea-slug, blue, pointer),(egret, white, move);
    @each $animal, $color, $cursor in $animal-data {
      .#{$animal}-icon {
        background-image: url('/images/#{$animal}.png');
        border: 2px solid $color;
        cursor: $cursor;
      }
    }
    
    //css style
    //-------------------------------
    .puma-icon {
      background-image: url('/images/puma.png');
      border: 2px solid black;
      cursor: default; 
    }
    .sea-slug-icon {
      background-image: url('/images/sea-slug.png');
      border: 2px solid blue;
      cursor: pointer; 
    }
    .egret-icon {
      background-image: url('/images/egret.png');
      border: 2px solid white;
      cursor: move; 
    }
    

    多个字段map数据循环

    //sass style
    //-------------------------------
    $headings: (h1: 2em, h2: 1.5em, h3: 1.2em);
    @each $header, $size in $headings {
      #{$header} {
        font-size: $size;
      }
    }
    
    //css style
    //-------------------------------
    h1 {
      font-size: 2em; 
    }
    h2 {
      font-size: 1.5em; 
    }
    h3 {
      font-size: 1.2em; 
    }
    

    此篇学习笔记参考该文档 。其实我写读书笔记的目的有两个:其一,留下学习的足迹;其二,留待之后需要的时候快速查看。在一边看文档一边写笔记的过程中我都是选择把我认为重要的部分给抄录进来,但是由于我参考的文档很多都是满满的干货,所以经常就变成了整篇整篇的copy...这让我觉得有些尴尬...

    相关文章

      网友评论

          本文标题:SASS学习笔记

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