SCSS語法 - @import、@media、@extend

 

一、@Rules and Directives

1、@Import

Import指示詞除了可以把n個scss檔匯在一起編譯成一個css檔之外,

還可以把內容單純為css語法的scss檔(注意該檔名第一個字母為底線),

不編譯,直接一起轉成css檔的功能,如下範例

_reset.scss

body {
    padding: 0;
}

base.scss

@import 'reset';

body {
background-color: #fff;
}

output.css

body {
    padding: 0;
}

body {
background-color: #fff;
}

 

還有一種是巢狀式import,比較不常用

example.scss

.example {
    color: red;
}

輸入scss檔

#main {
    @import "example";
}

輸出css檔

#main .example {
  color: red;
}

 

2、@media

@media在scss裡的用法如下

scss輸入

.sidebar {
    width: 300px;
    @media screen and (orientation: landscape) {
        width: 500px;
    }
}

css輸出

.sidebar {
  width: 300px;
}
@media screen and (orientation: landscape) {
  .sidebar {
    width: 500px;
  }
}

 

也可以做巢狀式嵌套

scss輸入

@media screen {
    .sidebar {
        @media (orientation: landscape) {
            width: 500px;
        }
    }
}

css輸出

@media screen and (orientation: landscape) {
  .sidebar {
    width: 500px;
  }
}

 

3、Extend/Inheritance

a、在scss裡繼承基本的用法如下

scss輸入

.error {
    border: 1px #f00;
    background-color: #fdd;
}

.seriousError {
@extend .error;
border-width: 3px;
}

css輸出

.error, .seriousError {
  border: 1px #f00;
  background-color: #fdd;
}

.seriousError {
border-width: 3px;
}

 

注意,只要指定繼承名稱在各個樣式有出現的地方都要被套用

scss輸入

.error {
  border: 1px #f00;
  background-color: #fdd;
}
.error.intrusion {
  background-image: url("/image/hacked.png");
}
.seriousError {
  @extend .error;
  border-width: 3px;
}

css輸出

.error, .seriousError {
  border: 1px #f00;
  background-color: #fdd; }

.error.intrusion, .seriousError.intrusion {
background-image: url("/image/hacked.png"); }

.seriousError {
border-width: 3px; }

 

另一個比較不一樣的例子

scss輸入

.hoverlink {
    @extend a:hover;
}

.comment a.user:hover {
font-weight: bold;
}

css輸出

.comment a.user:hover, .comment .user.hoverlink {
  font-weight: bold;
}

 

b、Multiple Extends

scss輸入

.error {
    border: 1px #f00;
    background-color: #fdd;
}

.attention {
font-size: 3em;
background-color: #ff0;
}

.seriousError {
@extend .error;
@extend .attention;
border-width: 3px;
}

css輸出

.error, .seriousError {
  border: 1px #f00;
  background-color: #fdd;
}

.attention, .seriousError {
font-size: 3em;
background-color: #ff0;
}

.seriousError {
border-width: 3px;
}

 

c、Chaining Extends

scss輸入

.error {
    border: 1px #f00;
    background-color: #fdd;
}

.seriousError {
@extend .error;
border-width: 3px;
}

.criticalError {
@extend .seriousError;
position: fixed;
top: 10%;
bottom: 10%;
left: 10%;
right: 10%;
}

css輸出

.error, .seriousError, .criticalError {
  border: 1px #f00;
  background-color: #fdd;
}

.seriousError, .criticalError {
border-width: 3px;
}

.criticalError {
position: fixed;
top: 10%;
bottom: 10%;
left: 10%;
right: 10%;
}

 

d、Selector Sequences

scss輸入

#fake-links .link {
  @extend a;
}

a {
color: blue;
&:hover {
text-decoration: underline;
}
}

css輸出

a, #fake-links .link {
  color: blue;
}
a:hover, #fake-links .link:hover {
  text-decoration: underline;
}

 

e、Merging Selector Sequences

如果被指定繼承的名稱其前面還有出現其他的selector,

則會產生下面組合

scss輸入

#admin .tabbar a {
    font-weight: bold;
}

#demo .overview .fakelink {
@extend a;
}

css輸出

#admin .tabbar a,
#admin .tabbar #demo .overview .fakelink,
#demo .overview #admin .tabbar .fakelink {
  font-weight: bold;
}

 

另一個例子你會發現有相同的selector id #admin 有發生被merge起來的情形

scss輸入

#admin .tabbar a {
    font-weight: bold;
}

#admin .overview .fakelink {
@extend a;
}

css輸出

#admin .tabbar a,
#admin .tabbar .overview .fakelink,
#admin .overview .tabbar .fakelink {
  font-weight: bold;
}

 

f、@extend-Only Selectors #placeholders

這個scss語法的樣式是可以單獨存在的,並且不會被render到css

#context a%extreme {
    color: blue;
    font-weight: bold;
    font-size: 2em;
}

只有明確呼叫才會被render

scss輸入

#context a%extreme {
    color: blue;
    font-weight: bold;
    font-size: 2em;
}

.notice {
@extend %extreme;
}

css輸出

#context a.notice {
  color: blue;
  font-weight: bold;
  font-size: 2em;
}

 

g、The !optional Flag

這是一個正常會動的範例

.notice {
    color: blue;
    font-weight: bold;
    font-size: 2em;
}

.important {
@extend .notice;
}

不過,如果故意extend不存在的樣式名稱,則會編譯出錯,如下

.notice {
    color: blue;
    font-weight: bold;
    font-size: 2em;
}

.important {
@extend .notice2;
}

可以加上「!optional」修飾詞,以表示當extend不存在樣式名稱時,則不做render

.notice {
    color: blue;
    font-weight: bold;
    font-size: 2em;
}

.important {
@extend .notice2 !optional;
}

 

h、@extend in @media

在@media範圍裡面使用@extend呼叫指定樣式名稱時,

該樣式名稱不能放在@media範圍之外,否則會出錯,如下範例。

.error {
    border: 1px #f00;
    background-color: #fdd;
}

@media print {
.seriousError {
@extend .error;
border-width: 3px;
}
}

應該把該樣式名稱放在@media範圍裡面才行。

@media print {
    .error {
        border: 1px #f00;
        background-color: #fdd;
    }
    .seriousError {
        @extend .error;
        border-width: 3px;
    }
}