SASS使用总结
简单用法:变量sass中可以定义变量,方便统一修改和维护。//sass style$fontStack: Helvetica, sans-serif;$primaryColor: #333;body { font-family: $fontStack; color: $primaryColor;}//css style body { font-family: Helvetica, sans-serif; color: #333;}嵌套sass可以进行选择器的嵌套,表示层级关系,看起来很优雅整齐。 //sass stylenav { ul { margin: 0; padding: 0; list-style: none; } li { display: inline-block; } a { display: block; padding: 6px 12px; text-decoration: none; }}//css stylenav ul { margin: 0; padding: 0; list-style: none;} nav li { display: inline-block;} nav a { display: block; padding: 6px 12px; text-decoration: none;} 导入sass中如导入其他sass文件,最后编译为一个css文件,优于纯css的 @import mixinsass中可用mixin定义一些代码片段,且可传参数,方便日后根据需求调用。从此处理css3的前缀兼容轻松便捷。//sass style//-----------------------------------@mixin box-sizing ($sizing) { -webkit-box-sizing:$sizing; -moz-box-sizing:$sizing; box-sizing:$sizing;}.box-border{ border:1px solid #ccc; @include box-sizing(border-box);}//css style//-----------------------------------.box-border { border: 1px solid #ccc; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box;}扩展/继承sass可通过 @extend 来实现代码组合声明,使代码更加优越简洁。//sass style.message { border: 1px solid #ccc; padding: 10px; color: #333;}.success { @extend .message; border-color: green;}.error { @extend .message; border-color: red;} .warning { @extend .message; border-color: yellow;}//css style.message, .success, .error, .warning { border: 1px solid #cccccc; padding: 10px; color: #333;}.success { border-color: green;}.error { border-color: red;}.warning { border-color: yellow;}颜色sass中集成了大量的颜色函数,让变换颜色更加简单。 //sass style$linkColor: #08c;a { text-decoration:none; color:$linkColor; &:hover{ color:darken($linkColor,10%); }}//css stylea { text-decoration: none; color: #0088cc;}a:hover { color: #006699;} 运算 sass可进行简单的加减乘除运算等 //sass style.container { width: 100%; } article[role="main"] { float: left; width: 600px / 960px * 100%;} aside[role="complimentary"] { float: right; width: 300px / 960px * 100%;}//css style.container { width: 100%;} article[role="main"] { float: left; width: 62.5%;} aside[role="complimentary"] { float: right; width: 31.25%;} 基本语法:文件后缀名:.sass(不使用大括号和分号)或者.scss(使用大括号和分号)导入:ass的导入( @import )规则和CSS的有所不同,编译时会将@import 的scss文件合并进来只生成一个CSS文件。但是如果你在sass文件中导入css文件如@import 'reset.css' ,那效果跟普通CSS导入样式文件一样,导入的css文件不会合并到编译后的文件中,而是以@import 方式存在。所有的sass导入文件都可以忽略后缀名.scss。一般来说基础的文件命名方法以_开头,如_mixin.scss。这种文件在导入的时候可以不写下划线,可写成@import "mixin"。注释:sass有两种注释方式,一种是标准的css注释方式/* */ ,另一种则是// 双斜杆形式的单行注释,不过这种单行注释不会被转译出来。变量:sass的变量必须是$开头,后面紧跟变量名,而变量值和变量名之间就需要使用冒号(:)分隔开(就像CSS属性设置一样),如果值后面加上!default则表示默认值。 sass的默认变量一般是用来设置默认值,然后根据需求来覆盖的,覆盖的方式也很简单,只需要在默认变量之前重新声明下变量即可。//sass style$baseLineHeight: 2;$baseLineHeight: 1.5 !default;body{ line-height: $baseLineHeight;}//css stylebody{ line-height:2;} 特殊变量:一般我们定义的变量都为属性值,可直接使用,但是如果变量作为属性或在某些特殊情况下等则必须要以 #{$variables} 形式使用。//sass style$borderDirection: top !default;$baseFontSize: 12px !default;$baseLineHeight: 1.5 !default;//应用于class和属性.border-#{$borderDirection}{ border-#{$borderDirection}:1px solid #ccc;}//应用于复杂的属性值body{ font:#{$baseFontSize}/#{$baseLineHeight};}//css style.border-top{ border-top:1px solid #ccc;}body { font: 12px/1.5;} 多值变量:分为list类型和map类型,简单来说list类型类似js中的数组,map类型类似于js中的对象list:数据可通过空格,逗号或小括号分隔多个值,可用 nth($var,$index) 取值。//list定义//一维数据$px: 5px 10px 20px 30px;//二维数据,相当于js中的二维数组$px: 5px 10px, 20px 30px;$px: (5px 10px) (20px 30px);//使用//sass style$linkColor: #08c #333 !default;//第一个值为默认值,第二个鼠标滑过值a{ color:nth($linkColor,1); &:hover{ color:nth($linkColor,2); }}//css stylea{ color:#08c;}a:hover{ color:#333;}map:map数据以key和value成对出现,其中value又可以是list。格式为: $map: (key1: value1, key2: value2, key3: value3); 。可通过map-get($map,$key) 取值, 关于map数据还有很多其他函数如map-merge($map1,$map2) ,map-keys($map) ,map-values($map) 等//sass style$headings: (h1: 2em, h2: 1.5em, h3: 1.2em);@each $header, $size in $headings { #{$header} { font-size: $size; }}//css styleh1 { font-size: 2em;}h2 { font-size: 1.5em;}h3 { font-size: 1.2em;}全局变量:在变量值后面加上!global变量机制:在选择器声明的变量会覆盖外面全局声明的变量 //sass style$fontSize: 12px;body{ $fontSize: 14px; font-size:$fontSize;}p{ font-size:$fontSize;}//css stylebody{ font-size:14px;}p{ font-size:14px;}启用global之后的机制:默认在选择器里面的变量为局部变量,而只有设置了 !global 之后才会成为全局变量。嵌套Nesting:sass的嵌套包括两种:一种是选择器的嵌套;另一种是属性的嵌套。我们一般说起或用到的都是选择器的嵌套。选择器嵌套:所谓选择器嵌套指的是在一个选择器中嵌套另一个选择器来实现继承,从而增强了sass文件的结构性和可读性。 在选择器嵌套中,可以使用& 表示父元素选择器//sass style#top_nav{ line-height: 40px; text-transform: capitalize; li{ float:left; } a{ display: block; padding: 0 10px; color: #fff; &:hover{ color:#ddd; } }}//css style#top_nav{ line-height: 40px; text-transform: capitalize; } #top_nav li{ float:left;}#top_nav a{ display: block; padding: 0 10px; color: #fff;}#top_nav a:hover{ color:#ddd;} 属性嵌套:所谓属性嵌套指的是有些属性拥有同一个开始单词,如border-width,border-color都是以border开头。 //sass style.fakeshadow { border: { style: solid; left: { width: 4px; color: #888; } right: { width: 2px; color: #ccc; } }}//css style.fakeshadow { border-style: solid; border-left-width: 4px; border-left-color: #888; border-right-width: 2px; border-right-color: #ccc;} @at-root:sass3.3.0中新增的功能,用来跳出选择器嵌套的。默认所有的嵌套,继承所有上级选择器,但有了这个就可以跳出所有上级选择器。 //sass style//没有跳出.parent-1 { color:#f00; .child { width:100px; }}//单个选择器跳出.parent-2 { color:#f00; @at-root .child { width:200px; }}//多个选择器跳出.parent-3 { background:#f00; @at-root { .child1 { width:300px; } .child2 { width:400px; } }}//css style.parent-1 { color: #f00;} .parent-1 .child { width: 100px;}.parent-2 { color: #f00;}.child { width: 200px;}.parent-3 { background: #f00;}.child1 { width: 300px;}.child2 { width: 400px;}@at-root (without: ...)和@at-root (with: ...):默认@at-root只会跳出选择器嵌套,而不能跳出@media或@support,如果要跳出这两种,则需使用@at-root (without: media),@at-root (without: support)。这个语法的关键词有四个:all(表示所有),rule(表示常规css),media(表示media),support(表示support,因为@support目前还无法广泛使用,所以在此不表)。我们默认的@at-root其实就是@at-root (without:rule)。 //sass style//跳出父级元素嵌套@media print { .parent1{ color:#f00; @at-root .child1 { width:200px; } }} //跳出media嵌套,父级有效@media print { .parent2{ color:#f00; @at-root (without: media) { .child2 { width:200px; } } }} //跳出media和父级@media print { .parent3{ color:#f00; @at-root (without: all) { .child3 { width:200px; } } }} //css style@media print { .parent1 { color: #f00; } .child1 { width: 200px; }} @media print { .parent2 { color: #f00; }}.parent2 .child2 { width: 200px;} @media print { .parent3 { color: #f00; }}.child3 { width: 200px;}@at-root与&配合使用://sass style.child{ @at-root .parent &{ color:#f00; }} //css style.parent .child { color: #f00;} 应用于@keyframe: //sass style.demo { ... animation: motion 3s infinite; @at-root { @keyframes motion { ... } }} //css style.demo { ... animation: motion 3s infinite;}@keyframes motion { ...} 混合(mixin)sass中使用 @mixin 声明混合,可以传递参数,参数名以$符号开始,多个参数以逗号分开,也可以给参数设置默认值。声明的@mixin 通过@include 来调用。无参数mixin://sass style@mixin center-block { margin-left:auto; margin-right:auto;}.demo{ @include center-block;}//css style.demo{ margin-left:auto; margin-right:auto;} 有参数mixin: //sass style@mixin opacity($opacity:50) { opacity: $opacity / 100; filter: alpha(opacity=$opacity);}//css style.opacity{ @include opacity; //参数使用默认值}.opacity-80{ @include opacity(80); //传递参数} 多个参数的mixin: 调用时可直接传入值,如 @include 传入参数的个数小于@mixin 定义参数的个数,则按照顺序表示,后面不足的使用默认值,如不足的没有默认值则报错。除此之外还可以选择性的传入参数,使用参数名与值同时传入。//sass style@mixin horizontal-line($border:1px dashed #ccc, $padding:10px){ border-bottom:$border; padding-top:$padding; padding-bottom:$padding; }.imgtext-h li{ @include horizontal-line(1px solid #ccc);}.imgtext-h--product li{ @include horizontal-line($padding:15px);}//css style.imgtext-h li { border-bottom: 1px solid #cccccc; padding-top: 10px; padding-bottom: 10px;}.imgtext-h--product li { border-bottom: 1px dashed #cccccc; padding-top: 15px; padding-bottom: 15px;} 多组值参数mixin: 如果一个参数可以有多组值,如box-shadow、transition等,那么参数则需要在变量后加三个点表示,如 $variables... 。//sass style//box-shadow可以有多组值,所以在变量参数后面添加...@mixin box-shadow($shadow...) { -webkit-box-shadow:$shadow; box-shadow:$shadow;}.box{ border:1px solid #ccc; @include box-shadow(0 2px 2px rgba(0,0,0,.3),0 3px 3px rgba(0,0,0,.3),0 4px 4px rgba(0,0,0,.3));}//css style.box{ border:1px solid #ccc; -webkit-box-shadow:0 2px 2px rgba(0,0,0,.3),0 3px 3px rgba(0,0,0,.3),0 4px 4px rgba(0,0,0,.3); box-shadow:0 2px 2px rgba(0,0,0,.3),0 3px 3px rgba(0,0,0,.3),0 4px 4px rgba(0,0,0,.3);}@content: @content 在sass3.2.0中引入,可以用来解决css3的@media等带来的问题。它可以使@mixin 接受一整块样式,接受的样式从@content开始。//sass style@mixin max-screen($res){ @media only screen and ( max-width: $res ) { @content; }}@include max-screen(480px) { body { color: red }} //css style@media only screen and (max-width: 480px) { body { color: red }} PS: @mixin 通过@include 调用后解析出来的样式是以拷贝形式存在的,而下面的继承则是以联合声明的方式存在的,所以从3.2.0版本以后,建议传递参数的用@mixin ,而非传递参数类的使用下面的继承% 。继承: sass中,选择器继承可以让选择器继承另一个选择器的所有样式,并联合声明。使用选择器的继承,要使用关键词@extend ,后面紧跟需要继承的选择器//sass styleh1{ border: 4px solid #ff9aa9;}.speaker{ @extend h1; border-width: 2px;} //css styleh1,.speaker{ border: 4px solid #ff9aa9;}.speaker{ border-width: 2px;} 占位选择器%: 从sass 3.2.0以后就可以定义占位选择器 % 。这种选择器的优势在于:如果不调用则不会有任何多余的css文件,避免了以前在一些基础的文件中预定义了很多基础的样式,然后实际应用中不管是否使用了@extend 去继承相应的样式,都会解析出来所有的样式。占位选择器以% 标识定义,通过@extend 调用。//sass style%ir{ color: transparent; text-shadow: none; border: 0;}%clearfix{ @if $lte7 { *zoom: 1; } &:before, &:after { content: ""; display: table; font: 0/0 a; } &:after { clear: both; }}#header{ h1{ @extend %ir; width:300px; }}.ir{ @extend %ir;}//css style#header h1,.ir{ color: transparent; text-shadow: none; border: 0;}#header h1{ width:300px;}
如上代码,定义了两个占位选择器 @media 中暂时不能@extend @media 外的代码片段,以后将会可以。函数:sass定义了很多函数可供使用,当然你也可以自己定义函数,以@fuction开始, 实际项目中我们使用最多的应该是颜色函数,而颜色函数中又以lighten减淡和darken加深为最,其调用方法为lighten($color,$amount) 和darken($color,$amount) ,它们的第一个参数都是颜色值,第二个参数都是百分比。//sass style$baseFontSize: 10px !default;$gray: #ccc !defualt; // pixels to rems@function pxToRem($px) { @return $px / $baseFontSize * 1rem;} body{ font-size:$baseFontSize; color:lighten($gray,10%);}.test{ font-size:pxToRem(16px); color:darken($gray,10%);} //css stylebody{ font-size:10px; color:#E6E6E6;}.test{ font-size:1.6rem; color:#B3B3B3;} 运算: sass具有运算的特性,可以对数值型的Value(如:数字、颜色、变量等)进行加减乘除四则运算。请注意运算符前后请留一个空格,不然会出错。 $baseFontSize: 14px !default;$baseLineHeight: 1.5 !default;$baseGap: $baseFontSize * $baseLineHeight !default;$halfBaseGap: $baseGap / 2 !default;$samllFontSize: $baseFontSize - 2px !default; //grid$_columns: 12 !default; // Total number of columns$_column-width: 60px !default; // Width of a single column$_gutter: 20px !default; // Width of the gutter$_gridsystem-width: $_columns * ($_column-width + $_gutter); //grid system width 条件判断及循环:@if 可以一个条件单独使用,也可以和@else结合多条件使用 //sass style$lte7: true;$type: monster;.ib{ display:inline-block; @if $lte7 { *display:inline; *zoom:1; }}p { @if $type == ocean { color: blue; } @else if $type == matador { color: red; } @else if $type == monster { color: green; } @else { color: black; }} //css style.ib{ display:inline-block; *display:inline; *zoom:1;}p { color: green;} 三目判断:语法为: if($condition, $if_true, $if_false) 。三个参数分别表示:条件,条件为真的值,条件为假的值if(true, 1px, 2px) => 1pxif(false, 1px, 2px) => 2px
for循环: //sass style@for $i from 1 through 3 {.item-#{$i} { width: 2em * $i; }}//css style.item-1 {width: 2em;}.item-2 {width: 4em;}.item-3 {width: 6em;} @each循环:语法为: @each $var in 。其中$var 表示变量,而list和map表示list类型数据和map类型数据。sass 3.3.0新加入了多字段循环和map数据循环。单个字段list数据循环://sass style$animal-list: puma, sea-slug, egret, salamander;@each $animal in $animal-list { .#{$animal}-icon { background-image: url('/images/#{$animal}.png'); }} //css style.puma-icon { background-image: url('/images/puma.png');}.sea-slug-icon { background-image: url('/images/sea-slug.png');}.egret-icon { background-image: url('/images/egret.png');}.salamander-icon { background-image: url('/images/salamander.png');} 多个字段list数据循环: //sass style$animal-data: (puma, black, default),(sea-slug, blue, pointer),(egret, white, move);@each $animal, $color, $cursor in $animal-data { .#{$animal}-icon { background-image: url('/images/#{$animal}.png'); border: 2px solid $color; cursor: $cursor; }} //css style.puma-icon { background-image: url('/images/puma.png'); border: 2px solid black; cursor: default;}.sea-slug-icon { background-image: url('/images/sea-slug.png'); border: 2px solid blue; cursor: pointer;}.egret-icon { background-image: url('/images/egret.png'); border: 2px solid white; cursor: move;} 多个字段map数据循环: //sass style$headings: (h1: 2em, h2: 1.5em, h3: 1.2em);@each $header, $size in $headings { #{$header} { font-size: $size; }} //css styleh1 { font-size: 2em;}h2 { font-size: 1.5em;}h3 { font-size: 1.2em;} sass编译:命令行编译:单文件转换:sass style.scss style.css单文件监听:sass --watch style.scss style.css文件夹监听:sass --watch sassFileDir:cssFileDircss文件转换成sass/scss文件:sass-convert style.css style.sasssass-convert style.css style.scss配置项:运行命令行帮助文档,可以获得所有的配置选项: sass -h一般常用的有--style,--sourcemap,--debug-info等:sass --watch style.scss:style.css --style compactsass --watch style.scss:style.css --sourcemapsass --watch style.scss:style.css --style expanded --sourcemapsass --watch style.scss:style.css --debug-info- --style表示解析后的css是什么格式,有四种取值分别为:nested,expanded,compact,compressed。 // nested#main { color: #fff; background-color: #000; } #main p { width: 10em; } .huge { font-size: 10em; font-weight: bold; text-decoration: underline; } // expanded#main { color: #fff; background-color: #000;}#main p { width: 10em;} .huge { font-size: 10em; font-weight: bold; text-decoration: underline;} // compact#main { color: #fff; background-color: #000; }#main p { width: 10em; } .huge { font-size: 10em; font-weight: bold; text-decoration: underline; } // compressed#main{color:#fff;font-weight:bold;text-decoration:underline}- --sourcemap表示开启sourcemap调试。开启sourcemap调试后,会生成一个后缀名为.css.map文件。- --debug-info表示开启debug信息图形化工具gui koalasass调试:sass调试需要开启编译时输出调试信息和浏览器调试功能,两者缺一不可。开启编译调试信息:目前sass的调试分为两种,一种为开启debug-info,一种为开启sourcemap(这个将成为主流)。如开启的是debug-info,则解析的css文件中会有以@media -sass-debug-info开头的代码,如没有则表明没有开启。如开启的是sourcemap,则在解析的css文件同目录下生成一个.css.map的后缀名文件。命令行开启调试:sass --watch style.scss:style.css --debug-infosass --watch style.scss:style.css --sourcemapkoala开启:如下图:点击相应的文件,然后就会出现右边的编译选项,即可选择是否开启source map,debug info开启浏览器调试:谷歌浏览器调试: F12打开调试面板,点击调试面板右上角的齿轮图标打开设置,在 开启 点击scss文件,会跳到 火狐浏览器调试debug-info调试firefox可以安装插件FireSass使用 开启 sourcemap调试firefox 29 将会开始支持sourcemap ,注意是火狐自带的调试功能,而不是firebug。开启--sourcemap 编译,右键“查看元素”采用火狐自带的调试功能,打开调试面板,在样式上右键选择“显示原始来源”。点击scss文件,这样就跳到了scss文件。如下图: 然后就可以进行我们的修改了,修改之后点击保存或者'ctrl+s'弹出我们要保存到哪里,同谷歌一样直接覆盖到我们本地的源文件就ok了。 ![]() |