@extend的使用會產生以下結果css
.a{
color: red
}
.b{
@extend .a;
}
<!--編譯後-->
.a, .b {
color: red;
}
複製代碼
若是咱們把不但願@extend擴展的屬性產生實質性的做用 ,只是想要單純的使用它,就像mixin那樣,應該怎麼辦?這個時候%(佔位符)就登場了。%
表明任意的css選擇器,%a
多是.a
,#a
...。而且經過佔位符編寫的樣式不會出如今編譯後的文件中,除非經過@extend擴展。bash
看這個例子:url
%aa{
color: red
}
.bb{
@extend %aa
}
.cc{
@extend %aa
}
<!--編譯後-->
.cc, .bb {
color: red;
}
複製代碼
經過觀察咱們發現%aa僅僅做爲一個相似於樣式變量的形式存在,並不會編譯到css文件中。spa
而且,跟mixin有個很大的區別,@extend的樣式並不會簡單的複製到引用它的位置,而是經過合理的複用避免相同@extend
樣式的重複。code
在看一個奇怪的例子繼承
.a .b%abc{
color: red;
}
.test .ccc{
@extend %abc;
}
複製代碼
這段scss編譯後的結果回事怎樣的?作用域
<!--編譯後-->
.a .test .b.ccc, .test .a .b.ccc {
color: red;
}
複製代碼
好像跟預想的不同,實際上@extend是讓一個選擇器繼承被引用的選擇器的全部樣式,包括其樣式的做用域,被包含的樣式等。有點相似於深拷貝的意思,至關於被繼承樣式的整個父子關係都被拷貝給繼承樣式。繼承樣式一樣有本身的父子關係,要在一個繼承樣式上雜揉原有的父子關係和繼承而來的父子關係,有的時候會產生不肯定的情形,因此須要把全部的可能性都編譯成css的結果。scss
上面的例子中,b%abc是在.a的做用域內起做用。而繼承它的.ccc
是在·test
做用域內起做用,而.a .test .b.ccc, .test .a .b.cc
同時知足上述條件,因此必須將兩種可能都考慮進來。string
下面換一種寫法:io
.a>.b%abc{
color: red;
}
.test .ccc{
@extend %abc;
}
複製代碼
可能咱們就能猜到結果了,
.test .a > .b.ccc {
color: red;
}
複製代碼
這是因爲>
的加入讓結果變得惟一肯定。
在看一個例子
.error {
border: 1px #f00;
background-color: #fdd;
}
.error.intrusion {
background-image: url("/image/hacked.png");
}
.seriousError {
@extend .error;
border-width: 3px;
}
複製代碼
編譯的結果是會包含被引用樣式的子樣式的。
.error, .seriousError {
border: 1px #f00;
background-color: #fdd; }
.error.intrusion, .seriousError.intrusion {
background-image: url("/image/hacked.png"); }
.seriousError {
border-width: 3px; }
複製代碼