目錄
1. 變量 (可以實現(xiàn) 通用樣式復(fù)用)
2. 嵌套
3. @mixin 與 @include 混入
4. @extend 繼承
5. 內(nèi)置函數(shù)
本文為本人略讀官網(wǎng)文檔后的大略筆記,實在不適合他人閱讀
Sass(Syntactically Awesome Stylesheets)
最初由 Hampton Catlin 設(shè)計并由 Natalie Weizenbaum 開發(fā)的層疊樣式表語言。
瀏覽器并不支持 Sass 代碼。因此,需要使用一個 Sass 預(yù)處理器將 Sass 代碼轉(zhuǎn)換為 CSS 代碼。
前言:Sass的作用(為什么產(chǎn)生Sass)
CSS 無法實現(xiàn)復(fù)用,不方便維護(例如:對于通用樣式,需要變動時得一個一個找出來并修改)。
Sass 引入樣式復(fù)用機制,并對CSS進行了擴展(增加了 變量、嵌套、混入、繼承、內(nèi)置函數(shù)等特性)。
Sass安裝
安裝
npm install -g sass
查看版本
sass --version
將scss文件轉(zhuǎn)換為css文件
sass a.scss test.css
例 (Sass 文件后綴為 .scss)
======================= scss
/* 定義變量與值 */
$bgcolor: lightblue;
$textcolor: darkblue;
$fontsize: 18px;
/* 使用變量 */
body {
background-color: $bgcolor;
color: $textcolor;
font-size: $fontsize;
}
======================= css
@charset "UTF-8";
/* 定義變量與值 */
/* 使用變量 */
body {
background-color: lightblue;
color: darkblue;
font-size: 18px;
}
/*# sourceMappingURL=test.css.map */
1. 語法
- 變量 (可以實現(xiàn) 通用樣式復(fù)用)
$variablename: value;
Sass變量的作用域
只能在當(dāng)前的層級上有效果(在某個花括號內(nèi)部改變后,僅在該花括號內(nèi)該處以下生效)
!global關(guān)鍵詞可以將變量設(shè)置為全局(一般定義所有的全局變量在同一個文件_globals.scss,使用 @include包含該文件)
Sass變量可以存儲
1. 字符串
2. 數(shù)字
3. 顏色值
4. 布爾值
5. 列表
6. null 值
例1
======================= scss
$myFont: Helvetica, sans-serif;
$myColor: red;
$myFontSize: 18px;
$myWidth: 680px;
body {
font-family: $myFont;
font-size: $myFontSize;
color: $myColor;
}
#container {
width: $myWidth;
}
======================= css
body {
font-family: Helvetica, sans-serif;
font-size: 18px;
color: red;
}
#container {
width: 680px;
}
/*# sourceMappingURL=test.css.map */
例2(作用域)
======================= scss
$myColor: red;
h1 {
$myColor: green; // 只在 h1 里頭有用,局部作用域
color: $myColor;
}
p {
color: $myColor;
}
======================= css
h1 {
color: green;
}
p {
color: red;
}
/*# sourceMappingURL=test.css.map */
例3 (!global)
======================= scss
$myColor: red;
h1 {
$myColor: green !global; // 全局作用域
color: $myColor;
}
p {
color: $myColor;
}
======================= css
h1 {
color: green;
}
p {
color: green;
}
/*# sourceMappingURL=test.css.map */
- 嵌套規(guī)則
類似于html的
<a>
<p></p>
</a>
嵌套
嵌套屬性
很多CSS 屬性都有同樣的前綴,例如:font-family, font-size 和 font-weight
SCSS可以這樣寫
font: {
family: Helvetica, sans-serif;
size: 18px;
weight: bold;
}
例1
======================= scss
nav {
ul {
margin: 0;
padding: 0;
list-style: none;
}
li {
display: inline-block;
}
a {
display: block;
padding: 6px 12px;
text-decoration: none;
}
}
======================= css
nav ul {
margin: 0;
padding: 0;
list-style: none;
}
nav li {
display: inline-block;
}
nav a {
display: block;
padding: 6px 12px;
text-decoration: none;
}
/*# sourceMappingURL=test.css.map */
例2(嵌套屬性)
======================= scss
p{
font: {
family: Helvetica, sans-serif;
size: 18px;
weight: bold;
}
text: {
align: center;
transform: lowercase;
overflow: hidden;
}
}
======================= css
p {
font-family: Helvetica, sans-serif;
font-size: 18px;
font-weight: bold;
text-align: center;
text-transform: lowercase;
text-overflow: hidden;
}
/*# sourceMappingURL=test.css.map */
- @import 導(dǎo)入文件
@import filename;
Sass的@import指令會將文件包含在 CSS 中,不需要額外的 HTTP 請求。
通常需要創(chuàng)建以下幾個文件
1. 顏色文件(存放 通用的顏色)
2. 字體文件(存放 通用的字體)
3. 間距文件(存放 通用的間距)
4. 全局變量文件
如果不希望將一個 Sass 的代碼文件編譯到一個 CSS 文件,可以在文件名的開頭添加一個下劃線。這將告訴 Sass 不要將其編譯到 CSS 文件。但是,在導(dǎo)入該文件時不需要添加下劃線。(此處有疑問)
注意:
1. 包含文件時不需要指定文件后綴,Sass 會自動添加后綴 .scss。
2. 不要將帶下劃線與不帶下劃線的同名文件放置在同一個目錄下,會忽略帶下劃線的文件
例1
======================= scss (reset.scss文件)
html,
body,
ul,
ol {
margin: 0;
padding: 0;
}
======================= scss (test.scss文件)
@import "reset";
body {
font-family: Helvetica, sans-serif;
font-size: 18px;
color: red;
}
======================= css
html,
body,
ul,
ol {
margin: 0;
padding: 0;
}
body {
font-family: Helvetica, sans-serif;
font-size: 18px;
color: red;
}
/*# sourceMappingURL=test.css.map */
- @mixin 與 @include
@mixin 指令定義一個混入(可以在整個樣式表中重復(fù)使用的樣式)。
@include 指令引入混入。
@mixin mixin-name {
property: value;
property: value;
...
}
selector {
@include mixin-name;
}
注意:
1. Sass 的連接符號 - 與下劃線符號 _ 是相同的,也就是 @mixin important-text { } 與 @mixin important_text { } 是一樣的混入。
2. 混入中也可以包含混入
例1
======================= scss
@mixin important-text {
color: red;
font-size: 25px;
font-weight: bold;
border: 1px solid blue;
}
.danger {
@include important-text;
background-color: green;
}
======================= css
.danger {
color: red;
font-size: 25px;
font-weight: bold;
border: 1px solid blue;
background-color: green;
}
/*# sourceMappingURL=test.css.map */
例2(向混入傳遞變量)
======================= scss
/* 混入接收兩個參數(shù) */
@mixin bordered($color, $width) {
border: $width solid $color;
}
.myArticle {
@include bordered(blue, 1px); // 調(diào)用混入,并傳遞兩個參數(shù)
}
.myNotes {
@include bordered(red, 2px); // 調(diào)用混入,并傳遞兩個參數(shù)
}
======================= css
@charset "UTF-8";
/* 混入接收兩個參數(shù) */
.myArticle {
border: 1px solid blue;
}
.myNotes {
border: 2px solid red;
}
/*# sourceMappingURL=test.css.map */
例3(混入傳遞變量,并設(shè)置默認值)
======================= scss
@mixin sexy-border($color, $width: 1in) {
border: {
color: $color;
width: $width;
style: dashed;
}
}
p { @include sexy-border(blue); }
h1 { @include sexy-border(blue, 2in); }
======================= css
p {
border-color: blue;
border-width: 1in;
border-style: dashed;
}
h1 {
border-color: blue;
border-width: 2in;
border-style: dashed;
}
/*# sourceMappingURL=test.css.map */
例4(混入傳遞變量,參數(shù)個數(shù)可變)
======================= scss
@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);
}
======================= css
.shadows {
-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;
}
/*# sourceMappingURL=test.css.map */
例5(瀏覽器前綴使用混入)
======================= scss
@mixin transform($property) {
-webkit-transform: $property;
-ms-transform: $property;
transform: $property;
}
.myBox {
@include transform(rotate(20deg));
}
======================= css
.myBox {
-webkit-transform: rotate(20deg);
-ms-transform: rotate(20deg);
transform: rotate(20deg);
}
/*# sourceMappingURL=test.css.map */
- @extend 繼承
@extend 父樣式;
例1
======================= scss
.button-basic {
border: none;
padding: 15px 30px;
text-align: center;
font-size: 16px;
cursor: pointer;
}
.button-report {
@extend .button-basic;
background-color: red;
}
.button-submit {
@extend .button-basic;
background-color: green;
color: white;
}
======================= css
.button-basic, .button-submit, .button-report {
border: none;
padding: 15px 30px;
text-align: center;
font-size: 16px;
cursor: pointer;
}
.button-report {
background-color: red;
}
.button-submit {
background-color: green;
color: white;
}
/*# sourceMappingURL=test.css.map */
- 內(nèi)置函數(shù)
| 字符串函數(shù) | 說明 | 舉例 |
|---|---|---|
| quote(string) | 給字符串添加引號 | quote(cx) 結(jié)果: "cx" |
| str-index(string, substring) | 返回 substring 子字符串第一次在 string 中出現(xiàn)的位置。如果沒有匹配到子字符串,則返回 null。 | str-index(abcd, a) 結(jié)果: 1 (注意:Sass 字符串的起始索引值從 1 開始) |
| str-insert(string, insertStr, index) | 在字符串 string 中 index 位置插入 insertStr | str-insert("Hello world!", " cx", 6) 結(jié)果: "Hello cx world!" |
| str-length(string) | 返回字符串的長度 | str-length("cx") 結(jié)果: 2 |
| str-slice(string, start, end) | 從 string 中截取子字符串,通過 start-at 和 end-at 設(shè)置始末位置,未指定結(jié)束索引值則默認截取到字符串末尾。 | str-slice("abcd", 2) 結(jié)果 "bcd" str-slice("abcd", 2, -2) 結(jié)果 "bc" |
| to-lower-case(string) | 將字符串轉(zhuǎn)成大寫 | to-upper-case("cx") 結(jié)果: "CX" |
| unique-id() | 返回一個無引號的隨機字符串作為 id。不過也只能保證在單次的 Sass 編譯中確保這個 id 的唯一性。 | |
| unique-id() 結(jié)果: uad053b1c | ||
| unquote(string) | 移除字符串的引號 | unquote("cx") 結(jié)果: cx |
| 數(shù)字函數(shù) | 說明 | 舉例 |
|---|---|---|
| abs(number) | 返回一個數(shù)值的絕對值 | abs(-15) 結(jié)果: 15 |
| ceil(number) | 向上取整 | ceil(15.20) 結(jié)果: 16 |
| comparable(num1, num2) | 返回一個布爾值,判斷 num1 與 num2 是否可以進行比較 | comparable(35px, 2em) 結(jié)果: false comparable(20mm, 1cm) 結(jié)果: true |
| floor(number) | 向下取整 | floor(15.80) 結(jié)果: 15 |
| max(number...) | 返回最大值 | max(5, 7, 9, 0, -3, -7) 結(jié)果: 9 |
| min(number...) | 返回最大值 | min(5, 7, 9, 0, -3, -7) 結(jié)果: -7 |
| percentage(number) | 將數(shù)字轉(zhuǎn)化為百分比的表達形式 | percentage(1.2) 結(jié)果: 120 |
| random() | 返回 0-1 區(qū)間內(nèi)的小數(shù) | random() 結(jié)果: 0.65673 |
| random(number) | 返回 1 至 number 之間的整數(shù),包括 1 和 limit。 | random(6) 結(jié)果: 4 |
| round(number) | 返回最接近該數(shù)的一個整數(shù),四舍五入 | round(15.20) 結(jié)果: 15 |
| 列表(List)函數(shù) | 說明 | 舉例 |
|---|---|---|
| Sass 列表是不可變的,因此在處理列表時,返回的是一個新的列表,而不是在原有的列表上進行修改。 | 列表的起始索引值為 1 | |
| append(list, value, [separator]) | 將單個值 value 添加到列表尾部。separator 是分隔符,默認會自動偵測,或者指定為逗號或空格。 | append((a b c), (d), comma) 結(jié)果: a, b, c, d |
| index(list, value) | 返回元素 value 在列表中的索引位置,找不到返回null。 | index(a b c, b) 結(jié)果: 2 |
| is-bracketed(list) | 判斷列表中是否有中括號 | is-bracketed([a b c]) 結(jié)果: true |
| join(list1, list2, [separator, bracketed]) | 合并兩列表,將列表 list2 添加到列表 list1 的末尾。separator 是分隔符,默認會自動偵測,或者指定為逗號或空格。 bracketed 默認會自動偵測是否有中括號,可以設(shè)置為 true 或 false。 | join(a b c, d e f) 結(jié)果: a b c d e f join((a b c), (d e f), comma) 結(jié)果: a, b, c, d, e, f join(a b c, d e f, $bracketed: true) 結(jié)果: [a b c d e f] |
| length(list) | 返回列表的長度 | length(a b c) 結(jié)果: 3 |
| list-separator(list) | 返回一列表的分隔符類型??梢允强崭窕蚨禾?。 | list-separator(a b c) 結(jié)果: "space" |
| nth(list, n) | 獲取第 n 項的值。 | nth(a b c, 3) 結(jié)果: c |
| set-nth(list, n, value) | 設(shè)置列表第 n 項的值為 value。 | set-nth(a b c, 2, x) 結(jié)果: a x c |
| zip(lists) | 將多個列表按照以相同索引值為一組,重新組成一個新的多維度列表。 | zip(1px 2px 3px, solid dashed dotted, red green blue) 結(jié)果: 1px solid red, 2px dashed green, 3px dotted blue |
| Map(映射)函數(shù) | 說明 | 舉例 |
|---|---|---|
| Sass Map 是不可變的,因此在處理 Map 對象時,返回的是一個新的 Map 對象,而不是在原有的 Map 對象上進行修改。 | ||
| map-get(map, key) | 返回 Map 中 key 所對應(yīng)的 value(值)。如沒有對應(yīng)的 key,則返回 null 值。 |
|
| map-has-key(map, key) | 判斷 map 是否有對應(yīng)的 key,存在返回 true,否則返回 false。 |
|
| map-keys(map) | 返回 map 中所有的 key 組成的隊列。 |
|
| map-merge(map1, map2) | 合并兩個 map 形成一個新的 map 類型,即將 map2 添加到 map1的尾部 |
|
| map-remove(map, keys...) | 移除 map 中的 keys,多個 key 使用逗號隔開。 |
|
| map-values(map) | 返回 map 中所有的 value 并生成一個隊列。 |
|
| 選擇器函數(shù) | 說明 | 舉例 |
|---|---|---|
| is-superselector(super, sub) | 比較兩個選擇器匹配的范圍,即判斷 super 選擇器是否包含了 sub 選擇器所匹配的范圍,是的話返回 true,否則返回 false。 | is-superselector("div", "div.myInput") 結(jié)果: true |
| selector-append(selectors) | 將第二個 (也可以有多個) 添加到第一個選擇器的后面。 selector. | selector-append("div", ".myInput") 結(jié)果: div.myInput |
| selector-extend(selector, extendee, extender) | ||
| selector-nest(selectors) | 返回一個新的選擇器,該選擇器通過提供的列表選擇器生成一個嵌套的列表。 | selector-nest("ul", "li") 結(jié)果: ul li |
| selector-parse(selector) | 將字符串的選擇符 selector 轉(zhuǎn)換成選擇器隊列。 | selector-parse("h1 .myInput .warning") 結(jié)果: ('h1' '.myInput' '.warning') |
| selector-unify(selector1, selector2) | 將兩組選擇器合成一個復(fù)合選擇器。如兩個選擇器無法合成,則返回 null 值。 | selector-unify("myInput", ".disabled") 結(jié)果: myInput.disabled |
| simple-selectors(selectors) | 將合成選擇器拆為單個選擇器。 | simple-selectors("div.myInput") 結(jié)果: div, .myInput |
| 顏色函數(shù) | 說明 | 舉例 |
|---|---|---|
| rgb(red, green, blue) | 創(chuàng)建一個 Red-Green-Blue (RGB) 色。其中 R 是 "red" 表示紅色,而 G 是 "green" 綠色,B 是 "blue" 藍色。 | rgb(0, 0, 255); |
| rgba(red, green, blue, alpha) | 根據(jù)紅、綠、藍和透明度值創(chuàng)建一個顏色。 | rgba(0, 0, 255, 0.3); |
| hsl(hue, saturation, lightness) | 通過色相(hue)、飽和度(saturation)和亮度(lightness)的值創(chuàng)建一個顏色。 | hsl(120, 100%, 50%); // 綠色 |
| hsla(hue, saturation, lightness, alpha) | 通過色相(hue)、飽和度(saturation)、亮度(lightness)和透明(alpha)的值創(chuàng)建一個顏色。 | hsl(120, 100%, 50%, 0.3); // 綠色帶有透明度 |
| grayscale(color) | 將一個顏色變成灰色,相當(dāng)于 desaturate( color,100%)。 | grayscale(#7fffd4);結(jié)果: #c6c6c6 |
| complement(color) | 返回一個補充色,相當(dāng)于adjust-hue($color,180deg) | complement(#7fffd4); 結(jié)果: #ff7faa |
| invert(color, weight) | 返回一個反相色,紅、綠、藍色值倒過來,而透明度不變。 | invert(white); 結(jié)果: black |
| red(color) | 從一個顏色中獲取其中紅色值(0-255)。 | red(#7fffd4); 結(jié)果: 127 |
| green(color) | 從一個顏色中獲取其中綠色值(0-255)。 | green(#7fffd4); 結(jié)果: 255 |
| blue(color) | 從一個顏色中獲取其中藍色值(0-255)。 | blue(#7fffd4); 結(jié)果: 212 |
| hue(color) | 獲取一個顏色的飽和度值(0% - 100%)。 | saturation(#7fffd4); 結(jié)果: 100% |
| lightness(color) | 獲取一個顏色的亮度值(0% - 100%)。 | lightness(#7fffd4); 結(jié)果: 74.9% |
| alpha(color) | 透明度(0-1) | alpha(#7fffd4); 結(jié)果: 1 |
| opacity(color) | 獲取顏色透明度值(0-1)。 | opacity(rgba(127, 255, 212, 0.5); 結(jié)果: 0.5 |
| mix(color1, color2, weight) | 把兩種顏色混合起來。 weight 參數(shù)必須是 0% 到 100%。默認 weight 為 50%,表明新顏色各取 50% color1 和 color2 的色值相加。如果 weight 為 25%,那表明新顏色為 25% color1 和 75% color2 的色值相加。 | |
| adjust-hue(color, degrees) | 通過改變一個顏色的色相值(-360deg - 360deg),創(chuàng)建一個新的顏色。 | adjust-hue(#7fffd4, 80deg); 結(jié)果: #8080ff |
| adjust-color(color, red, green, blue, hue, saturation, lightness, alpha) | 這個函數(shù)能夠調(diào)整給定色彩的一個或多個屬性值,包括 RGB 和 HSL 色彩的各項色值參數(shù),另外還有 alpha 通道的取值。這些屬性值的調(diào)整依賴傳入的關(guān)鍵值參數(shù),通過這些參數(shù)再與給定顏色相應(yīng)的色彩值做加減運算。 | adjust-color(#7fffd4, blue: 25); |
| change-color(color, red, green, blue, hue, saturation, lightness, alpha) | 跟上面 adjust-color 類似,只是在該函數(shù)中傳入的參數(shù)將直接替換原來的值,而不做任何的運算。 | change-color(#7fffd4, red: 255); 結(jié)果: #ffffd4 |
| scale-color(color, red, green, blue, saturation, lightness, alpha) | 另一種實用的顏色調(diào)節(jié)函數(shù)。adjust-color 通過傳入的參數(shù)簡單的與本身的色值參數(shù)做加減,有時候可能會導(dǎo)致累加值溢出,當(dāng)然,函數(shù)會把結(jié)果控制在有效的閾值內(nèi)。而 scale-color 函數(shù)則避免了這種情況,可以不必擔(dān)心溢出,讓參數(shù)在閾值范圍內(nèi)進行有效的調(diào)節(jié)。 | 舉個例子,一個顏色的亮度 lightness 取值在 0% ~ 100% 之間,假如執(zhí)行 scale-color( |
| rgba(color, alpha) | 根據(jù)紅、綠、藍和透明度值創(chuàng)建一個顏色。 | rgba(#7fffd4, 30%); 結(jié)果: rgba(127, 255, 212, 0.3) |
| lighten(color, amount) | 通過改變顏色的亮度值(0% - 100%),讓顏色變亮,創(chuàng)建一個新的顏色。 | |
| darken(color, amount) | 通過改變顏色的亮度值(0% - 100%),讓顏色變暗,創(chuàng)建一個新的顏色。 | |
| saturate(color, amount) | 提高傳入顏色的色彩飽和度。等同于 adjust-color( color, saturation: amount) | |
| desaturate(color, amount) | 調(diào)低一個顏色的飽和度后產(chǎn)生一個新的色值。同樣,飽和度的取值區(qū)間在 0% ~ 100%。等同于 adjust-color(color, saturation: -amount) | |
| opacify(color, amount) | 降低顏色的透明度,取值在 0-1 之。等價于 adjust-color(color, alpha: amount) | |
| fade-in(color, amount) | 降低顏色的透明度,取值在 0-1 之。等價于 adjust-color(color, alpha: amount) | |
| transparentize(color, amount) | 提升顏色的透明度,取值在 0-1 之間。等價于 adjust-color(color, alpha: -amount) | |
| fade-out(color, amount) | 提升顏色的透明度,取值在 0-1 之間。等價于 adjust-color(color, alpha: -amount) |
| Introspection 函數(shù) | 說明(用于調(diào)試) | 舉例 |
|---|---|---|
| call(function, arguments...) | 函數(shù)的動態(tài)調(diào)用,即調(diào)用函數(shù) function,參數(shù)為 arguments,并返回結(jié)果。 | |
| content-exists() | 查看當(dāng)前的混入是否傳遞 @content 塊。 | |
| feature-exists(feature) | 檢查當(dāng)前的 Sass 實現(xiàn)是否支持該特性。 | feature-exists("at-error"); 結(jié)果: true |
| function-exists(functionname) | 檢測指定的函數(shù)是否存在 | function-exists("nonsense") 結(jié)果: false |
| get-function(functionname, css: false) | 返回指定函數(shù)。如果 css 為 true,則返回純 CSS 函數(shù)。 | |
| global-variable-exists(variablename) | 檢測某個全局變量是否定義。 | variable-exists(a) 結(jié)果: true |
| inspect(value) | 返回一個字符串的表示形式,value 是一個 sass 表達式。 | |
| mixin-exists(mixinname) | 檢測指定混入 (mixinname) 是否存在。 | mixin-exists("important-text") 結(jié)果: true |
| type-of(value) | 返回值類型。返回值可以是 number, string, color, list, map, bool, null, function, arglist。 | type-of(15px) 結(jié)果: number type-of(#ff0000) 結(jié)果: color |
| unit(number) | 返回傳入數(shù)字的單位(或復(fù)合單位)。 | unit(15px) 結(jié)果: px |
| unitless(number) | 返回一個布爾值,判斷傳入的數(shù)字是否帶有單位。 | unitless(15px) 結(jié)果: false |
| variable-exists(variablename) | 判斷變量是否在當(dāng)前的作用域下。 | variable-exists(b) 結(jié)果: true |