Sass学习笔记及常用语法备忘
学习前端的同学肯定都知道Sass,经常看到Sass、Less什么的一大堆,一直不知道是啥,通过自己学习,终于搞懂了。不过比较乱,如果跟着每个都练一下肯定是能搞懂的
Sass简介
Sass是世界上最成熟、最稳定、最强大的专业级CSS扩展语言 CSS预处理工具 工作流程: 前置文件 -> 编辑解析 -> CSS文件 目前市面比较流行的有
sass、less、stylus
通过 .sass或.scss文件 + Sass工具 编辑以后可以生成.css文件
Sass可以帮助我们解决什么问题
- 嵌套规则
- 通过花括号的方式解决复杂的css父子样式嵌套问题
- 变量规则
- 通过变量将公共样式抽离,减少冗余css代码
- 条件逻辑
- 像高级语言一样编写逻辑性的css代码
Sass环境安装
- Sass是基于Ruby开发的,所以需要先安装Rubymac下自带Ruby无需在安装Ruby!
可以在终端中输入ruby -v来查看,如果没有安装的话,可以输入brew install ruby安装即可
-
在使用Ruby来安装Sass
-
可以在安装完毕ruby后,输入
gem sources -l查看一下源的地址。显示出https://rubygems.org/即可。 -
安装Sass 则直接使用
gem install sass安装,如果mac安装遇到权限问题,可以使用sudo gem install sass -
安装完毕后可以输入
sass -v查看是否安装成功
-
-
编译Sass-命令行
- 单文件转换命令
sass input.sass output.css - 单文件监听命令
sass --watch input.scss:output.css - 如果有很多sass文件的目录,也可以监听整个目录
sass --watch app/sass:public/stylesheets
- 单文件转换命令
-
在VSCode中,有很方便的插件可以直接使用,只需要安装
Live Sass Compiler插件即可,然后在编写的.sass文件中按F1或ctrl+p 唤起命令行- Watch Sass从状态栏单击以打开实时编译,然后Stop Watching Sass从状态栏单击以打开实时编译。
- 按F1或ctrl+shift+P键入Live Sass: Watch Sass以开始实时编译,或者按键入Live Sass: Stop Watching Sass以停止实时编译。
- 按F1或ctrl+shift+P键入一次Live Sass: Compile Sass - Without Watch Mode 以编译Sass或Scss。
-
还有就是可以使用
koala这个工具来使用中文官网是:http://koala-app.com/index-zh.html也都是很方便的。
Sass核心基础知识(SassScript)
- 基础知识
-
变量和引用 ```css $width:300px;//定义了了一个变量叫width,值是300px $height:300px; //定义了一个变量叫height,值是300px $color:#e03434; //定义了一个变量叫color,颜色是#e03434 $str:'hello.jpg'; //定义字符串、文件路径等 $strNoQout:abc; //定义不加引号的字符串
//相同的变量名,后面的会覆盖前面的 // 如果有一个!default 则表示默认值,会在后续的定义只要有重名就可以被其他的覆盖掉 $baseWidth:200px; $baseWidth:100px !default;
$class : '.div'; // 支持变量
// 下面的就等同于.div { width: 300px; height: 300px; }
{$class}{
width: $width; height: $height;}
.div{ width:$width; height:$height; background-color:$color; background-image: url('./img/'+$str); //可以直接拼接,等同于background-image: url("./img/hello.jpg"); } } .div2{ width:$baseWidth; height:$baseWidth; background-color:$color; background-image: url('./img/#{$strNoQout}'); //生成结果background-image: url("./img/abc"),这种插值变量的方式也是很直观并且方便的 }
+ 变量作用域
Sass的变量作用域和括号有关,内部定义的只能在内部使用,外部是不能使用的。类似局部变量
+ @import的用法
@import 本身css也是原生支持的。
> Sass 拓展了 @import 的功能,允许其导入 SCSS 或 Sass 文件。被导入的文件将合并编译到同一个 CSS 文件中,另外,被导入的文件中所包含的变量或者混合指令 (mixin) 都可以在导入的文件中使用。
Sass 在当前地址,或 Rack, Rails, Merb 的 Sass 文件地址寻找 Sass 文件,如果需要设定其他地址,可以用 :load_paths 选项,或者在命令行中输入 --load-path 命令。
通常,@import 寻找 Sass 文件并将其导入,但在以下情况下,@import 仅作为普通的 CSS 语句,不会导入任何 Sass 文件。
文件拓展名是 .css;
文件名以 http:// 开头;
文件名是 url();
@import 包含 media queries。
如果不在上述情况内,文件的拓展名是 .scss 或 .sass,则导入成功。没有指定拓展名,Sass 将会试着寻找文件名相同,拓展名为 .scss 或 .sass 的文件并将其导入。
```css
//比如我在.sass文件中写入如下样式的
@import 'layout.css';
//生成如下(直接被引入)
@import url(layout.css);
Sass官方推荐使用Partials的方法来引入
如果需要导入 SCSS 或者 Sass 文件,但又不希望将其编译为 CSS,只需要在文件名前添加下划线,这样会告诉 Sass 不要编译这些文件,但导入语句中却不需要添加下划线。
//先在同目录创建一个_base.scss文件里面写上如下代码
body{
padding:0;
margin:0
}
//在我们的sass文件用进行如下引用
@import 'base';
$width:300px;
$color:#ffe932;
.div1{
width: $width;
height: $width;
$widthInner:100px;
}
//后续会生成如下代码
body { margin: 0px; padding: 0px; }
.div1 { width: 300px; height: 300px; }
- 数据类型
/*number 数字类型*/
$width:300px;
$zoomValue:2; //数字类型
.div{
width:$width;
height: $width;
zoom:$zoomValue;
}
/*编辑结果*/
.div { width: 300px; height: 300px; zoom: 2; }
/*颜色类型*/
$color:red; //颜色类型
$colorHex:#ffe932; //颜色类型
.div{
color: $color;
background-color: $colorHex;
}
/*编辑结果*/
.div { color: red; background-color: #ffe932; }
/* 数组 */
$list:(100px,'string',300px,2,'red');
.div{
width: nth($list,1); //下标是从1开始的
}
/*编辑结果*/
.div { width: 100px; }
/* --------- */
$list:(100px,'string',300px,2,'red');
.div{
zoom:index($list,'string');//下标是从1开始的
}
/* 编译结果 */
.div { width: "red"; zoom: 2; }
/* map */
$map:(top:1px,left:2px,bottom:3px,right:4px);
.div{
top: map-get($map,top); //关键词map-get
}
/* 编译结果 */
.div { top: 1px; }
/* ---------- */
$map:(top:1px,left:2px,bottom:3px,right:4px);
.div{
/* 循环遍历 */
@each $key,$value in $map {
#{$key}:$value;
}
}
/* 编译结果 */
.div { top: 1px; left: 2px; bottom: 3px; right: 4px; }
- 变量运算
$num1:100px;
$num2:200px;
$width:$num1 + $num2;
.div{
width: $width;
}
/* 编译结果 */
.div { width: 300px; }
/* 除法运算 */
.div{
font: (10px/8);//只要有一个变量有单位即可
}
/* 编译结果 */
.div { font: 1.25px; }
/* ----- */
$num1:100px;
$num2:200px;
$width:$num1 + $num2;
.div{
font: $width/2;
}
/* 编译结果 */
.div { font: 150px; }
/* 乘法运算 */
.div{
font: (10px*8);//只要有一个变量有单位即可
}
/* 编译结果 */
.div { font: 80px; }
/* 混合运算 */
$num1:100px;
$num2:200px;
$width:$num1 + $num2;
.div{
font:(5px + 8px/2);
}
/* 编译结果 */
.div { font: 9px; } //先乘除在加减
/* 颜色运算 */
/* 注意,这种方法可以使用,但是官方不推荐使用,已经过期的用法 */
$color1:#010203;
$color2:#040506;
$color3:#a69e61;
.div{
color: $color1 + $color2;
}
/* 编译结果 */
.div { color: #050709; } // 直接进行数字相加
/* 颜色运算 */
/* 推荐方法 */
$color1:#010203;
$color2:#040506;
$color3:#a69e61;
.div{
color: mix($color2 ,$color2); //使用mix(混合色来使用)
}
/* 编译结果 */
.div { color: #040506; }
/* --------- */
$color1:#010203;
$color2:#040506;
$color3:#a69e61;
.div{
color: red($color1);
}
/* 编译结果 */
.div { color: 1; }//获取红色值
/* ---- */
同样也可以在sass中使用
color:red($color1);
color:green($color1);
color:blue($color1);
color:grb(red($color1),green($color1),blue($color1);
/* 字符串拼接 */
$str:'hello.jpeg';
.div{
background-image: url('img/'+$str);
}
/* 编译结果 */
.div { background-image: url("img/hello.jpeg"); }
- mixin(混合宏)
// 一般mixin
@mixin helloMixin {
display: inline-block;
font: {
size: 20px;
font-weight: 500;
};
color: red;
}
.div{
@include helloMixin;
}
/* 编译结果 */
.div { display: inline-block; font-size: 20px; font-font-weight: 500; color: red; }
/* 循环引用 */
@mixin helloMixin {
display: inline-block;
font: {
size: 20px;
font-weight: 500;
};
color: red;
}
@mixin helloMixin2 {
padding: 10px;
@include helloMixin;//同时引入helloMixin,可以相互嵌套,如果都存在统一变量的声明,则会都展示出来。
background-color: red;
}
.div{
@include helloMixin2;
}
/* 编译结果 */
.div { padding: 10px; display: inline-block; font-size: 20px; font-font-weight: 500; color: red; background-color: red; }
/* 传入参数的mixin */
@mixin sexy-boder ($color,$width){
border:{
color: $color;
width: $width;
};
}
.div{
@include sexy-boder(blue,2px ) //传入了2个参数
}
/* 编译结果 */
.div { border-color: blue; border-width: 2px; }
- 继承
.div{
border: 1px;
background-color: red;
}
.divext{
@extend .div; //继承div的属性
border-width: 3px;
}
/* 编译结果 */
.div, .divext { border: 1px; background-color: red; }
.divext { border-width: 3px; }
/* 关联属性继承 */
.div1{
border: 1px;
background-color: red;
}
.div1.other{
background-image: url('hello.jpeg');
}
.devext{
@extend .div1;
}
/* 编辑结果 */
.div1, .devext { border: 1px; background-color: red; }
.div1.other, .other.devext { background-image: url("hello.jpeg"); }
/* 链式继承 */
.div1{
border: 1px solid #000;
}
.div2{
@extend .div1;
color: red;
}
.div3{
@extend .div2; //同时继承了div1、div2的样式
color: #000;
}
/* 编译结果 */
.div1, .div2, .div3 { border: 1px solid #000; }
.div2, .div3 { color: red; }
.div3 { color: #000; }
/* 伪类继承 */
a:hover{
text-decoration: underline;
}
.hoverlink{
color: red;
@extend :hover;
}
/* 编译结果 */
a:hover, a.hoverlink { text-decoration: underline; }
.hoverlink { color: red; }
- 嵌套
$width:300px;
$color:#fff;
.div1{
width: $width;
height: $width;
background-color: $color;
// 子元素
.div-inner{
width: $width;
height: $width;
background-color: $color;
}
a{
color: red;
}
}
/* 编译结果 */
.div1 { width: 300px; height: 300px; background-color: #fff; }
.div1 .div-inner { width: 300px; height: 300px; background-color: #fff; }
.div1 a { color: red; }
- 条件控制
主要包括
@if、@for、@while、@each等条件控制语句
/* if语句 */
$type:'tony';
p{
@if $type=='bufy' {
color: red;
} @else if $type == 'tim'{
color: blue;
} @else if $type == 'tony'{
color: green;
} @else {
color: black;
}
}
/* 编译结果 */
p { color: green; }
/* ------------ */
@if $type == 'bufy'{
.div{
color:red;
}
} @else {
.div{
color: green;
}
}
/* 编译结果 */
.div { color: green; }
/* for语句 */
/* 使用through则遍历的是1、2、3 */
@for $i from 1 through 3{
.item#{$i}{
width:1px*$i;
}
}
/* 编译结果 */
.item1 { width: 1px; }
.item2 { width: 2px; }
.item3 { width: 3px; }
/* ------ */
/* 如果是用to ,则遍历的是 1、2 */
@for $i from 1 to 3{
.item#{$i}{
width:1px*$i;
}
}
/* 编译结果 */
.item1 { width: 1px; }
.item2 { width: 2px; }
/* ------------ */
/* 循环遍历数组 */
$list:(1,2,3,4,5);
@for $i from 1 through length($list){
.item#{$i}{
width: 1px*$i;
}
}
/* 编译结果 */
.item1 { width: 1px; }
.item2 { width: 2px; }
.item3 { width: 3px; }
.item4 { width: 4px; }
.item5 { width: 5px; }
/* while */
$i:6;
@while $i >0 {
.item#{$i}{
width: 1px * $i;
}
$i :$i - 2;
}
/* 编译结果 */
.item6 { width: 6px; }
.item4 { width: 4px; }
.item2 { width: 2px; }
/* each一般和map结合使用 */
$map:(
top:1px,
left:2px,
bottom:3px,
right:4px
);
.div{
@each $key, $value in $map {
#{$key}:$value;
}
}
/* 编译结果 */
.div { top: 1px; left: 2px; bottom: 3px; right: 4px; }
Sass 函数
- 数字型内置函数
percentage($number)转换成百分比round($number)执行标准舍入,也就是四舍五入为最接近的整数ceil($number)执行向上舍入,数值向上舍入为最接近的整数floor($number)执行向下舍入,数值向下舍入为最接近的整数abs($number)获取绝对值min($numbers...)获取最小值max($numbers...)获取最大值random()获得随机数,如果什么都不写,默认取0~1的随机数,如果写一个数,比如10,就是0~10的随机数
- 数组型内置函数
length($list)获取数组的长度nth($list,$n)获取指定下标的元素,下标从1开始set-nth($list,$n,$value)替换指定下标的元素join($list1,$list2)拼接数组append($list1,$val,[$separator])从数组尾部添加元素index($list,$value)返回指定元素在数组中的位置
- 字符串内置函数
unquote($string)去除引号quote($string)添加引号str-length($string)获取字符串长度str-insert($string,$insert,$index)在指定位置插入字符str-index($string,$substring)返回指定字符在字符串的位置to-upper-case($string)转换成大写to-lower-case($string)转换成小写
-
map内置函数
map-get($map,$key)根据给定的key值,返回map中相关的值map-merge($map1,$map2)将两个map合并成一个新的mapmap-remove($map,$key)从map中删除一个key,返回一个新mapmap-keys($map)返回map中所有的keymap-values($map)返回map中所有的valuemap-has-key($map,$key)根据给定的key值判断map是否有对应的value值,如果有返回true,否则返回falsekeywords($args)返回一个函数的参数,这个参数可以动态的设置key和value
-
自定义函数
$rem1:100px;
@function px2rem($px){
$rem:37.5px;
@return ($px/$rem) + rem;
}
.div{
width: px2rem($rem1);
}
/* 编译结果 */
.div { width: 2.66667rem; }