scss语法使用

179 阅读3分钟

变量声明

只需要记住一句话sass中变量的声明离不开美刀$

声明样例:
    $baseColor:red
    $baseHeight:10px
    div {
        color:$baseColor;
        height:$baseHeight
    }
数据类型

scss 包含以下几种数据类型

  • 数字 : 2 | 2px
  • 字符串 : bar "bar" 'bar' 单引号 双引号 无引号三种
  • 布尔 : true | false
  • 空值 : null
  • 数组(列表):用空格或者逗号隔开 1em 2em,3em
  • 颜色:blue | #fff | rgba(255,255,255,1) |rgb(255,255,255) | hsl(120, 100%, 50%) | hsl(120, 100%, 50%, 0.3);
  • maps :(key:value,key1:value1) | (key:(key1:value1))
数字类型

数字在css中应用较为广泛,例如大小、宽高、内外边距等。scss中的数字类型了可以进行一些加减乘除运算

例子
  $width:100px;  // 定义变量$width,值为100px
 //在选择器中使用
 .box{
     padding:$width / 10;
     width:$width + 20px;
     height:$width * 3;
     margin-top:$width - 90px;
    
 }
//编译成css代码
.box{
     padding:10px;
     width:120px;
     height:300px;
     margin-top:10px;
}

注意:在进行加减乘除运算的时候要注意单位兼容问题,例如 *12em + 12px* 会报单位兼容错误。

加减法
   $num:10px;
   $num1:10px;
   .box {
       width:$num + $num1;
       height:$num * 2
   }

注意:不同单位会报错

乘法
$num:10px
.box {
    width:$num * 10
}

注意:10px * 10px 会报错

除法
$num:10px;
$num1:10px
.box {
    width:$num / $num1;
    height:$num / 10
}
// 编译成css
.box {
    width:1;
    height:1px
}

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

数字函数

引入:@use "sass:math";

  • percentage():将不带单位的数字转换成百分比形式
    percentage(.2) ----->  20%
    percentage(10px / 100px) ----> 10%
  • round() 四舍五入 和js 中的用法一样
    round(2.3em) ----> 2em
    round(2.6%) ------>3%
  • ceil() 向上取整
    ceil(2.3%) ---->3%
  • floor() 向下取整
    floor(2.3%) ------> 2%
  • abs() 绝对值
    abs(-2.3%) --->2.3%
  • min()/max() 取最小最大值,有不同单位会报错 css中也有这两个方法,处理响应式很好用,可以不同单位
    min(10px,100px) ----->10px
    max(10px,100px) ----->100px
  • random() 随机数
  random() ----->0.023232
字符串
    $custor:resize
    .box {
        custor:$custor
    }
// 编译成css
.box {
    custor:resize
}
字符串运算

通过+连接

 $custor:re
    .box {
        custor:$custor + size
    }
// 编译成css
.box {
    custor:resize
}

注意: 如果有引号的字符串和无引号的字符串拼接(有引号+无引号) 结果:引号字符串
如果无引号的字符串和有引号的字符串拼接(无引号+有引号) 结果:无引号字符串

字符串函数

引入:@use "sass:string";

  • unquote() 删除字符串首尾的引号(单引号或双引号),中间的无法删除,如果字符串没有则返回它自身
  • quote() 为字符串添加引号,统一变成双引号
  • To-upper-case() 转大写
  • To-lower-case() 转小写
  • unique-id() 生成唯一的id
  • index($string,$substring) 返回指定字符的位置
  • slice($string,$start,$end) 字符串截取
  • insret($string,$insert,index) 指定位置插入字符串
  • length() 获取字符串长度
列表
 $list:10px 20px 30px
 @each $key in $list {
     .item-#{$key} {
         width:$key
     }
 }
    // 编译成css
    .item-10px
         width:10px
     }
     .item-20px
         width:20px
     }
     .item-30px
         width:30px
     }
列表函数

引入:@use "sass:list";

  • length() 获取列表的长度, 接收的参数用空格分隔,不能用逗号
    $list:2px 2em 3vh
    length($list)-->   3
  • nth($list,$index) 获取指定位置的值
  • set-nth($list,$index,$val) 设置指定位置的值
  • append($list,$val,[$split]) 追加元素 [$split]分隔符(space-空格、comma-逗号、slash-斜杠
颜色
    $color:#ccc
    .box {
        color:$color
    }
颜色运算
    $color1:pink;
    $color2:blue;
    .box {
        color:$color1 + $color2
    }
    // 编译成css
    .box {
        color:#ffc0ff
    }
颜色函数

引入:@use "sass:color";

  • grayscale($color):设置与颜色具有相同亮度的灰度
    grayscale(#7fffd4) -----> #c6c6c6
  • complement($color): 设置颜色的互补色
    complement(#7fffd4)------> #ff7faa
  • invert($color,$weight) 设置颜色的反色或者负色, $weight 0%-100% 默认100%
    invert(white) ---- > black
  • mix($color1, $color2, $weight) 将两个颜色混合 weight越大使用weight 越大使用color1颜色越多 默认50%
  • adjust-hue($color, $degrees) 以 -360 度到 360 度的度数调整颜色的色调
  • lighten($color, $amount) 使用介于 0% 和 100% 之间的量创建更浅的颜色。$amount 参数按百分比提高 HSL 亮度。
  • darken($color, $amount)和lighten相反
  • saturate($color, $amount) 使用介于 0% 和 100% 之间的量创建更饱和的颜色。$amount 参数按百分比提高 HSL 饱和度。
  • desaturate($color, $amount) 和saturate相反
  • opacify($color, $amount)使用介于 0 和 1 之间的数量创建更不透明的颜色 $amount 参数按照其值提高 Alpha 通道。
  • fade-in($color, $amount)和opacify功能相同 $amount相反
  • transparentize($color,$mount) 创建更透明颜色 $amount 参数按照其值降低 Alpha 通道。
  • fade-out($color, $amount)和transparentize功能相同 $amount相反
maps

表示映射类型,常以键值对(key/value)的形式出现,整个映射必须用小括号()括起来,值与值用逗号分隔。 在 maps 中,一个给定的 key 只能有一个相关的 value,但一个给定的 value 可以被映射到许多不同的 key上。 value 值可以是任何数据类型,包括 maps

 $colorMap:($color1:red,$color2:green)
 .box {
     color:map-get($colorMap,color1)
 }
   // 编译成css
   . box {
       color:red
   }
map函数

引入:@use "sass:map";

  • keys($map) 获取所有的key的列表
  • values($map) 获取所有的value的列表
  • has-key($map,$key,[$keys...]是否包含某个值,支持深层key
  • get($map,$key,[$key...] 获取对应的key的value值 ,支持深层key
  • set($map,$key,[$key...],$value) 设置对应的key的value,支持深层key
  • remove($map,$key...) 移除多个key
  • deep-remove($map,$key,$keys...)移除深层的key
  • merge($map1,$map2) 浅层次合并,属性相同 取后者
  • deep-merge($map1,$map2) 深层次合并
    tips:可能会有人不理解支持深层key什么意思,接下来解释一下
    例子:
    // 定义一个深层的map ,嵌套三层
    $map:($key1:value1,$key2:($key3:($key4:$value4)))
    has-key($map,$key2,$key3)  获取map下的key2的values下的key3 对应的value值  
Introspection函数
  • type-of($value) 返回类型 number、string 、null、bool、color、list、map
  • unit($value) 返回一个值的单位
  • unitless($value) 判断是否有单位
  • comparable($value1,$value2) 判断两个值是否可以进行加减合并操作
Miscellaneous函数 三元条件函数

@if($true,$a,$b)true条件成立返回true条件成立返回a, 否则返回$b

插值 #{}
   $a:10px
   #{$a} ---->10px
@if @else-if @else
$a: 2;
div {
  @if $a == 0 {
    color: red;
  }
  @else if $a == 1 {
      color:green
    }
    @else {
    color:blue
}
// 编译成css  
    div {
        color:blue
    }
@for

@for $i from <start> to <end>
@for $i from <start> through <end>
区别:through 包含end to 不包含

    @for $i from 1 to  3 {
      .item-#{$i} {
        width: 2px * $i
      }
    }
 // 编译成css
 .item-1 {
  width: 2px;
    }
.item-2 {
  width: 4px;
}

@while
  $number: 3; 
  @while $number > 0 { 
      .while-#{$number} { 
          width: $number * 10px; 
      } 
      $number: $number - 1; 
  }
// 编译成css 
.while-3 {
  width: 30px;
}
.while-2 {
  width: 20px;
}
.while-1 {
  width: 10px;
}
@each
$list:10px 20px;
@each $key in $list {
    #div-#{$key} {
        width:$key
    }
}
// 编译成css
#div-10px {
  width: 10px;
}
#div-20px {
  width: 20px;
}

@mixin/@include
    // 不带参数
    @mixin bgColor {
        background-color:red
    }
    // 调用
    .box {
        @include bgColor
    }
    
    // 带参数
    @mixin widthAndHeight($width:50px,$height:100px) {
        width:$width;
        height:$height
    }
    // 调用
    
    div {
       @include widthAndHeight(50px,200px)
    }

    // 编译成css
    .box {
        background-color:red
    }
    div {
        width:50px;
        height:200px
    }
@extend 继承

用来继承已经存在的类样式块

   .btn {
       width:10px
       
       
   // 使用继承
   .box {
       @extend .btn
   }
    // 编译成css
    .box {
        width:10px
    }
%placeholder 占位符

可以取代css 中基类造成代码冗余问题 ,因为%placeholder声明的代码 如果不被@extend 调用 不会产生任何代码

    %bgColor {
        background-color:red
    }
    .box{
        @extend %bgColor
    }
@minxin/@include .class/@extend %placeholedr/@extend 比较

1、如果涉及到变量使用@mixin/@include 2、如果不涉及到变量,建议使用继承,构建一个基类的css 文件

image.png