理解Sass的選擇佔位符 placeholder

2021-06-26 16:12:40 字數 3009 閱讀 5403

——譯者:大漠

sass中提供多種方法來共用相同的css**。你可以使用@include定義好的@mixin在你的css樣式中插入新的css樣式,你也可以使用@extend定義好的css類選擇器,向你的css樣式中插入新的css樣式。在sass3.2中引入了乙個新的特性——選擇器佔位符「%placeholder」,能過@extend可以得到更有效的輸出。

在開始介紹%placeholder之前,我們先來了解一下sass中@extend是如何工作的。

使用@extend我們可以使用css中的定義好的選擇器,下面的例子可以很好的說明一切:

.icon 

.error-icon

.info-icon

上面的scss**將編譯的css**如下:

.icon, .error-icon, .info-icon 

.error-icon

.info-icon

這是怎麼回事?通過@extend可以直接在.error-icon.info-icon中插入定義好的.icon屬性。只要你修改了.icon樣式,.error-icon.info-icon也會做出對應的變化。非常完美,對不對?

很有興的乙個地方。如果我們在html中從來不使用.icon,其存在的唯一目的就是為了擴充套件嗎?這似乎比我們需要的基本樣式稍大些,因為我們將永遠不會使用.icon對應的樣式。其實在sass3.2開始,我們可以通過使用選擇器佔位符%placeholder來解決這種現象。

選擇器佔位符%placeholder可以很好的解決上面提到的問題。選擇器佔位符很類似於css的類,不同的是他不是使用(.)開始,而是使用(%)開始,而且編譯出來的css**中並不會包括%placeholder規則中的樣式,除非是通過@extend對其進行呼叫。

回到當初的示例,如果我們定義的圖示樣式如下:

%icon 

.error-icon

.info-icon

編譯出的css:

.error-icon, .info-icon 

.error-icon

.info-icon

請注意,編譯出來的css**中將不再包括.icon了。

乍一看,選擇器佔位符%placeholder看起來和具有相同引數的@mixin一樣。雖然從功能上來說(在瀏覽器上渲染的效果是完全相同的)他們是相同,但編譯出來的css卻大大的不同。

請考慮使用@mixin .icon來實現上面示例的效果:

@mixin icon 

.error-icon

.info-icon

編譯出來的css:

.error-icon 

.info-icon

僅從維護的角度來說,這是乙個很好的擴充套件的示例,但編譯出來的css實在是糟糕,因為編譯出來的css樣式,沒有把相同的樣式合併在一起。

使用@extend呼叫定義好的選擇器佔位符%placeholder有所限制,他不能在不同的@media中執行。

如下面的示例:

%icon 

@media screen

.info-icon

}

此時編譯你的scss檔案時,編譯器將會報錯:

>>> sass is watching for changes. press ctrl-c to stop.

error test.scss (line 3: you may not @extend an outer selector from within @media.

you may only @extend selectors within the same directive.

from "@extend %icon" on line 10 of test.scss.

)

當我第一次碰到這個限制時,我以為這是乙個錯誤。然而有乙個很好的理由,sass為什麼要這樣工作。

因為@extend是將乙個選擇器樣式擴充套件到另乙個選擇器當中,而實際上在不同的@media中卻無需複製這些樣式。

雖然他可以通過其他的方式來工作,在@media塊中定義選擇器佔位符,在@extend呼叫時,將會將整個樣式包含在@media區塊中:

@media screen 

}.error-icon

.info-icon

編譯出的css:

@media screen 

}

@extend@include都具有強大的功能,儘管細節上有一些差別,這就要問你自己,編譯出來的css樣式,接近重用的樣式對你是不是很重要。在某些情況下,@extend可以大大的減化你的css輸出,並且顯著的提高你的css效能。

譯者手語:整個翻譯依照原文線路進行,並在翻譯過程略加了個人對技術的理解。如果翻譯有不對之處,還煩請同行朋友指點。謝謝!

英文原文:

中文譯文:

Sass之混合巨集 繼承 佔位符

1 混合巨集。當樣式變得越來越複雜,需要重複使用大段的樣式時,使用變數就無法達到我們目的了。這個時候混合巨集就派上用場了。而使用混合巨集時,首先要宣告混合巨集,而宣告混合巨集時有兩種,不帶引數混合巨集和帶引數混合巨集兩種。1.1不帶引數混合巨集的宣告 mixin border radius例如在乙個...

Sass 混合巨集 VS 繼承 VS 佔位符

什麼時候用混合巨集,什麼時候用繼承,什麼時候使用佔位符?其實他們各有各的優點與缺點,先來看看他們使用效果 a sass 中的混合巨集使用 總結 編譯出來的 css 清晰告訴了大家,他不會自動合併相同的樣式 如果在樣式檔案中呼叫同乙個混合巨集,會產生多個對應的樣式 造成 的冗餘,這也是 csser 無...

佔位符的使用

preparestatement介面改善問題 佔位符 演示 使用statement介面物件傳送的sql語句需要在資料庫中進行一次編譯之後成為指令才能執行,每條sql語句都需要編譯一次,這樣是很慢的。使用statement介面才做的sql可以需要使用字串拼接的方式實現,這樣的方式可能存在sql注入的安...