scss學(xué)習(xí)筆記

一、scss是什么恳蹲?

Sass 有兩種語(yǔ)法格式峡懈。首先是 SCSS (Sassy CSS) ,也是本參考資料示例所使用的格式 , 這種格式僅在 CSS3 語(yǔ)法的基礎(chǔ)上進(jìn)行擴(kuò)展,這意味著每個(gè)CSS樣式表是一個(gè)同等的SCSS文件腺律。此外奕短,SCSS 也支持大多數(shù) CSS hacks 寫法 以及瀏覽器專屬前綴語(yǔ)法 (vendor-specific syntax)宜肉,例如匀钧,IE 古老的 filter 語(yǔ)法。 這種語(yǔ)法的樣式表文件需要以 .scss 作為拓展名谬返。
另一種之斯,也是最早的語(yǔ)法,被稱為縮進(jìn)語(yǔ)法 (Indented Sass)遣铝,或者通常說(shuō)的 "Sass"佑刷,它提供了一種更加簡(jiǎn)介的方式來(lái)書寫CSS。它使用縮進(jìn)而不是花括號(hào)來(lái)表示選擇器的嵌套酿炸,用換行而不是分號(hào)來(lái)分隔屬性瘫絮,一些人認(rèn)為這樣做比 SCSS 更容易閱讀,書寫也更快速填硕。 縮排語(yǔ)法具有 Sass 的所有特色功能麦萤, 雖然有些語(yǔ)法上稍有差異; 具體差異在縮進(jìn)語(yǔ)法參考中都有描述扁眯。 使用此種語(yǔ)法的樣式表文件需要以 .sass 作為擴(kuò)展名壮莹。

二、引用父選擇器:&

有些時(shí)候需要直接使用嵌套外層的父選擇器姻檀,這個(gè)就很有用了命满,例如,你可能喜歡給選擇器指定 hover樣式绣版,或者當(dāng)body元素具有某個(gè)樣式時(shí)胶台,在這些情況下,你可以 & 字符來(lái)明確地表示插入指定父選擇器杂抽。 例如:

a {
  font-weight: bold;
  text-decoration: none;
  &:hover { text-decoration: underline; }
  body.firefox & { font-weight: normal; }
}
編譯為:
a {
   font-weight: bold;
   text-decoration: none;
 }
a:hover {
  text-decoration: underline;
}
body.firefox a {
  font-weight: normal;
 }

&將替換為呈現(xiàn)在CSS文件中的父選擇器诈唬。這意味著,如果你有一個(gè)多層嵌套的規(guī)則默怨,父選擇器將在被&替換之前完全分解讯榕。 例如:

.main {
  color: black;
  a {
    font-weight: bold;
    &:hover { color: red; }
  }
}
編譯成:
.main {
  color: black; 
}
.main a {
    font-weight: bold;
 }
.main a:hover {
      color: red;
 }

& 必須出現(xiàn)在的選擇器的開頭位置(注:也就是作為選擇器的第一個(gè)字符),但可以跟隨后綴匙睹,將被添加到父選擇的后面愚屁。 例如:

.main {
  color: black;
  &-sidebar { border: 1px solid; }
}
編譯為:
.main {
  color: black; 
}
.main-sidebar {
    border: 1px solid;
 }

三、嵌套屬性

CSS中有一些屬性遵循相同的“命名空間”痕檬;比如霎槐,font-family, font-size, 和 font-weight都在font命名空間中。在CSS中梦谜,如果你想在同一個(gè)命名空間中設(shè)置一串屬性丘跌,你必須每次都輸出來(lái)袭景。Sass為此提供了一個(gè)快捷方式:只需要輸入一次命名空間,然后在其內(nèi)部嵌套子屬性闭树。例如:

.funky {
  font: {
    family: fantasy;
    size: 30em;
    weight: bold;
  }
}
編譯為:
.funky {
  font-family: fantasy;
  font-size: 30em;
  font-weight: bold;
 }

命名空間也可以有自己的屬性值耸棒。例如:

.funky {
  font: 20px/24px fantasy {
    weight: bold;
  }
}
編譯為:
.funky {
  font: 20px/24px fantasy;
  font-weight: bold;
}

四、變量 $

SassScript 最普遍的用法就是變量报辱,變量以美元符號(hào)開頭与殃,賦值方法與 CSS 屬性的寫法一樣:

$width: 5em;

變量支持塊級(jí)作用域,嵌套規(guī)則內(nèi)定義的變量只能在嵌套規(guī)則內(nèi)使用(局部變量)碍现,不在嵌套規(guī)則內(nèi)定義的變量則可在任何地方使用(全局變量)幅疼。將局部變量轉(zhuǎn)換為全局變量可以添加 !global 聲明:

.main {
  $width: 5em !global;
  width: $width;
}

.sidebar {
  width: $width;
}

五、數(shù)據(jù)類型

SassScript 支持 6 種主要的數(shù)據(jù)類型:
數(shù)字:1, 2, 13, 10px
字符串:有引號(hào)字符串與無(wú)引號(hào)字符串昼接,"foo", 'bar', baz
顏色:blue, #04a3f9, rgba(255,0,0,0.5)
布爾型:true, false
空值:null
數(shù)組 (list):用空格或逗號(hào)作分隔符,1.5em 1em 0 2em, Helvetica, Arial, sans-serif
maps, 相當(dāng)于 JavaScript 的 object爽篷,(key1: value1, key2: value2)

六、運(yùn)算

所有數(shù)據(jù)類型均支持相等運(yùn)算 == 或 !=慢睡,此外逐工,每種數(shù)據(jù)類型也有其各自支持的運(yùn)算方式。
SassScript 支持?jǐn)?shù)字的加減乘除一睁、取整等運(yùn)算 (+, -, *, /, %)钻弄,如果必要會(huì)在不同單位間轉(zhuǎn)換值。
如果需要使用變量者吁,同時(shí)又要確保 / 不做除法運(yùn)算而是完整地編譯到 CSS 文件中窘俺,只需要用 #{} 插值語(yǔ)句將變量包裹。

p {
  $font-size: 12px;
  $line-height: 30px;
  font: #{$font-size}/#{$line-height};
}
編譯為
p {
  font: 12px/30px; 
}

運(yùn)算注意事項(xiàng):

以下三種情況 / 將被視為除法運(yùn)算符號(hào):

  • 如果值复凳,或值的一部分瘤泪,是變量或者函數(shù)的返回值
  • 如果值被圓括號(hào)包裹
  • 如果值是算數(shù)表達(dá)式的一部分

如果需要使用變量,同時(shí)又要確保 / 不做除法運(yùn)算而是完整地編譯到 CSS 文件中育八,只需要用 #{} 插值語(yǔ)句將變量包裹对途。

p {
  $font-size: 12px;
  $line-height: 30px;
  font: #{$font-size}/#{$line-height};
}
編譯為
p {
  font: 12px/30px;
}

字符串運(yùn)算

+” 號(hào)可用于連接字符串

p {
  cursor: e + -resize;
}
編譯為
p {
  cursor: e-resize;
}

注意:字符串在“+”號(hào)左邊,編譯的結(jié)果會(huì)帶引號(hào)髓棋,字符串在“+”號(hào)右側(cè)实檀,編譯的結(jié)果不會(huì)帶引號(hào)。

嵌套 @import

大多數(shù)情況下按声,一般在文件的最外層(不在嵌套規(guī)則內(nèi))使用 @import膳犹,其實(shí),也可以將 @import 嵌套進(jìn) CSS 樣式或者 @media 中签则,與平時(shí)的用法效果相同须床,只是這樣導(dǎo)入的樣式只能出現(xiàn)在嵌套的層中。

假設(shè) example.scss 文件包含以下樣式:

.example {
  color: red;
}
然后導(dǎo)入到 .main 樣式內(nèi)
.main {
  @import "example";
}
編譯為
.main .example {
  color: red;
}

@extend

在設(shè)計(jì)網(wǎng)頁(yè)的時(shí)候常常遇到這種情況:一個(gè)元素使用的樣式與另一個(gè)元素完全相同渐裂,但又添加了額外的樣式豺旬。通常會(huì)在 HTML 中給元素定義兩個(gè) class钠惩,一個(gè)通用樣式,一個(gè)特殊樣式族阅。假設(shè)現(xiàn)在要設(shè)計(jì)一個(gè)普通錯(cuò)誤樣式與一個(gè)嚴(yán)重錯(cuò)誤樣式篓跛,一般會(huì)這樣寫:

<div class="error seriousError">
  Oh no! You've been hacked!
</div>
樣式如下
.error {
  border: 1px #f00;
  background-color: #fdd;
}
.seriousError {
  border-width: 3px;
}

麻煩的是,這樣做必須時(shí)刻記住使用 .seriousError 時(shí)需要參考 .error 的樣式耘分,帶來(lái)了很多不變:智能比如加重維護(hù)負(fù)擔(dān)举塔,導(dǎo)致 bug,或者給 HTML 添加無(wú)語(yǔ)意的樣式求泰。使用 @extend 可以避免上述情況,告訴 Sass 將一個(gè)選擇器下的所有樣式繼承給另一個(gè)選擇器计盒。

.error {
  border: 1px #f00;
  background-color: #fdd;
}
.seriousError {
  @extend .error;
  border-width: 3px;
}

上面代碼的意思是將 .error 下的所有樣式繼承給 .seriousError渴频,border-width: 3px; 是單獨(dú)給 .seriousError 設(shè)定特殊樣式,這樣北启,使用 .seriousError 的地方可以不再使用 .error卜朗。

@extend-Only 選擇器 (@extend-Only Selectors)

有時(shí),需要定義一套樣式并不是給某個(gè)元素用咕村,而是只通過(guò) @extend 指令使用场钉,尤其是在制作 Sass 樣式庫(kù)的時(shí)候,希望 Sass 能夠忽略用不到的樣式懈涛。
如果使用普通的 CSS 規(guī)則逛万,最后會(huì)編譯出很多用不到的樣式,也容易與其他樣式名沖突批钠,所以宇植,Sass 引入了“占位符選擇器” (placeholder selectors),看起來(lái)很像普通的 id 或 class 選擇器埋心,只是 # 或 . 被替換成了 %指郁。可以像 class 或者 id 選擇器那樣使用拷呆,當(dāng)它們單獨(dú)使用時(shí)闲坎,不會(huì)被編譯到 CSS 文件中。

.context a%extreme {
  color: blue;
  font-weight: bold;
  font-size: 2em;
}
占位符選擇器需要通過(guò)延伸指令使用茬斧,用法與 class 或者 id 選擇器一樣腰懂,被延伸后,占位符選擇器本身不會(huì)被編譯啥供。
.notice {
  @extend %extreme;
}
編譯為
.context a.notice {
  color: blue;
  font-weight: bold;
  font-size: 2em;
}

!optional 聲明 (The !optional Flag)

如果 @extend 失敗會(huì)收到錯(cuò)誤提示悯恍,比如,這樣寫 a.important {@extend .notice}伙狐,當(dāng)沒有 .notice 選擇器時(shí)涮毫,將會(huì)報(bào)錯(cuò)瞬欧,只有 h1.notice 包含 .notice 時(shí)也會(huì)報(bào)錯(cuò),因?yàn)?h1 與 a 沖突罢防,會(huì)生成新的選擇器艘虎。
如果要求 @extend 不生成新選擇器,可以通過(guò) !optional 聲明達(dá)到這個(gè)目的咒吐,例如:

a.important {
  @extend .notice !optional;
}

@if

當(dāng)@if 的表達(dá)式返回值不是 false 或者 null 時(shí)野建,條件成立,輸出 {} 內(nèi)的代碼:

p {
  @if 1 + 1 == 2 { border: 1px solid; }
  @if 5 < 3 { border: 2px dotted; }
  @if null  { border: 3px double; }
}
編譯為

p {
  border: 1px solid;
}

@if 聲明后面可以跟多個(gè) @else if 聲明恬叹,或者一個(gè) @else 聲明候生。如果 @if 聲明失敗,Sass 將逐條執(zhí)行 @else if 聲明绽昼,如果全部失敗唯鸭,最后執(zhí)行 @else 聲明,例如:

$type: monster;
p {
  @if $type == ocean {
    color: blue;
  } @else if $type == matador {
    color: red;
  } @else if $type == monster {
    color: green;
  } @else {
    color: black;
  }
}
編譯為

p {
  color: green;
}

七硅确、@for

@for 指令可以在限制的范圍內(nèi)重復(fù)輸出格式目溉,每次按要求(變量的值)對(duì)輸出結(jié)果做出變動(dòng)。這個(gè)指令包含兩種格式:@for var from <start> through <end>菱农,或者 @forvar from <start> to <end>缭付,區(qū)別在于 through 與 to 的含義:當(dāng)使用 through 時(shí),條件范圍包含 <start> 與 <end> 的值循未,而使用 to 時(shí)條件范圍只包含 <start> 的值不包含 <end> 的值陷猫。另外,var 可以是任何變量只厘,比如i烙丛;<start> 和 <end> 必須是整數(shù)值。

@for $i from 1 through 3 {
  .item-#{$i} { width: 2em * $i; }
}
編譯為
.item-1 {
  width: 2em;
}
.item-2 {
  width: 4em;
}
.item-3 {
  width: 6em;
}

八羔味、@each

image.png
@each $animal in puma, sea-slug, egret, salamander {
  .#{$animal}-icon {
    background-image: url('/images/#{$animal}.png');
  }
}
編譯為
.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');
}

九河咽、@while

@while 指令重復(fù)輸出格式直到表達(dá)式返回結(jié)果為 false。這樣可以實(shí)現(xiàn)比 @for 更復(fù)雜的循環(huán)赋元,只是很少會(huì)用到忘蟹。例如:

$i: 6;
@while $i > 0 {
  .item-#{$i} { width: 2em * $i; }
  $i: $i - 2;
}
.item-6 {
  width: 12em;
}
.item-4 {
  width: 8em;
}
.item-2 {
  width: 4em;
}

混合指令

混合指令 (Mixin Directives)
混合指令(Mixin)用于定義可重復(fù)使用的樣式,避免了使用無(wú)語(yǔ)意的 class搁凸,比如 .float-left媚值。混合指令可以包含所有的 CSS 規(guī)則护糖,絕大部分 Sass 規(guī)則褥芒,甚至通過(guò)參數(shù)功能引入變量,輸出多樣化的樣式。
定義混合指令 @mixin (Defining a Mixin: @mixin)
混合指令的用法是在 @mixin 后添加名稱與樣式锰扶,比如名為 large-text 的混合通過(guò)下面的代碼定義:

@mixin large-text {
  font: {
    family: Arial;
    size: 20px;
    weight: bold;
  }
  color: #ff0000;
}

引用混合樣式 @include (Including a Mixin: @include)
使用 @include 指令引用混合樣式献酗,格式是在其后添加混合名稱,以及需要的參數(shù)(可選):

.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; }

也可以在最外層引用混合樣式坷牛,不會(huì)直接定義屬性罕偎,也不可以使用父選擇器。

@mixin silly-links {
  a {
    color: blue;
    background-color: red;
  }
}
@include silly-links;

編譯為:
a {
  color: blue;
  background-color: red;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末京闰,一起剝皮案震驚了整個(gè)濱河市颜及,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蹂楣,老刑警劉巖俏站,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異捐迫,居然都是意外死亡乾翔,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門施戴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人萌丈,你說(shuō)我怎么就攤上這事赞哗。” “怎么了辆雾?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵肪笋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我度迂,道長(zhǎng)藤乙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任惭墓,我火速辦了婚禮坛梁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腊凶。我一直安慰自己划咐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布钧萍。 她就那樣靜靜地躺著褐缠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪风瘦。 梳的紋絲不亂的頭發(fā)上队魏,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音万搔,去河邊找鬼胡桨。 笑死官帘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的登失。 我是一名探鬼主播遏佣,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼揽浙!你這毒婦竟也來(lái)了状婶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤馅巷,失蹤者是張志新(化名)和其女友劉穎膛虫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钓猬,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稍刀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敞曹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片账月。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖澳迫,靈堂內(nèi)的尸體忽然破棺而出局齿,到底是詐尸還是另有隱情,我是刑警寧澤橄登,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布抓歼,位于F島的核電站,受9級(jí)特大地震影響拢锹,放射性物質(zhì)發(fā)生泄漏谣妻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一卒稳、第九天 我趴在偏房一處隱蔽的房頂上張望蹋半。 院中可真熱鬧,春花似錦展哭、人聲如沸湃窍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)您市。三九已至,卻和暖如春役衡,著一層夾襖步出監(jiān)牢的瞬間茵休,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留榕莺,地道東北人俐芯。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像钉鸯,于是被迫代替她去往敵國(guó)和親吧史。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容