首发于 前端

SCSS之基础全解

SCSS是一门很好用的类CSS,在平时的工作中几乎都不用CSS,而是使用类CSS语言,比如:SCSS,LESS,Stylus,所以学会一门类CSS语言是必须的.所以我在这里介绍一下SCSS的用法,我之所以选择SCSS是因为它看起来比较圆润(嘿嘿~~~)

  1. 嵌套选择器
  2. 变量
  3. mixin
  4. placeholder

1.嵌套选择器

SCSS的入门就是使用嵌套选择器,SCSS 允许将一套 CSS 样式嵌套进另一套样式中,内层的样式将它外层的选择器作为父选择器.

例如:

HTML

 <body>
    <p>你好</p>
 </body>

Scss

body {
    color: red;
}

上面的代码中HTML中body下面只有一个p标签,我们通过Scss的标签嵌套来为p标签添加样式,这样能够选择页面中的p标签并为它添加样式

编译后的代码为:


嵌套功能避免了重复输入父选择器,而且令复杂的 CSS 结构更易于管理,还可以有更加复杂的嵌套

#main {
  width: 97%;
  p, div {
    font-size: 2em;
    a { font-weight: bold; }
  pre { font-size: 3em; }
}

编译后为:

#main {
  width: 97%; }
  #main p, #main div {
    font-size: 2em; }
    #main p a, #main div a {
      font-weight: bold; }
  #main pre {
    font-size: 3em; }

有时候嵌套需要使用到父元素的选择器(添加hover样式,或者伪元素的时候),父元素选择器可以使用&来代替

body {
    color: red;
    &:hover {
      color: green;
}

编译后为

body p {
  color: red;
body p:hover {
  color: green;
}

属性可是可以嵌套的,有些 CSS 属性遵循相同的命名空间 (namespace),比如 font-family, font-size, font-weight 都以 font 作为属性的命名空间。为了便于管理这样的属性,同时也为了避免了重复输入,Scss 允许将属性嵌套在命名空间中,例如:

body {
    font: {
      size: 34px;
      family: "Courier";
      weight: bold;

编译后为:

body p {
  font-size: 34px;
  font-family: "Courier";
  font-weight: bold;
}


2.变量

scss最普遍的就是声明变量,然后在其他的文档中引入,这样方便修改整体的样式,声明变量的方式就是使用$来声明变量.

$red: red;
$g: green;
body {
    color: $red;
    &:hover {
      color: $g;
}

上面的代码中声明了两个变量 $red $g ,分别是红色和绿色,然后在赋值的时候跟css的属性一样赋值

编译后为:

body p {
  color: red;
body p:hover {
  color: green;

变量的类型有六种:

  • 数字, 1, 2, 13, 10px
  • 字符串,有引号字符串与无引号字符串, "foo", 'bar', baz
  • 颜色, blue, #04a3f9, rgba(255,0,0,0.5)
  • 布尔型, true, false
  • 空值, null
  • 数组 (list),用空格或逗号作分隔符, 1.5em 1em 0 2em, Helvetica, Arial, sans-serif
  • maps, 相当于 JavaScript 的 object, (key1: value1, key2: value2)

声明的变量可是有作用域的,但是可以在声明的变量后面加上 !global 来把它变成全局的变量

body {
    $red: #f60 !global;
    font: {
      size: 34px;
      family: "Courier";
      weight: bold;
  div {
    color: $red;

在上面的代码中,理论上在p标签里面声明的变量 $red 在div里面是无法使用的,但是在设置了 !global 之后就可以访问了,但是注意,只有在声明的下面才能访问到,如果在 $red :#f60 !global 之前使用 $red 则会报错.


SCSS中还可以使用变量的计算,其实这个在CSS中也是支持的 width:cale(200px / 2)
可以使用cale关键字来计算,而在SCSS的计算则不用使用cale

width: 100px + 100px + 100px; //加法
width: 100px - 100px + 100px; //减法
width: 100px * 100 //乘法,注scss的乘法和除法是带单位的
width: (100px/3)  //注意这里需要带括号,如果不带括号会当场分割数子
width: $width / 3 //也可以不带括号,但是里面计算的一定要有声明的变量,因为这个语法css不认识,那么就会被解析成SCSS
width: 100 % 3px //SCSS也支持取模运算

大家注意看,我上面的注释是单行注释,而传统的CSS注释都是单行注释 /**/ ,这是因为SCSS支持了单行注释.

不仅数子可以相加,颜色也可以

$red:#ff0000;
   color : $red + #888; //#ff8888
div{
  color :$red + #111;  //#ff1111
}

颜色相加其实是颜色的十六进制相加,而超过的部分 都是f

关于颜色的相关运算其实有很多,将近三十种,我这里就不一一说明了,给个链接

关于变量还有字符串插值跟js中的 ${variable} 差不多,SCSS使用 #{variable} ,用的不多

body {
    $content: "---";
    &:before {
      content: "[#{$content}";
    &:after {
      content: "#{$content}]";

结果

3.mixin

定义指令混入 @mixin 可以将定义的指令混入到一个元素的样式里面去,混入的方式是使用 @include 来混入

@mixin mix {
  border: 1px solid red;
body {
    @include mix;
    color: red;
    &:hover {
      color: green;

其中mixin还可以定义为函数,还可以传递参数

@mixin mix($width) {
  border: $width solid red;
body {
    @include mix(2px);
    color: red;
    &:hover {
      color: green;
      @include mix(6px);

编译后:

body p {
  border: 2px solid red;
  color: red;
body p:hover {
  color: green;
  border: 6px solid red;
}

从上面的代码可以看出通过 @mixin 定义的指令,通过 @include 引入后定义的指令会混入到引入的元素中,相当于把mixin中的代码复制了一份写入了

4.placeholder

placeholder跟mixin差不多,但是其中的实现原理却不相同,还是相同的代码,我们使用placeholder来定义一下

%mix {
  border: 1px solid red;
body {
    @extend %mix;
    color: red;
    &:hover {
      color: green;
      @extend %mix;

我们通过%来定义,通过extend来引入,这看起来跟mixin的作用相同,甚至还不能像mixin一样写成函数,但是它的编译后的代码却跟mixin不同

编译后:

body p:hover, body p {
  border: 1px solid red;