SASS 是 CSS 預處理器的簡稱。本文太長,工做中用的最多的就是嵌套混合和集成,能夠搜索來跳轉!css
命令行的方式編譯(推薦):es6
先安裝Ruby環境 https://rubyinstaller.org/sass
gem install sass
Ruby環境安裝後,執行此命令安裝 sass 預處理器.scss
//這樣的註釋不會被編譯 /* * 這樣的註釋會被編譯到輸出文件中 */
sass style.scss style_out.css
SASS --watch
監聽指定單文件或文件夾sass --watch style.scss:style_out.css
sass --watch somefolder:somefolder_out
其中somefolder爲執行命令目錄下的文件夾,輸出文件夾somefolder_out名稱自定義,沒有的話會自動建立ruby
以 style.scss 文件爲例koa
@charset "utf-8"; #box{ width:400px; height:400px; border:1px solid gray; h1{ font-size:22px; color:red; } p{ font-size:18px; color:green; } }
sass style.scss:style.css --style nested
#box { width: 400px; height: 400px; border: 1px solid gray; } #box h1 { font-size: 22px; color: red; } #box p { font-size: 18px; color: green; }/*代碼有縮進*/
sass style.scss:style.css --style expanded
#box { width: 400px; height: 400px; border: 1px solid gray; } #box h1 { font-size: 22px; color: red; } #box p { font-size: 18px; color: green; }/*代碼沒有縮進,和咱們日常編寫的css格式同樣*/
sass style.scss:style.css --style compact
#box { width: 400px; height: 400px; border: 1px solid gray; } #box h1 { font-size: 22px; color: red; } #box p { font-size: 18px; color: green; }/*一條規則佔一行*/
sass style.scss:style.css --style compressed
#box{width:400px;height:400px;border:1px solid gray}#box h1{font-size:22px;color:red}#box p{font-size:18px;color:green} /*一條規則佔一行*/
e.g.仍是在style.scss中函數
@charset "utf-8"; $width:300px; $height:200px; $bgc: red;//變量多值如何調用? //$bgc: red, pink; background-color:nth($bgc, 1);取第一個變量red //$bgc: red, pink; background-color:nth($bgc, 2);取第二個變量pink $color: #666; $yahei: '"Microsoft YaHei", "微軟雅黑"'; $bor:10px solid red;//sass容許多值變量
變量做用域工具
$color:red; body { $color:blue; //選擇器內部的$color變量會把外部的$color覆蓋,和js差很少 //同時,選擇器內部的變量,外部沒法調用 }
嵌套是SASS裏面最好用的東西,咱們能夠按照DOM結構的層級關係來寫css樣式字體
//選擇器嵌套 body { p { font-size: 16px; } } //屬性嵌套加 在屬性前綴加冒號 如font: //相似像font-size:16px;font-color:#ccc;font-style:normal;font-weight:bold;能夠寫成 .box { font: { size: 16px; color: #ccc; style: normal; weight: bold; } }
//單個選擇器跳出 .parent-2 { color:#f00; @at-root .child { width:200px; } } //多個選擇器跳出 .parent-3 { background:#f00; @at-root { .child1 { width:300px; } .child2 { width:400px; } } } //其實@at-root是有一個默認值@at-root(without:rule) //除此以外,它還有四個值 //一、all(表示全部) //二、rule(表示常規css) //三、media(表示media) //四、support(表示support,由於@support目前還沒法普遍使用,因此在此不表示)。
/*跳出父級元素嵌套*/ @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結果是url
@charset "UTF-8"; /*跳出父級元素嵌套*/ @media print { .parent1 { color: #f00; } .child1 { width: 200px; } } /*跳出media嵌套,父級有效*/ @media print { .parent2 { color: #f00; } } .child2 { width: 200px; } /*跳出media和父級*/ @media print { .parent3 { color: #f00; } } .child3 { width: 200px; }
.child{ @at-root .parent &{ color:#f00; } }
css輸出spa
.parent .child { color: #f00; }
@mixin 和 @include是成對出現的,就像js中的定義函數和調用函數成對出現同樣。
//聲明混合 @mixin bgc() { opacity: #f00; } //在選擇器內可使用@include調用混合 .demo { @include bgc(); }
//聲明混合,不帶參數。正常使用,沒毛病 //聲明混合,帶參數,調用混合時不傳參數,編譯後的文件會報錯 //聲明混合,帶參數。正常使用,沒毛病! //混合中參數有默認值,調用時候的參數是可選的! //混合中,形參加三個點的運算符@mixin bgc($bgc...),調用時能夠傳遞多個參數。有點相似js中的展開運行符 //只不過SASS中是將三個點寫在後面,js中是寫在前面
//聲明混合 @mixin bgc($bgc) { opacity: $bgc; } .demo { @include bgc(#f00); }
混合中默認參數的寫法
//聲明混合 @mixin bgc($bgc:#00f) { opacity: $bgc; } //傳參時,默認參數不生效,不傳參數的時候,默認值生效 .demo { @include bgc(#f00); }
$type: audi; p { @if $type == benz { color: red; } @else if $type == mahindra { color: blue; } @else if $type == audi { color: green; } @else { color: black; } }
css中輸出爲
p { color: green; }
經過sass的@if,@else if語法,根據傳入參數,實現動態輸出css樣式
// 畫三角形@mixin聲明 @mixin sj($fx:top,$size:100px,$color:red){ @if ($fx == top) { border-color: transparent transparent $color transparent; border-style: dashed dashed solid dashed; } @else if($fx == right){ border-color: transparent transparent transparent $color; border-style: dashed dashed dashed solid; } @else if($fx == bottom){ border-color: $color transparent transparent transparent; border-style: solid dashed dashed dashed; } @else if($fx == left){ border-color: transparent $color transparent transparent; border-style: dashed solid dashed dashed; } width: 0px; height: 0px; overflow: hidden; border-width: $size; } //mixin的調用 .demo{ @include sj(left); }
編譯後的css
.demo { border-color: transparent red transparent transparent; border-style: dashed solid dashed dashed; width: 0px; height: 0px; overflow: hidden; border-width: 100px; }
@extend
@extend讓你可以在多個選擇器中經過繼承的方式共享一段樣式:
有個問題就是, 若是你不可能用到.fl這個類,而它仍是會出如今輸出結果中!
佔位符選擇器% 能夠解決這個問題
.fl { float: left; } .box { @extend .fl } //輸出的css爲 .fl .box { float: left; }
zoom:1是兼容IE6,7而設置的,後面的屬性 IE6 IE7能識別,IE8 IE9……都不能識別;"_"後面的屬性,只有IE6能識別,其餘版本(IE7 8 9 更高級別)都不能識別
%clearfix { *zomm: 1;//由於ie6,ie7不能用after或者before僞類 &:after, &:before { content: "."; clear: both; display: block; overflow: hidden; font-size: 0; height: 0; } } //上面百分號定義的選擇器,能夠在其它選擇器中直接使用, //而百分號選擇器是不會被編譯到最後的css中去的 .container { width; 100px; height: 100px; @extend %clearfix }
$img: '../images/'; .content { background: url(#{$img}10086.jpg) left top no-repeat; }
$color: #f00; //能夠寫成 $color: #f00 + 100;//rgb(255+100, 0+100, 0+100),這就是它的原理,255加任何值都爲255
$size1 = 12px; $size2 = 24px; p { color: red; font: 12px / 24px "Microsoft YaHei" } //這裏表示p元素會顯示爲12px,行高爲24像素 的微軟雅黑字體, //可是當咱們用變量的時候 p { color: red; font: $size1 / $size2 "Microsoft YaHei" } //輸出結果是 p { color: red; font: 0.5 "Microsoft YaHei"; } //這裏的0.5顯然不是咱們想要的,能夠用插值符號#{}避免運算 p { color: red; font: #{$size1} / #{$size2} "Microsoft YaHei" }
@for $i from 1 through 10 { .item#{$i}{ width: 10px * $i } } //輸出爲 .item1 {width: 10px;} .item2 {width: 20px;} ... .item10 {width: 100px;}
while 循環
$a: 5; @while($a<20) { .item#{$a} { width: 20px * $a; } $a: $a+1; }
@each
$icon_name: user, pass, checked,select; @each $i in $icon_name { .icon_#{$i} { width: 10px; } } //輸出爲 .icon_user { width: 10px; } .icon_pass { width: 10px; } .icon_checked { width: 10px; } .icon_select { width: 10px; }