Sass->什么時候使用Mixins 和 Placeholders

原文:https://www.sitepoint.com/sass-mixin-placeholder/

一年半之前,我開始使用Sass的時候拉庵,對于include a mixinextending a placeholder的區(qū)別灿椅,我花費了一些時間去理解它們。
在那個時候钞支,單單placeholder的概念茫蛹,就已經相當于一種黑魔法巫術一樣讓我不知其解。

如果你有同樣的疑問烁挟,不要擔心婴洼,我接下來會說解釋指明它們之間的區(qū)別。今天我們會學到minxin是什么東西撼嗓,和什么時候去使用Sass的placeholder柬采。你會明白他們有不同的用處欢唾,不能混淆使用。

提醒:我接下來要談論的關于Sass的觀點粉捻,同樣適用于其他CSS預處理器礁遣,不管是Stylus,Less肩刃,還是其他的祟霍。技術大多做的是同樣的事情,所以完全不用擔心這篇文章的內容盈包,是否適合你已經選擇使用的其他CSS預編譯工具沸呐。

首先我們先去熟悉和認識 Sass placeholders and mixins

Mixin it up, 混合體,封裝體

一個mixin指令可以讓你去定義很多CSS規(guī)則呢燥。把它看做是一個function函數(shù)垂谢,方法,這個function可以有自己的參數(shù)疮茄。它會輸出這些css規(guī)則內容,而不是返回一個值根暑。下邊是來自Sass官方參考里定義:

Mixins 允許自己定義樣式力试,這些樣式可以在全局樣式表里重用,而不用去借助一些無語義的類排嫌,比如.float-left畸裳。Mixins可以包含完整的CSS樣式規(guī)則和其他Sass中的特性規(guī)則等。mixin還可以接收參數(shù)淳地,不同的參數(shù)值將產生不同的樣式規(guī)則怖糊。

在樣式表中,你會見到一些CSS規(guī)則聲明被重復出現(xiàn)了好多次颇象。你明白這樣的代碼不好伍伤,而且還知道DRY(Don't Repeat yourself)這個概念原則。現(xiàn)在使用mixin去改善這樣的代碼:

@mixin center() {
  display: block;
  margin-left: auto;
  margin-right: auto;
}
 
.container {
  @include center();
  /* Other styles here... */
}
 
/* Other styles... */
 
.image-cover {
  @include center;
}

提醒:include使用的時候遣钳,如果你不傳遞參數(shù)給mixin扰魂,那么可以去掉mixin名字后邊的括號。比如 @include center; 其實你也可以在mixin定義的時候就把括號去掉蕴茴。比如 @mixin center {}

定義了這個mixin之后劝评,你就不用每次去重復那三行元素居中的規(guī)則。使用的時候倦淀,就去包含這個mixin蒋畜。

在某些情況下,可以使用一個mixin去創(chuàng)建一些屬性組合的“縮寫”撞叽。例如 widthheight姻成。你應該已經厭倦了重復書寫這兩行屬性插龄。特別是當這兩個屬性值一樣的時候。現(xiàn)在我們就使用一個mixin來解決這些問題佣渴!

@mixin size($width, $height: $width) {
  width: $width;
  height: $height;
}

很簡單吧辫狼。這里我們設置hight屬性的默認值和width參數(shù)的值一樣。當你想定義一個元素的面積大小時辛润,你可以這樣做:

.icon {
  @include size(32px);
}
 
.cover {
  @include size(100%, 10em);
}

提醒:當我想去設置一個元素的position屬性時膨处,為了避免逐個書寫top, right, bottom, left這些屬性。也可以去使用mixin這種很好的語法糖砂竖。

認識 Placeholder(占位符)

Placeholders 是一種奇怪的東西真椿。它們是class,但是在Sass編譯過后乎澄,并不會被輸出突硝,出現(xiàn)在樣式表文件里。然后你會問它有什么意義置济。事實上解恰,如果不是為了@extend這個指令,它都沒什么意義浙于。你可以這樣去寫一個placeholder:

%center {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

提醒:Like a placholder, a mixin is likewise useless unless its referenced, so this section is not necessarily saying they are different in that respect, but this is only clarifying that even though it looks similar to a CSS declaration block, it won’t get compiled on its own.

placeholder的寫法使用%护盈,而不是.(點),但是遵守class的命名規(guī)則羞酗。

如果編譯Sass文件腐宋,placeholder的代碼不會出現(xiàn)在生成的css的文件里。正如我說過的檀轨,placeholder的代碼不會被編譯出現(xiàn)在css源文件里胸竞。

placeholder 要通過 @extend 去使用。@extend指令的作用是繼承一個CSS選擇器的屬性或者一個Sass的placeholder代碼参萄。例如:

.container {
  @extend %center;
}

這樣之后卫枝,Sass會獲得%center這個placeholder的內容給.container 這個類。

另外讹挎,你還可以extend一個CSS class剃盾,就像這樣:

.table-zebra {
  @extend .table;
 
  tr:nth-of-type(even) {
    background: rgba(0,0,0,.5);
  }
}

這是@extend的常用法。當你使用模塊組件化開發(fā)一個網站或者應用淤袜,繼承選擇器是便利的痒谴。

使用哪一個

我們應該使用哪一個,mixin還是placeholder铡羡。要看具體使用場景积蔚。
最好的建議是:如果你需要參數(shù)變量,使用mixin烦周。否則尽爆,繼承一個placehodler怎顾。這樣做兩個原因:

第一,在placeholder里面漱贱,不能像mixin那樣傳遞使用參數(shù)變量槐雾。但是可以使用全局變量。

第二幅狮,當你使用mixin時募强,Sass會重復輸出這個mixin的屬性規(guī)則內容,不會讓CSS選擇器公用這個mixin崇摄。這樣的話擎值,樣式表將會變得很大。

@mixin center {
  display: block;
  margin-left: auto;
  margin-right: auto;
}
 
.container {
  @include center;
}
 
.image-cover {
  @include center;
}

輸出如下:

.container {
  display: block;
  margin-left: auto;
  margin-right: auto;
}
 
.image-cover {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

看到重復的CSS了吧逐抑。如果只有三行代碼重復的話鸠儿,感覺好像問題還不是很糟糕。但是如果這個mixin有300行呢厕氨。重復的代碼就太多了进每。那讓我們使用placeholder改造一下這個示例:

%center {
  display: block;
  margin-left: auto;
  margin-right: auto;
}
 
.container {
  @extend %center;
}
 
.image-cover {
  @extend %center;
}

下邊是生成的CSS:

.container, 
.image-cover {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

看起來好多了吧。這樣就避免了總是重復相同的屬性規(guī)則命斧,使用placeholder品追,會讓整個樣式表文件很瘦。

另外冯丙,如果你在不同的地方都要使用一些屬性,但是這些屬性的值是變量決定的遭京,那么mixin是一個好的選擇胃惜。如果你的CSS屬性同時有固定的和變動的值,那么你可以組合使用mixin和placeholder哪雕。例如:

%center {
  margin-left: auto;
  margin-right: auto;
  display: block;
}
 
@mixin skin($color, $size) {
  @extend %center;
  background: $color;
  height: $size;
}
 
a { @include skin(pink, 10em) }
b { @include skin(blue, 90px) }

在這個示例里邊船殉,mixin繼承了placeholder, 生成了干凈不重復的CSS:

a, b {
  margin-left: auto;
  margin-right: auto;
  display: block;
}
 
a {
  background: pink;
  height: 10em;
}
 
b {
  background: blue;
  height: 90px;
}

總結

希望你已經清楚了什么是mixins和placeholders,而且知道什么時候去使用它們和它們編譯之后的效果斯嚎。

掃碼_搜索聯(lián)合傳播樣式-標準色版.png
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末利虫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子堡僻,更是在濱河造成了極大的恐慌糠惫,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钉疫,死亡現(xiàn)場離奇詭異硼讽,居然都是意外死亡,警方通過查閱死者的電腦和手機牲阁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門固阁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壤躲,“玉大人,你說我怎么就攤上這事备燃〉锟耍” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵并齐,是天一觀的道長漏麦。 經常有香客問我,道長冀膝,這世上最難降的妖魔是什么唁奢? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮窝剖,結果婚禮上麻掸,老公的妹妹穿的比我還像新娘。我一直安慰自己赐纱,他們只是感情好脊奋,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疙描,像睡著了一般诚隙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上起胰,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天久又,我揣著相機與錄音,去河邊找鬼效五。 笑死地消,一個胖子當著我的面吹牛,可吹牛的內容都是我干的畏妖。 我是一名探鬼主播脉执,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼戒劫!你這毒婦竟也來了半夷?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤迅细,失蹤者是張志新(化名)和其女友劉穎巫橄,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茵典,經...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡嗦随,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枚尼。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡贴浙,死狀恐怖,靈堂內的尸體忽然破棺而出署恍,到底是詐尸還是另有隱情崎溃,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布盯质,位于F島的核電站袁串,受9級特大地震影響,放射性物質發(fā)生泄漏呼巷。R本人自食惡果不足惜囱修,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望王悍。 院中可真熱鬧破镰,春花似錦、人聲如沸压储。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽集惋。三九已至孕似,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間刮刑,已是汗流浹背喉祭。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雷绢,地道東北人泛烙。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像习寸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子傻工,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內容