Sass 支持所有的 CSS3 @-Rules,以及 Sass 特有的 “指令”(directives)
1.@import
@import
的功能,允許其導入 SCSS 或 Sass 文件。被導入的文件將合並編譯到同一個 CSS 文件中,另外,被導入的文件中所包含的變量或者混合指令 (mixin) 都可以在導入的文件中使用。
通常,@import
尋找 Sass 文件並將其導入,但在以下情況下,@import
僅作為普通的 CSS 語句,不會導入任何 Sass 文件。
- 文件拓展名是
.css
; - 文件名以
http://
開頭; - 文件名是
url()
; @import
包含 media queries。
如果不在上述情況內,文件的拓展名是 .scss
或 .sass
,則導入成功。沒有指定拓展名,Sass 將會試着尋找文件名相同,拓展名為 .scss
或 .sass
的文件並將其導入。
@import "foo.scss";
或
@import "foo";
都會導入文件 foo.scss
2. @media
.sidebar {
width: 300px;
@media screen and (orientation: landscape) {
width: 500px;
}
}
編譯為
.sidebar {
width: 300px;
}
@media screen and (orientation: landscape) {
.sidebar {
width: 500px;
}
}
@media
的 queries 允許互相嵌套使用,編譯時,Sass 自動添加 and
@media screen {
.sidebar {
@media (orientation: landscape) {
width: 500px;
}
}
}
編譯為
@media screen and (orientation: landscape) {
.sidebar {
width: 500px;
}
}
@media
甚至可以比如變量,函數,以及運算符,代替條件的名稱或者值:
$media: screen;
$feature: -webkit-min-device-pixel-ratio;
$value: 1.5;
@media #{$media} and ($feature: $value) {
.sidebar {
width: 500px;
}
}
編譯為
@media screen and (-webkit-min-device-pixel-ratio: 1.5) {
.sidebar {
width: 500px;
}
}
3. @extend 繼承
Sass 將一個選擇器下的所有樣式繼承給另一個選擇器
這個非常好用,通常會有兩個類選擇器的樣式基本相同,第二個只是比第一個選擇器多點樣式,原來的方案要么寫兩遍,要么在一個html標簽上寫兩個選擇器。
使用 @extend
可以避免上述情況
.error {
border: 1px #f00;
background-color: #fdd;
}
.seriousError {
@extend .error;
border-width: 3px;
}
編譯后
.error, .seriousError { border: 1px #f00; background-color: #fdd; }
.seriousError { border-width: 3px; }
Class 選擇器並不是唯一可以被延伸 (extend) 的,Sass 允許延伸任何定義給單個元素的選擇器,比如 .special.cool
,a:hover
或者 a.user[href^="http://"]
同 class 元素一樣,a:hover
的樣式將繼承給 .hoverlink
。
.hoverlink {
@extend a:hover;
}
a:hover {
text-decoration: underline;
}
編譯為
a:hover, .hoverlink {
text-decoration: underline;
}
4.定義混合指令 @mixin
混合指令(Mixin)用於定義可重復使用的樣式,避免了使用無語意的 class,比如 .float-left
。混合指令可以包含所有的 CSS 規則,絕大部分 Sass 規則,甚至通過參數功能引入變量,輸出多樣化的樣式。
混合指令的用法是在 @mixin
后添加名稱與樣式,比如名為 large-text
的混合通過下面的代碼定義:
@mixin large-text {
font: {
family: Arial;
size: 20px;
weight: bold;
}
color: #ff0000;
}
混合也需要包含選擇器和屬性,甚至可以用 &
引用父選擇器:
@mixin clearfix {
display: inline-block;
&:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
* html & { height: 1px }
}
5. 引用混合樣式 @include
使用 @include
指令引用混合樣式,格式是在其后添加混合名稱,以及需要的參數(可選):
.page-title {
@include large-text;
padding: 4px;
margin-top: 10px;
}
編譯為
.page-title {
font-family: Arial;
font-size: 20px;
font-weight: bold;
color: #ff0000;
padding: 4px;
margin-top: 10px;
}
也可以在最外層引用混合樣式,不會直接定義屬性,也不可以使用父選擇器。
@mixin silly-links {
a {
color: blue;
background-color: red;
}
}
@include silly-links;
編譯為
a {
color: blue;
background-color: red;
}
混合樣式中也可以包含其他混合樣式,比如
@mixin compound {
@include highlighted-background;
@include header-text;
}
@mixin highlighted-background { background-color: #fc0; }
@mixin header-text { font-size: 20px; }
混合樣式中應該只定義后代選擇器,這樣可以安全的導入到文件的任何位置。
參數用於給混合指令中的樣式設定變量,並且賦值使用。在定義混合指令的時候,按照變量的格式,通過逗號分隔,將參數寫進圓括號里。引用指令時,按照參數的順序,再將所賦的值對應寫進括號:
@mixin sexy-border($color, $width) {
border: {
color: $color;
width: $width;
style: dashed;
}
}
p { @include sexy-border(blue, 1in); }
編譯為
p {
border-color: blue;
border-width: 1in;
border-style: dashed;
}
混合指令也可以使用給變量賦值的方法給參數設定默認值,然后,當這個指令被引用的時候,如果沒有給參數賦值,則自動使用默認值:
@mixin sexy-border($color, $width: 1px) {
border: {
color: $color;
width: $width;
style: dashed;
}
}
p { @include sexy-border(blue); }
h1 { @include sexy-border(blue, 2px); }
編譯為
p {
border-color: blue;
border-width: 1px;
border-style: dashed;
}
h1 {
border-color: blue;
border-width: 2px;
border-style: dashed;
}
混合指令也可以使用關鍵詞參數,上面的例子也可以寫成:
p { @include sexy-border($color: blue); }
h1 { @include sexy-border($color: blue, $width: 2in); }
雖然不夠簡明,但是閱讀起來會更方便。關鍵詞參數給函數提供了更靈活的接口,以及容易調用的參數。關鍵詞參數可以打亂順序使用,如果使用默認值也可以省缺,另外,參數名被視為變量名,下划線、短橫線可以互換使用。
參數變量
有時,不能確定混合指令需要使用多少個參數,比如一個關於 box-shadow
的混合指令不能確定有多少個 'shadow' 會被用到。這時,可以使用參數變量 …
聲明(寫在參數的最后方)告訴 Sass 將這些參數視為值列表處理:
@mixin box-shadow($shadows...) {
-moz-box-shadow: $shadows;
-webkit-box-shadow: $shadows;
box-shadow: $shadows;
}
.shadows {
@include box-shadow(0px 4px 5px #666, 2px 6px 10px #999);
}
編譯為
.shadowed {
-moz-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
-webkit-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
}
參數變量也可以用在引用混合指令的時候 (@include
),與平時用法一樣,將一串值列表中的值逐條作為參數引用:
@mixin colors($text, $background, $border) {
color: $text;
background-color: $background;
border-color: $border;
}
$values: #ff0000, #00ff00, #0000ff;
.primary {
@include colors($values...);
}
編譯為
.primary {
color: #ff0000;
background-color: #00ff00;
border-color: #0000ff;
}
基本也就這些常用,如果發現錯誤解決不了,我的建議就是以前你怎么寫的css你就怎么寫肯定沒錯。當然有空去探個真相才是王道。