**[Sass](http://sass-lang.com/)**是成熟、穩定、強大的**CSS預處理器**,而SCSS是Sass3版本當中引入的新語法特性,完全兼容CSS3的同時繼承了Sass強大的動態功能。
## 特性概覽
CSS書寫代碼規模較大的Web應用時,容易造成選擇器、層疊的復雜度過高,因此推薦通過SASS預處理器進行CSS的開發,SASS提供的變量、嵌套、混合、繼承等特性,讓CSS的書寫更加有趣與程式化。
* * *
### 變量
變量用來存儲需要在CSS中復用的信息,例如顏色和字體。SASS通過$符號去聲明一個變量。
~~~css
$font-stack: Helvetica, sans-serif;
$primary-color: #333;
body {
font: 100% $font-stack;
color: $primary-color;
}
~~~
上面例子中變量$font-stack和$primary-color的值將會替換所有引用他們的位置。
~~~css
body {
font: 100% Helvetica, sans-serif;
color: #333; }
~~~
### 嵌套
SASS允許開發人員以嵌套的方式使用CSS,但是過度的使用嵌套會讓產生的CSS難以維護,因此是一種不好的實踐,下面的例子表達了一個典型的網站導航樣式:
~~~css
nav {
ul {
margin: 0;
padding: 0;
list-style: none;
}
li { display: inline-block; }
a {
display: block;
padding: 6px 12px;
text-decoration: none;
}
}
~~~
大家注意上面代碼中的ul、li、a選擇器都被嵌套在nav選擇器當中使用,這是一種書寫更高可讀性CSS的良好方式,編譯后產生的CSS代碼如下:
~~~css
nav ul {
margin: 0;
padding: 0;
list-style: none; }
nav li {
display: inline-block; }
nav a {
display: block;
padding: 6px 12px;
text-decoration: none; }
~~~
### 引入
SASS能夠將代碼分割為多個片段,并以underscore風格的下劃線作為其命名前綴(\_partial.scss),SASS會通過這些下劃線來辨別哪些文件是SASS片段,并且不讓片段內容直接生成為CSS文件,從而只是在使用@import指令的位置被導入。CSS原生的@import會通過額外的HTTP請求獲取引入的樣式片段,而SASS的@import則會直接將這些引入的片段合并至當前CSS文件,并且不會產生新的HTTP請求。下面例子中的代碼,將會在base.scss文件當中引入\_reset.scss片斷。
~~~css
// _reset.scss
html, body, ul, ol {
margin: 0;
padding: 0;
}
// base.scss
@import 'reset';
body {
font: 100% Helvetica, sans-serif;
background-color: #efefef;
}
~~~
SASS中引入片斷時,可以缺省使用文件擴展名,因此上面代碼中直接通過@import 'reset'引入,編譯后生成的代碼如下:
~~~css
html, body, ul, ol {
margin: 0;
padding: 0; }
body {
font: 100% Helvetica, sans-serif;
background-color: #efefef; }
~~~
### 混合
混合(Mixin)用來分組那些需要在頁面中復用的CSS聲明,開發人員可以通過向Mixin傳遞變量參數來讓代碼更加靈活,該特性在添加瀏覽器兼容性前綴的時候非常有用,SASS目前使用@mixin name指令來進行混合操作。
~~~css
@mixin border-radius($radius) {
border-radius: $radius;
-ms-border-radius: $radius;
-moz-border-radius: $radius;
-webkit-border-radius: $radius;
}
.box {
@include border-radius(10px);
}
~~~
上面的代碼建立了一個名為border-radius的Mixin,并傳遞了一個變量$radius作為參數,然后在后續代碼中通過@include border-radius(10px)使用該Mixin,最終編譯的結果如下:
~~~css
.box {
border-radius: 10px;
-ms-border-radius: 10px;
-moz-border-radius: 10px;
-webkit-border-radius: 10px; }
~~~
### 繼承
繼承是SASS中非常重要的一個特性,可以通過@extend指令在選擇器之間復用CSS屬性,并且不會產生冗余的代碼,下面例子將會通過SASS提供的繼承機制建立一系列樣式:
~~~css
// 這段代碼不會被輸出到最終生成的CSS文件,因為它沒有被任何代碼所繼承。
%other-styles {
display: flex;
flex-wrap: wrap;
}
// 下面代碼會正常輸出到生成的CSS文件,因為它被其接下來的代碼所繼承。
%message-common {
border: 1px solid #ccc;
padding: 10px;
color: #333;
}
.message {
@extend %message-common;
}
.success {
@extend %message-common;
border-color: green;
}
.error {
@extend %message-common;
border-color: red;
}
.warning {
@extend %message-common;
border-color: yellow;
}
~~~
上面代碼將.message中的CSS屬性應用到了.success、.error、.warning上面,魔法將會發生在最終生成的CSS當中。這種方式能夠避免在HTML元素上書寫多個class選擇器,最終生成的CSS樣式是下面這樣的:
~~~
.message, .success, .error, .warning {
border: 1px solid #ccc;
padding: 10px;
color: #333; }
.success {
border-color: green; }
.error {
border-color: red; }
.warning {
border-color: yellow; }
~~~
## 操作符
SASS提供了標準的算術運算符,例如+、-、\*、/、%。在接下來的例子里,我們嘗試在aside和article選擇器當中對寬度進行簡單的計算。
~~~css
.container { width: 100%; }
article[role="main"] {
float: left;
width: 600px / 960px * 100%;
}
aside[role="complementary"] {
float: right;
width: 300px / 960px * 100%;
}
~~~
上面代碼以960px為基準建立了簡單的流式網格布局,SASS提供的算術運算符讓開發人員可以更容易的將像素值轉換為百分比,最終生成的CSS樣式如下所示:
~~~css
.container {
width: 100%; }
article[role="main"] {
float: left;
width: 62.5%; }
aside[role="complementary"] {
float: right;
width: 31.25%; }
~~~
## CSS擴展
* * *
### 引用父級選擇器"&"
Scss使用"&"關鍵字在CSS規則中引用父級選擇器,例如在嵌套使用偽類選擇器的場景下:
~~~css
/*===== SCSS =====*/
a {
font-weight: bold;
text-decoration: none;
&:hover { text-decoration: underline; }
body.firefox & { font-weight: normal; }
}
/*===== CSS =====*/
a {
font-weight: bold;
text-decoration: none; }
a:hover {
text-decoration: underline; }
body.firefox a {
font-weight: normal; }
~~~
無論CSS規則嵌套的深度怎樣,關鍵字"&"都會使用父級選擇器級聯替換全部其出現的位置:
~~~css
/*===== SCSS =====*/
#main {
color: black;
a {
font-weight: bold;
&:hover { color: red; }
}
}
/*===== CSS =====*/
#main {
color: black; }
#main a {
font-weight: bold; }
#main a:hover {
color: red; }
~~~
"&"必須出現在復合選擇器開頭的位置,后面再連接自定義的后綴,例如:
~~~css
/*===== SCSS =====*/
#main {
color: black;
&-sidebar { border: 1px solid; }
}
/*===== CSS =====*/
#main {
color: black; }
#main-sidebar {
border: 1px solid; }
~~~
如果在父級選擇器不存在的場景使用&,Scss預處理器會報出錯誤信息。
### 嵌套屬性
CSS許多屬性都位于相同的命名空間(例如font-family、font-size、font-weight都位于font命名空間下),Scss當中只需要編寫命名空間一次,后續嵌套的子屬性都將會位于該命名空間之下,請看下面的代碼:
~~~css
/*===== SCSS =====*/
.demo {
// 命令空間后帶有冒號:
font: {
family: fantasy;
size: 30em;
weight: bold;
}
}
/*===== CSS =====*/
.demo {
font-family: fantasy;
font-size: 30em;
font-weight: bold; }
~~~
命令空間上可以直接書寫CSS簡寫屬性,但是日常開發中建議直接書寫CSS簡寫屬性,盡量保持CSS語法的一致性。
~~~css
.demo {
font: 20px/24px fantasy {
weight: bold;
}
}
.demo {
font: 20px/24px fantasy;
font-weight: bold;
}
~~~
## 注釋
轉自([https://uinika.github.io/web/scss.html](https://uinika.github.io/web/scss.html))
作者:白雪公主960
鏈接:https://www.jianshu.com/p/a99764ff3c41
# scss語法介紹
> 這里既然是對語法的介紹
* * *
1.自定義變量
~~~
$color:pink;
.test1{
background-color:$color;
}
~~~
通過編譯工具編譯出來后
~~~
.test1{
background-color:pink;
}
~~~
注:時間原因我在這里只寫scss了,就不寫編譯后的結果,一來方便大家自己去嘗試編譯,二來增加大家對scss的理解:編譯工具[kaola](http://koala-app.com/)很好的一個編譯工具,大家可以百度如何使用,再這里就不做過多介紹了。
\*\*\*
2.插入一個變量
~~~
$right:right;
.test2{
border-#{$right}:1px solid #000;
}
~~~
3.子元素書寫
~~~
.text3{
.text33{
border:1px solid;
}
}
~~~
4.樣式的加減乘除
~~~
$paramer:3;
.text4{
height:(1px+3px);
width: (96px/6);
right: $paramer*4;
}
~~~
5.繼承
~~~
.class5{
border:1px solid red;
}
.class5E{
@extend .class5;
font-size:20px;
}
~~~
6.代碼塊的復用
~~~
@mixin text6 {
height:50px;
left:20px;
}
.text6M{
@include text6
}
//這里的mixin就是定義一個可以復用的代碼段,當然我們也可以給它傳遞一個參數,就像這樣一樣:
@mixin text66($height){
height:$heigth;
left:20px;
}
.text6N{
@include text66(100px);
}
~~~
7.if語法,通過對if的判斷來決定使用那一套樣式
~~~
.text7{
@if 1 +2 == 3 {
border:1px solid ;
}
@if 5 < 3 {
border:2px dsahed red;
}
}
當然,我們都知道if一般是要和else配合的,所以我們也可以這樣寫
.test77{
@if lightness($color) > 30%{
background-color:#fff;
}@else{
background:#0ff;
}
}
這里的lightness是一個scss顏色函數,$color指向之前定義的值。
~~~
8.循環語法,包括最常見的三種循環方法,for,while,each
~~~
//for 循環
@for $i from 1 to 5 {
.item-#{$i} {
border:#{$i}px solid;
}
}
//while 循環
$m:8;
@while $m > 0 {
.items-#{$m} {
width:2em*$m;
}
$m:$m - 2 ;
}
//這里可以對$m進行運算 讓它每次都減去2
//each 語法
@each $img in q,w,e,r {
.#{$img} {
background-image:url('#{$img}.png')
}
}
~~~
9.函數語法
~~~
@function double ($number){
@return $number*2;
}
.text9{
font-size:double(20px);
}
~~~
10.import導入語法
~~~
@import 'other.scss'
這樣就在你現在的scss中導入了other.scss編寫的scss
~~~
> scss語法并不是很多,但是需要開發者靈活使用,這樣才能事半功倍,要深刻理解scss變量,以及如何插入變量,以及循環語法和函數思想,如果遇到不太清楚的可以給博主留言哈,歡迎指正和提出問題。
- 內容介紹
- EcmaScript基礎
- 快速入門
- 常量與變量
- 字符串
- 函數的基本概念
- 條件判斷
- 數組
- 循環
- while循環
- for循環
- 函數基礎
- 對象
- 對象的方法
- 函數
- 變量作用域
- 箭頭函數
- 閉包
- 高階函數
- map/reduce
- filter
- sort
- Promise
- 基本對象
- Arguments 對象
- 剩余參數
- Map和Set
- Json基礎
- RegExp
- Date
- async
- callback
- promise基礎
- promise-api
- promise鏈
- async-await
- 項目實踐
- 標簽系統
- 遠程API請求
- 面向對象編程
- 創建對象
- 原型繼承
- 項目實踐
- Classes
- 構造函數
- extends
- static
- 項目實踐
- 模塊
- import
- export
- 項目實踐
- 第三方擴展庫
- immutable
- Vue快速入門
- 理解MVVM
- Vue中的MVVM模型
- Webpack+Vue快速入門
- 模板語法
- 計算屬性和偵聽器
- Class 與 Style 綁定
- 條件渲染
- 列表渲染
- 事件處理
- 表單輸入綁定
- 組件基礎
- 組件注冊
- Prop
- 自定義事件
- 插槽
- 混入
- 過濾器
- 項目實踐
- 標簽編輯
- 移動客戶端開發
- uni-app基礎
- 快速入門程序
- 單頁程序
- 底部Tab導航
- Vue語法基礎
- 模版語法
- 計算屬性與偵聽器
- Class與Style綁定
- 樣式與布局
- Box模型
- Flex布局
- 內置指令
- 基本指令
- v-model與表單
- 條件渲染指令
- 列表渲染指令v-for
- 事件與自定義屬性
- 生命周期
- 項目實踐
- 學生實驗
- 貝店商品列表
- 加載更多數據
- 詳情頁面
- 自定義組件
- 內置組件
- 表單組件
- 技術專題
- 狀態管理vuex
- Flyio
- Mockjs
- SCSS
- 條件編譯
- 常用功能實現
- 上拉加載更多數據
- 數據加載綜合案例
- Teaset UI組件庫
- Teaset設計
- Teaset使用基礎
- ts-tag
- ts-badge
- ts-button
- ta-banner
- ts-list
- ts-icon
- ts-load-more
- ts-segmented-control
- 代碼模版
- 項目實踐
- 標簽組件
- 失物招領客戶端原型
- 發布頁面
- 檢索頁面
- 詳情頁面
- 服務端開發技術
- 服務端開發環境配置
- Koajs快速入門
- 快速入門
- 常用Koa中間件介紹
- 文件上傳
- RestfulApi
- 一個復雜的RESTful例子
- 使用Mockjs生成模擬數據
- Thinkjs快速入門
- MVC模式
- Thinkjs介紹
- 快速入門
- RESTful服務
- RBAC案例
- 關聯模型
- 應用開發框架
- 服務端開發
- PC端管理界面開發
- 移動端開發
- 項目實踐
- 失物招領項目
- 移動客戶端UI設計
- 服務端設計
- 數據庫設計
- Event(事件)
- 客戶端設計
- 事件列表頁面
- 發布頁面
- 事件詳情頁面
- API設計
- image
- event
- 微信公眾號開發
- ui設計規范