Sass基础
Sass中文网(https://www.sass.hk/docs/)
一、Sass基础
1、Sass和Scss有什么区别?
1)文件扩展名不同----.sass和.scss
2)语法书写方式不同----Sass以严格的缩进式语法规则来书写,不带大括号和分号
----Scss的语法书写和css的语法书写方式非常类似
例:
1 $font-stack: Helvetica, sans-serif //定义变量
2 $primary-color: #333 //定义变量
3
4 //Sass
5 body
6 font: 100% $font-stack
7 color: $primary-color //sass
8
9 //Scss
10 body{
11 font: 100% $font-stack;
12 color: $primary-color;
13 }
2、Sass安装
1)到 Ruby 的官网(http://rubyinstaller.org/downloads)下载对应需要的 Ruby 版本。
2)Ruby 安装完成后,在开始菜单中找到新安装的 Ruby,并启动 Ruby 的 Command 控制面板。
3)打开电脑的命令终端,输入下面的命令:gem install sass
4)检查sass是否安装成功:sass -v
3、Sass更新----gem update sass
4、Sass卸载----gem uninstall sass
5、Sass编译:
1)命令编译{
单文件编译:
sass <要编译的Sass文件路径>/style.scss:<要输出CSS文件路径>/style.css
多文件编译:
sass sass/:css/
watch功能:
sass --watch <要编译的Sass文件路径>/style.scss:<要输出CSS文件路径>/style.css
}
2)GUI编译----Koala等编译工具
3)如果使用sublime,安装sass Build 插件后,使用快捷键 Ctrl + B 即可编译,编译后的css文件存放在当前目录
4)sass常见的编译错误:
字符编译----sass不支持GBK编码格式,创建时就应设置为utf-8
文件路径----不能有中文字符
6、Sass不同样式风格的输出方法
1)嵌套输出方式 nested
编译时带上参数" --style nested";例:sass --watch test.scss:test.css --style nested
编译结果:
1 nav ul {
2 margin: 0;
3 padding: 0;
4 list-style: none; }
2)展开输出方式 expanded
在编译的时候带上参数“ --style expanded”;例:sass --watch test.scss:test.css --style expanded
这个输出的 CSS 样式风格和 nested 类似,只是大括号在另起一行,同样上面的代码,编译出来:
1 nav ul {
2 margin: 0;
3 padding: 0;
4 list-style: none;
5 }
3)紧凑输出方式 compact
在编译的时候带上参数“ --style compact”;例:sass --watch test.scss:test.css --style compact
编译后的代码如下:
1 nav ul { margin: 0; padding: 0; list-style: none; }
2 nav li { display: inline-block; }
4)压缩输出方式 compressed
在编译的时候带上参数“ --style compressed”;例:sass --watch test.scss:test.css --style compressed
压缩输出方式会去掉标准的 Sass 和 CSS 注释及空格。也就是压缩好的 CSS 代码样式风格:
1 nav ul{margin:0;padding:0;list-style:none}nav li{display:inline-block}
7、Sass调试
基础:css浏览器调试
1)F12打开Chrome浏览器控制面板
2)切换至Sources选项
3)右侧Sources空白处右键单击,选择 Add folder to workspace添加本地目录到工作区
4)选择项目目录,单击确认
5)在新添加的本地文件上单击鼠标右键,选择Map to network resources映射到服务器文件
或者单击服务器上的文件,选择Map to file system resources映射到本地文件
6)建立映射后,在浏览器中调试修改.css/.html等文件保存后即可修改本地文件;Elements面板调试 会自动保存到本地
8、Sass声明变量
$width:300px;
$----变量声明符
width----变量名
300px----变量值
如果值后面加上!default则表示默认值 含义是:如果这个变量被声明赋值了,那就用它声明的值,否则就用这个默认值。
9、Sass变量的调用
调用 变量声明符+变量名
10、Sass局部变量和全局变量
在选择器、函数、混合宏...的外面定义的变量为全局变量
局部变量在其作用域内会覆盖重名的全局变量
!global----将局部变量转换为全局变量
11、Sass嵌套
1)选择器嵌套
将一套css样式嵌套进另一套样式中,内层样式将它外层的选择器作为父选择器
例:
1 main{
2 color:red;
3 .greenText{
4 color:green;
5 }
6 }
---->编译结果:
1 main {
2 color: red; }
3 main .greenText {
4 color: green; }
父选择器 & :代表嵌套规则外层的父选择器
例:
1 main{
2 color:red;
3 .greenText{
4 color:green;
5 & p{
6 color:yellow;
7 }
8 }
9 }
---->编译结果:
1 main {
2 color: red; }
3 main .greenText {
4 color: green; }
5 main .greenText p{
6 color:yellow; }
2)属性嵌套
css中有一些属性前缀相同,只是后缀不一样,比如border-top和border-left等,
这些属性都遵循相同的命名空间(border),可将属性嵌套在相同的命名空间中。
例:
1 .box{
2 border:{
3 top:1px solid red;
4 left:1px solid green;
5 }
6 }
---->编译结果:
1 .box {
2 border-top:1px solid red;
3 border-left:1px solid green; }
命名空间也可以包含自己的属性值。
例:
1 .text{
2 font:20px/24px {
3 style:normal;
4 weight:bold;
5 }
6 }
---->编译结果:
1 .text{
2 font:20px/24px;
3 font-style:normal;
4 font-weight:bold; }
3)伪类嵌套
其本质还是选择器嵌套,借助父选择器 & ($:after{})
12、Sass混合宏
1)声明混合宏 @mixin 混合宏的名称{复用的样式代码}
Ⅰ不带参数混合宏
例:
1 @mixin border-radius{
2 -webkit-border-radius:5px;
3 border-radius:5px;
4 }
Ⅱ带参数混合宏
例:
1 @mixin border-radius($radius:5px){
2 -webkit-border-radius:$radius;
3 border-radius:$radius;
4 }
Ⅲ复杂的混合宏(逻辑运算)
例:
1 //$shadow...表示可以接收多个参数
2 @mixin box-shadow($shadow...) {
3 @if length($shadow) >= 1 {
4 @include prefixer(box-shadow, $shadow);
5 } @else{
6 $shadow:0 0 4px rgba(0,0,0,.3);
7 @include prefixer(box-shadow, $shadow);
8 }
9 }
2)调用混合宏 @include 混合宏名称;
例:
1 .box{
2 @include border-radius;
3 }
---->编译结果:
1 .box{
2 -webkit-border-radius:5px;
3 border-radius:5px;}
3)混合宏的参数
Ⅰ传一个不带值的参数(调用时传参)
Ⅱ传一个带值的参数(调用且不传参时该值作为参数的默认值)
Ⅲ传多个参数
13、Sass扩展/继承 @extend
继承已存在的类样式块,从而实现代码的继承,减少混合宏的冗余问题
@extend可以继承类样式块中所有样式代码,而且编译出来的css会将选择器合并到一起,形成组合选择器。
例:
1 .btn {
2 border: 1px solid #ccc;
3 padding: 6px 10px;
4 font-size: 14px;
5 }
6 .btn-primary {
7 background-color: #f36;
8 color: #fff;
9 @extend .btn;
10 }
---->编译结果:
1 .btn, .btn-primary {
2 border: 1px solid #ccc;
3 padding: 6px 10px;
4 font-size: 14px; }
5
6 .btn-primary {
7 background-color: #f36;
8 color: #fff; }
14、Sass占位符 %placeholder
取代以前css中的基类造成的代码冗余的情形。
%placeholder声明的代码,如果不被@extend调用的话,不会产生任何代码。
例:
1 %mt{
2 margin:{
3 top: 5px;
4 left:10px
5 }
6 }
7 %pt{
8 padding:{
9 top:10px;
10 left:5px;
11 bottom:5px;
12 right:10px;
13 }
14 }
15 .btn,.btn1{
16 @extend %mt;
17 @extend %pt;
18 }
---->编译结果:
1 .btn, .btn1 {
2 margin-top: 5px;
3 margin-left: 10px; }
4
5 .btn, .btn1 {
6 padding-top: 10px;
7 padding-left: 5px;
8 padding-bottom: 5px;
9 padding-right: 10px; }
15、Sass插值 #{}
如果变量需要嵌套在字符串中,就必须写在#{}中
例:
1 $side:left;
2 .box{
3 border-#{$side}-radius:5px;
4 }
---->编译结果:
1 .box{
2 border-left-radius:5px; }
16、Sass注释
1) /**/ 注释内容会显示在编译出来的css中
2) // 注释内容会不显示在编译出来的css中
17、Sass数据类型
1)数字:如1、2、3、10px;
2)字符串:如-有引号字符串"String"、'String'或无引号字符串String;
3)颜色:如red、#0091db、rgba(0,0,0,.3);
4)布尔型:true、false;
5)空值:null;
6)值列表:用空格或逗号分开,如1.5em 1em 0 2em、Helvetica, Arial, sans-serif
18、Sass运算
二、Sass的控制命令
1、 @if
@if指令是一个SassScript,它可以根据条件来处理样式块。还可以配合@else if和@else一起使用。
例:
1 @mixin blockOrNone($boolean:true){
2 @if($boolean){
3 display:block;
4 }@else{
5 displaynone;
6 }
7 }
8 .box-block{
9 @include blockOrNone;
10 }
11 .box-none{
12 @include blockOrNone(false);
13 }
---->编译结果:
1 .box-block{
2 display:block; }
3 .box-none{
4 display:none; }
2、 @for循环
Sass的@for循环中有两种方式:
@for $i from <start> through <end>
@for $i from <start> to <end>
$i----表示变量
start----表示起始值
end----表示结束值
through表示 包括 end这个数
to表示 不包括 end这个数
例:@for $i from <start> through <end>
1 @for $i from 1 through 3{
2 .item-#{$i}{width:2em * $i;}
3 }
---->编译结果:
1 .item-1{
2 width:2em; }
3 .item-2{
4 width:4em; }
5 .item-3{
6 width:6em; }
例:@for $i from <start> to <end>
1 @for $i from 1 to 3{
2 .item-#{$i}{width:2em * $i;}
3 }
--->编译结果:
1 .item-1{
2 width:2em; }
3 .item-2{
4 width:4em; }
3、@while循环
@while指令也需要SassScript表达式(像其它指令一样),并且会生成不同的样式块,直到表达式值为false时停止循环。
例:
1 $types:4;
2 $type-width:20px;
3
4 @while $types > 0 {
5 .while-#{types}{
6 width:$type-width + $types ;
7 }
8 $types:$types -1 ;
9 }
---->编译结果:
1 .while-4{
2 width:24px; }
3 .while-3{
4 width:23px; }
5 .while-2{
6 width:22px; }
7 .while-1{
8 width:21px; }
4、@each循环
@each循环就是去遍历一个列表,然后从列表中去除对应的值。
@each $var in <list>
$var----变量名
<list>----SassScript表达式
例:
1 $list:adam john wynn mason kuroir //定义列表
2
3 @mixin author-iamges{
4 @each $author in $list{
5 .photo-#{$author}{
6 background:url("/images/avatars/#{$author}.png") no-repeat;
7 }
8 }
9 }
10 .box{
11 @include author-iamges;
12 }
---->编译结果:
1 .box .phooto-adam{
2 background:url("/images/avatars/adam.png") no-repeat; }
3 .box .phooto-john{
4 background:url("/images/avatars/john.png") no-repeat; }
5 .box .phooto-wynn{
6 background:url("/images/avatars/wynn.png") no-repeat; }
7 .box .phooto-mason{
8 background:url("/images/avatars/mason.png") no-repeat; }
9 .box .phooto-kuroir{
10 background:url("/images/avatars/kuroir.png") no-repeat; }
三、Sass的函数
Sass函数主要包括:
字符串函数
数字函数
列表函数
颜色函数
三元函数
Introspection函数
自定义函数
1、字符串函数
unquote()函数----unquote($String)删除字符串中的引号(只能删除字符串最前和最后的引号);
quote()函数----quote($String)给字符串添加双引号。如果字符串,自身带有引号会统一换成双引号 ""
字符串中间有单引号或者空格时,需要用单引号或双引号括起或去掉空格,否则编译的时候将会报错。
同时 quote() 碰到特殊符号,比如: !、?、> 等,除中折号 - 和 下划线_ 都需要使用双引号括起,否则编译器在进行编译的时候同样会报错。
To-upper-case()函数----To-upper-case($string)将字符串中的小写字母转换成大写字母。
To-lower-case()函数----Tolower-case($STRING)将字符串中的大写字母转换为小写字母。
2、数字函数
precentage()函数----precentage($num)将一个不带单位的数值转换成百分比形式
>> precentage(.2) 20%
>> precentage(2px / 10px) 20%
round()函数----round($num)四舍五入到整数
ceil()函数----ceil($num)向上取整
floor()函数----floor($num)向下取整
abs()函数----abs($num)绝对值
min()函数、max()函数----min($num...)、max($num...)返回多个参数中的最小、最大值
random()函数----random()获取一个随机数
3、列表函数
length()函数----length($list)返回一个列表中有几个值。注:列表参数之间用空格隔开。
nth()函数----nth($list,$n)返回列表$list中第$n个值。 >> nth(10px 20px 30px,1)---->10px
join()函数----join($list1,list2,$separator)将两个列表合并成一个列表。
注:只能合并另个列表。
$separator = comma(逗号) || space(空格)
append()函数----append($list,$obj,$separator)将某个值($obj)插入到列表尾部
zip()函数----zip($list...)将多个列表值转换成一个多维列表
>> zip(1px 2px 3px,solid solid solid,green blue red)
---->((1px solid green),(2px solid blue),(3px solid red))
index()函数----index($list,$data)返回某个值($data)在列表中的索引值(从1开始),没有找到则返回false
4、Introspection函数
type-of()函数----type-of($value)返回一个值的类型
number
string
bool
color
unit()函数----unit($num)返回一个值的单位
unitless()函数----unitless($num)判断一个值是否带有单位
comparable()函数----comparable($num1,$num2)判断两个值是否可以做加、减和合并
5、三元函数
if($condition,$if-true,$if-false)
当$condition条件成立时,返回值为$if-true,否则返回$if-false。
6、Map
Sass的map常常被称为数据地图或数组,总以key:value的形式出现
声明map:
$map : (
$key1 : $value1,
$key2 : $value2,
$key3 : $value3)
map-get()函数----map-get($map,$key)根据给定的key,返回map中对应的值。如不存在则返回null。
map-merge()函数----map-merge($map1,$map2)将两个map合并成一个新的map
map-remove()函数----map-remove($map,$key)从map中删除一个key,返回一个新的map
map-keys()函数----map-keys($map)返回map中所有的key
map-values()函数----map-values($map)返回map中所有的value
map-has-key()函数----map-has-key($map,$key)根据给定的 key 值判断 map 是否有对应的 value 值,如果有返回 true,否则返回 false。
keywords()函数----keywords($args)返回一个函数的参数,这个参数可以动态的设置 key 和 value。
7、颜色函数
RGB颜色函数
rgb($red,$green,$blue)根据红、绿、蓝三个值创建一个十六进制颜色
rgba($red,$green,$blue,$alpha)或rgba($color,$alpha)根据颜色和透明度值创建一个颜色
red($color)从一个颜色中获取其中红色值
green($color)从一个颜色中获取其中绿色值
blue($color)从一个颜色中获取其中蓝色值
mix($color1,$color2,[$weight])把两种颜色按比例混在一起.第三个参数是第一种颜色的比例值
HSL颜色函数 忽略
Opacity函数 控制整个元素的透明度
alpha($color)/opacity($color)获取颜色透明度值
rgba($color,$alpha)改变颜色的透明度值
opacify($color,$amount)/fade-in($color,$amount)使颜色更不透明
transparentize($color,$amount)/fade-out($color,$amount)使颜色更透明
四、Sass的 @ 规则
Sass 支持所有 CSS3 的 @ 规则, 以及一些 Sass 专属的规则,也被称为“指令(directives)”。
1、@import 引入文件
2、@media 媒体查询
3、@extend 扩展选择器或占位符
4、@at-root 跳出根元素
5、@debug 调试,Sass 代码在编译出错时,在命令终端会输出你设置的提示 Bug
6、@warn 调试
7、@error 调试