(二)sass的@mixin

為了有效的維護(hù)和開發(fā)項(xiàng)目,代碼的重復(fù)利用就顯得尤為重要覆享。在Sass中营袜,除了@import@extend可以使你的代碼更加具有重復(fù)利用性荚板,@mixin指令也同樣能提高你代碼的重復(fù)使用率并簡(jiǎn)化你的代碼。

@extend指令通過繼承從而簡(jiǎn)化了代碼拧抖,但是它也有缺陷之處罚斗,首先是不夠靈活宅楞,其次它還會(huì)將你不需要的其他地方具有相同類名的樣式都繼承過來。

@mixin指令是另一種簡(jiǎn)化代碼的方法距淫。Mixins可以包含任意內(nèi)容且可以傳遞參數(shù)婶希,因此比@extend更加靈活和強(qiáng)大喻杈。

定義Mixins

通過@mixin加名稱的方式就可以定義一個(gè)Mixins模塊,在模塊內(nèi)你可以添加任何你想重復(fù)使用的樣式缴啡。

@mixin button {  
    font-size: 1em;  
    padding: 0.5em 1.0em;  
    text-decoration: none;  
    color: #fff;  
}

由于歷史原因瓷们,連字符和下劃線被認(rèn)為是相同的秒咐,也就是說 @mixin button-large { }@mixin button_large { } 是一樣的碘裕。

@mixin link {  
    a {  
        color: blue;

        &:visited {
            color: purple;
        }  
        &:hover {
            color: white;
        }  
        &:active {
            color: red;
        }  
    }
}

使用@mixin指令

你可以通過@include來調(diào)用具有相同名稱的mixin模塊帮孔。

.button-green {  
    @include button;  
    background-color: green;  
}

比如通過@include調(diào)用我之前創(chuàng)建名為button的mixin模塊,那么解析后的CSS就如下所示:

.button-green {  
    font-size: 1em;  
    padding: 0.5em 1.0em;  
    text-decoration: none;  
    color: #fff;  
    background-color: green;  
}

正如你所預(yù)期的那樣惊豺,@include被名為button的混合模塊內(nèi)的樣式所取代禽作。同時(shí)我在.button-green中添加的background-color樣式依然保留著旷偿。

在mixin模塊的定義中還可以包含其他的mixin。比如:

@mixin button-blue {  
    @include button;  
    @include link;  
}

所以你可以通過以包含多種簡(jiǎn)單mixin模塊的方式創(chuàng)建較為復(fù)雜的mixin模塊幢妄。
當(dāng)Mixins模塊包含選擇器和規(guī)則集茫负,也就是mixins包含的內(nèi)容本身就是有效的CSS樣式時(shí),他們就可以在其他規(guī)則集外被調(diào)用潮尝。比如本文之前創(chuàng)建的名為link的mixin模塊:

@mixin link {  
    a {  
        color: blue;

        &:visited {
            color: purple;
        }  
        &:hover {
            color: white;
        }  
        &:active {
            color: red;
        }  
    }
}

之后我們可以直接調(diào)用這個(gè)模塊饿序,即使不在一個(gè)選擇器內(nèi)原探。

@include link;

這段代碼將會(huì)被解析為:

a {  
    color: blue;

    &:visited {
        color: purple;
    }  
    &:hover {
        color: white;
    }  
    &:active {
        color: red;
    }  
}

之所以能這樣調(diào)用是因?yàn)檫@個(gè)mixin模塊內(nèi)既包含了選擇器也包含了樣式,如果沒有選擇器徒蟆,那么編譯后將不會(huì)有內(nèi)容顯示型型。比如我們?cè)谶x擇器外直接調(diào)用button這個(gè)mixin模塊,那么將不會(huì)有東西被編譯戚哎。

@mixin button {  
    font-size: 1em;  
    padding: 0.5em 1.0em;  
    text-decoration: none;  
    color: #fff;  
}

@include button;

不會(huì)被編譯是因?yàn)槟愕臉邮經(jīng)]有被應(yīng)用到任何元素上。

參數(shù)的使用

Mixins可以接收和使用參數(shù)丈冬,這使得它比 @extend更加強(qiáng)大和靈活甘畅。我更新了之前的button模塊疏唾,增加了名為background的參數(shù)并將其傳遞給模塊。

@mixin button($background) {  
    font-size: 1em;  
    padding: 0.5em 1.0em;  
    text-decoration: none;  
    color: #fff;  
    background: $background;  
}

注意到參數(shù)被設(shè)置為一個(gè)變量并成為backround屬性的值喉童。如果我們想創(chuàng)建一個(gè)綠色的按鈕顿天,那么就可以使用以下代碼:

.button-green {  
    @include button(green);  
}

當(dāng)Sass被編譯時(shí),值green就被傳遞給@mixin成為變量$backround的值咽白。編譯后的代碼如下:

.button-green {  
    font-size: 1em;  
    padding: 0.5em 1.0em;  
    text-decoration: none;  
    color: #fff;  
    background: green;  
}

你還可以在@mixin@include中傳遞多個(gè)參數(shù)鸟缕,參數(shù)間用逗號(hào)隔開。比如:

@mixin button($background, $color) {  
    font-size: 1em;  
    padding: 0.5em 1.0em;  
    text-decoration: none;  
    color: $color;  
    background: $background;  
}

.button-green {  
    @include button(green, #fff);  
}

給參數(shù)設(shè)置默認(rèn)值

你可能會(huì)好奇如果在定義mixin時(shí)定義了參數(shù)授段,但是在@include調(diào)用時(shí)沒有傳遞參數(shù)會(huì)發(fā)生什么莫绣。這種情況下你會(huì)收到一個(gè)編譯錯(cuò)誤的提示。同時(shí)我相信這種情況一定不是你想看到的。你可以通過在mixin中定義參數(shù)的時(shí)候給它設(shè)置一個(gè)默認(rèn)值掩宜,從而來避免這種錯(cuò)誤么翰。

@mixin button($background: green) {  
    font-size: 1em;  
    padding: 0.5em 1.0em;  
    text-decoration: none;  
    color: #fff;  
    background: $background;  
}

現(xiàn)在如果你在調(diào)用的時(shí)候忘記傳遞參數(shù)值

.button-green {  
    @include button;  
}

你的代碼將會(huì)使用你設(shè)置的參數(shù)默認(rèn)值來解析,在這個(gè)例子中也就是green這個(gè)值檐迟。

.button-green {  
    font-size: 1em;  
    padding: 0.5em 1.0em;  
    text-decoration: none;  
    color: #fff;  
    background: green;  
}

當(dāng)然,你也可以通過提供一個(gè)參數(shù)值來覆蓋這個(gè)默認(rèn)值溶其。

.button-blue {  
    @include button(blue);  
}

這時(shí)將會(huì)使用你提供的值來編譯代碼

.button-blue {  
    font-size: 1em;  
    padding: 0.5em 1.0em;  
    text-decoration: none;  
    color: #fff;  
    background: blue;  
}

關(guān)鍵字參數(shù)

為了幫助你的代碼更加容易理解敦间,你可以在傳遞值給mixin時(shí)將參數(shù)名稱和參數(shù)值一并傳遞過去廓块。

.button-green {  
    @include button($background: green, $color: #fff);  
}

關(guān)鍵字參數(shù)會(huì)額外增加一些代碼,但是這會(huì)使得你的@include更加容易理解昔汉。比如拴清,上面那段代碼就比下面這段代碼更加容易理解,因?yàn)樯厦娴拇a明確指出了green#fff分別是什么嫡秕。

.button-green {  
    @include button(green, #fff);  
}

雖然選擇器的名稱給了我們一些線索苹威,可以大概推斷出第一個(gè)參數(shù)代表什么牙甫,但是對(duì)于第二個(gè)參數(shù)卻沒有任何提示作用,而且一年后你很可能不會(huì)再記得這個(gè)參數(shù)的含義窟哺。

一起傳遞關(guān)鍵字名稱和值也被稱為命名參數(shù)且轨,你也可以以任意順序傳遞命名參數(shù)。下面兩種傳遞方式解析后會(huì)得到相同的結(jié)果泳挥。

.button-green {  
    @include button($background: green, $color: #fff);  
}

.button-green {  
    @include button($color: #fff, $background: green);  
}

數(shù)量可變的參數(shù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屉符,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子唆香,更是在濱河造成了極大的恐慌吨艇,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虑凛,死亡現(xiàn)場(chǎng)離奇詭異软啼,居然都是意外死亡祸挪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門雹仿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來整以,“玉大人,你說我怎么就攤上這事邑商》惭粒” “怎么了朝蜘?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)暇仲。 經(jīng)常有香客問我枣抱,道長(zhǎng)佳晶,這世上最難降的妖魔是什么讼载? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮菇篡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嗜暴。我一直安慰自己议蟆,他們只是感情好咐容,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著路狮,像睡著了一般蔚约。 火紅的嫁衣襯著肌膚如雪苹祟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天锰悼,我揣著相機(jī)與錄音团赏,去河邊找鬼箕般。 笑死,一個(gè)胖子當(dāng)著我的面吹牛舔清,可吹牛的內(nèi)容都是我干的丝里。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼体谒,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼杯聚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抒痒,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤幌绍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體傀广,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年伪冰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了誓酒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贮聂,死狀恐怖靠柑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吓懈,我是刑警寧澤歼冰,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站骄瓣,受9級(jí)特大地震影響停巷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜榕栏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一畔勤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扒磁,春花似錦庆揪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兰伤,卻和暖如春内颗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背敦腔。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工均澳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人符衔。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓找前,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親判族。 傳聞我的和親對(duì)象是個(gè)殘疾皇子躺盛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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