sass/scss語法@mixin
----------------------------題外話---------------------------------
css新增HSL顏色模式,h色調(360度圓盤),s飽和度(百分比),l亮度(百分比)
eg.
p{
color:hsl(270,100%,100%);
}
sass支援hsl屬性,如果直接在css中使用hsl屬性,ie678不支援此屬性,因此通過sass可以完美解決hsl瀏覽器相容問題
----------------------------------正文----------------------------------------------------
可重用的程式碼塊,稱為mixin:
可通過@include,@extend呼叫
@include用法:
@mixin .page{//@mixin宣告
color:#f00;
}
.webpage{//@include呼叫
@include page();
}
mixin在不呼叫的情況下是不會生成任何css樣式的,呼叫的時候也只是輸出到呼叫位置
可新增引數,eg.
<pre name="code" class="html">@mixin col(<span style="color:#3366ff;">$width</span>){ width:<span style="color:#3366ff;">$width</span>; } .webpage{ @include col(<span style="color:#3366ff;">50%</span>); }
</pre>
也可新增預設引數:
@mixin col($width<span style="color:#ff0000;">:50%</span>){
width:$width;
}
.webpage{
@include <span style="color:#ff0000;">col()</span>;
}
@extend用法:
當我們要實現兩個class,假設為.error和.serious-error,有一樣的屬性時,在html和css中有三種方法:
1.
<pre name="code" class="html">.error{ color:red; } .serious-error{
<pre name="code" class="html"> color:red;
border:1px red;}
這種程式碼難以維護,一旦要修改要同時修改兩個class的color屬性,不推薦
2.
在html檔案中:
....
<div class="error"></div>
<div class="error serious-error"></div>
....
同樣不推薦,用多了會生成詭異bug
3.
.error,.serious-error{
color:red;
}
.serious-error{
border:1px red;
}
這種程式碼形式才是最利於維護的
為了在scss中實現這樣的css程式碼,要利用@extend:
.error{
color: red;
}
.serious-error{
<span style="color:#ff0000;"> @extend .error;</span>
border: 1px solid red;
}
**@extend小結:
1.支援繼承多個選擇器:
...
@extend .error, .fault
...
要繼承的不僅僅是一個類名,可以是一個id也可以是一個元素,也可以是某個狀態,任何選擇器都能繼承
連續繼承:A繼承B,C繼承A
.one {
width:100px;height:100px;
}
.two {
/*繼承的樣式*/
@extend .one;
/*獨立的樣式*/
background:red;
border:5px solid #000;
}
.three {
/*繼承的樣式*/
@extend .two;
/*獨立的樣式*/
padding:10px;
}
編譯後的css:
.one, .two, .three {
/*繼承的樣式*/
width: 100px;
height: 100px;
}
.two, .three {
/*獨立的樣式*/
background: red;
border: 5px solid #000;
}
.three {
/*獨立的樣式*/
padding: 10px;
}
2.使用%構建只用來繼承的選擇器
有時候你想繼承一個類名,但是並不想再在HTML中使用,就單單想寫一個能夠繼承的類名。尤其是不想讓它出現在css樣式中。我們可以用佔位符來寫一些繼承的樣式(如“%one”),然後再通過@extend繼承,這樣就可以防止被渲染到CSS的規則集中。
#meng a%long {
color: blue;
font-weight: bold;
font-size: 2em;
}
.notice {
@extend %long;
}
編譯後
<pre name="code" class="html">#meng a.notice {
color: blue;
font-weight: bold;
font-size: 2em;
}
***侷限性:
1.當繼承的class中包含如hover的狀態時,會一併繼承hover的狀態:
.myLink {
@extend a;
}
a {
color: blue;
&:hover {
text-decoration: underline;
}
}
編譯後
a, .myLink {
color: blue;
}
a:hover, .myLink:hover {
text-decoration: underline;
}
2.不能繼承選擇器序列
.meng .B {
font-weight:bold;
}
.long .link {
@extend .meng .B;
}
編譯會出錯
<span style="font-family:Arial;">3.繼承在指令中有作用域問題,無法使在指令如@media之外的選擇器繼承。</span>
<span style="font-family:Arial;"></span><pre name="code" class="html">.one {
height:300px;
}
@media print {
.two {
@extend .one;
width:300px;
}
}
編譯後會出錯,類名“.two”並沒有繼承類名“.one”的樣式,那麼需要讓類名“.two”成功繼承類名“.one”的樣式,就應該把類名“.one”也放在@media中
<span style="font-family:Arial;"></span><pre name="code" class="html">@media print {
.one {
height:300px;
}
.two {
@extend .one;
width:300px;
}
}
@media query
sass中的@media跟css的區別:sass中的@media可以內嵌在css規則中,在生成css時才會提到樣式最高層,這樣避免重複書寫選擇器
@mixin col-sm($width:50%