侧边栏

初识SCSS

发布于 | 分类于 前端/CSS

上一个项目是自己决定用Less来写css的,结果遇到了一个很纠结的问题,比如为了规范代码采用的是“一行一对属性:属性值”的格式,这就造成了整个项目有近几千行Less源码,后面修改的时候十分不方便,如果拆分成多个文件,引入文件路径又十分麻烦。

这时候同事就推荐了Sass,就这样入了另外一个坑。

在简单地查看了Sass语法之后,却生出了一种十分蛋疼的感觉,Sass采用了类似于python那样严格的缩进,甚至更为苛刻:

  • 没有分号与大括号,采用严格的缩进;
  • 使用两个空格的缩进来表示代码的嵌套;
  • 也可以使用四个空格缩进,整个文件需要统一;
  • 选择器的属性值与属性值之间需要一个空格;

之后为了减小学习成本,于是我就转向了scss。

scss貌似是在原生Sass的基础上转而采用类似与CSS的语法,使用大括号代替了缩进,与Less相似但是具有更多的功能,大致摸索了一下,于是整理了下面的一点笔记。

变量声明

scss
$base-color: #000;
  • 与Less中使用@来声明变量不一样,scss使用"$"符号来标识变量,因为"$"符号在CSS中并没有其他用途;
  • 变量不区分"-"和"_",采用这两种分隔符命名的变量会被认为是同一个变量。

计算

类似与Less,scss的属性值也是可以自动进行计算的,包括长宽,字体等,此外颜色还可以使用颜色函数进行调整。

选择器嵌套

scss
.wrap {
    background: #ccc;
    h1 {
        color: red;
        a {
            text-decoration: none;
        }
    }
}
  • 与Less相同的嵌套规则,但是为了浏览器的解析效率,千万不要滥用嵌套;
  • 多类选择器使用"&"符号,群组选择器也会被正确解析;
  • 属性嵌套与选择器嵌套类似。

拆分并导入scss文件

可以将其他的scss文件引入到当前scss文件,即可以达到分模块编写css样式,然后统一编译为一个css文件中,甚至可以在多个项目中使用同个样式。 。 支持拆分文件是我使用scss最主要的原因,这个功能能够十分清楚明白地组织项目css文件结构。大赞!

scss
@import "styleGroup/_wrap.scss";
  • 可以省略后缀名".scss"或者".Sass";
  • 专门为import命令编写的scss文件,,可以在命名时以下划线开头,这样就不会在编译时生成单独的css文件;
  • 由于默认后定义的变量会覆盖先前定义的变量,因此可以在定义变量的时候使用!default,如果这个变量被声明赋值了,那就用它声明的值,否则就用这个默认值。

混合器

scss
@mixin border-default($width,$style,$color,$r) {
    border: $width $style $color;
    border-radius: $r;
}
.wrap {
    @include border-default(1px,solid,#000,5px);
}
  • 如果是属性值需要重用则可以使用变量,如果是一大段样式需要重用则可以使用混合;
  • 使用@minxin定义混合器,使用@include引用混合器
  • 混合器的命名应当充分表现该样式的作用,避免滥用混合器造成样式表的臃肿
  • 可以通过为混合器传参来建立不同的样式段代码
  • 可以通过$name : $value的形式来传参,这样可以不用记住参数的顺序
  • 可以为混合器参数设置默认值,即在设置参数时使用$name : $defaultValue形式

继承

选择器继承指的是一个选择器可以继承另一个选择器的所有样式

scss
@extends .wrap
  • 与混合器相比,继承生成的css代码相对更小
  • 继承存在样式重叠的问题,浏览器根据选择器权重值进行判断
  • 避免继承来自于后代选择器的样式,这样应用css规则的选择器情形无法判断

最后

刚开始学习Less的时候心里的那个关于选择器嵌套的疑惑算是解开了:跟使用的预编译器无关,选择器嵌套是完全由我们自己决定的,至于编译出来的N层嵌套,完全取决于我们在预编译的时候是否真正思考了嵌套的作用。

那么问题来了:到底该用什么姿势来书写正确的CSS代码呢?

你要请我喝一杯奶茶?

版权声明:自由转载-非商用-保持署名和原文链接。

本站文章均为本人原创,参考文章我都会在文中进行声明,也请您转载时附上署名。