舊網頁面臨問題:全局樣式衝突、嵌套層次過深的選擇器、會帶來代碼的冗餘等css
CSS工程化目的:將代碼層次化,容易看出嵌套關係;精簡代碼,提升效率。html
CSS編譯器的出現:前端
CSS通過多個版本的更迭,從CSS1 到 CSS3,歷時多年。雖然新出了很多屬性和規範,但在語言自己的特性上,並無本質的改變。儘管使用 @import 指令能夠解決部分模塊化的瀏覽器
問題,但還遠遠不夠。但W3C官方彷佛對這些問題視而不見,就是不解決,因而,隨着前端技術(特別是JS)的快速發展,不少第三方機構開始嘗試進入CSS這個古老的領域,開sass
始着手解決這些遺留過久的難題。而它們的思路,就是像解決JS的問題那樣,用編譯器來解決CSS的問題.編輯器
什麼是CSS編譯器?
CSS編譯器,也叫作CSS預編譯器,是指開發者使用某種相似CSS(但實際不是)的語言編寫代碼,而後經過編譯器,將其編譯成瀏覽器真正能執行的CSS代碼。
目前常見的CSS編譯器有:SASS和LESS。
如何用SASS來實現優雅簡潔的CSS代碼: 模塊化
SASS編譯器是使用Ruby 語言書寫而成的,所以,SASS的執行依賴Ruby的環境。值得慶幸的是,咱們不須要進行繁瑣的步驟去安裝和配置Ruby,直接安裝一個第三方的工具Koala便可。
使用方法:
1.新建一個文件夾,並用你熟悉的文本編輯器打開(例如VSCode),而後在文件夾中新建css文件夾,用於存放SASS文件以及CSS文件,再在根目錄中新建一個index.html文件。在css文件中新建一個index.scss 文件,注意後綴名爲.scss ,表示這是一個使用Sass CSS語言編寫的文件。
2.將建好的文件夾拖到loala主界面中 在Sass中取消勾選Source Map、選擇Autoprefix 以及在右邊文本輸入框中選擇CSS生成樣式。
變量:
sass讓人們受益的一個重要特性就是它爲css引入了變量。你能夠把反覆使用的css屬性值 定義成變量,而後經過變量名來引用它們,而無需重複書寫這一屬性值。或者,對於僅使用過一 次的屬性值,你能夠賦予其一個易懂的變量名,讓人一眼就知道這個屬性值的用途。
sass使用$ 符號來標識變量。
變量聲明
sass變量的聲明和css屬性的聲明很像: $highlight-color: #F90; 這意味着變量$highlightcolor如今的值是#F90。任何能夠用做css屬性值的賦值均可以用做sass的變量值,甚至是以空格分割的多個屬性值,如$basic-border: 1px solid black; 或以逗號分割的多個屬性值。。
變量引用
凡是css屬性的標準值(好比說1px或者bold)可存在的地方,變量就可使用。css生成時,變量會被它們的值所替代。以後,若是你須要一個不一樣的值,只須要改變這個變量的值,則全部引用此變量的地方生成的值都會隨之改變。工具
嵌套選擇器
做用:將一大串須要一遍又一遍的重複樣式簡寫,使用SASS語言每一個選擇器只須要書寫一遍便可。
嵌套屬性
在sass中,除了CSS選擇器,屬性也能夠進行嵌套。儘管編寫屬性涉及的重複不像編寫選擇器那麼糟糕,可是要反覆寫border-style 、border-width 、border-color 以及border-* 等也是很是煩人的。在sass中,你只需敲寫一遍border:
nav {
border: {
style: solid;
width: 1px;
color: #ccc;}
} 字體
SASS中的註釋
SASS中提供了兩種註釋方式,分別是:
1. CSS標準註釋/* 註釋內容 */ ,該註釋會出如今編譯結果中
2. 靜默註釋// 註釋內容 該註釋僅會出如今SASS代碼中
混合器
若是你的整個網站中有幾處小小的樣式相似(例如一致的顏色和字體),那麼使用變量來統一處理,這種狀況是很是不錯的選擇。可是當你的樣式變得愈來愈複雜,你須要大段大段的重用樣式的代碼,獨立的變量就沒辦法應付這種狀況了。你能夠經過sass的混合器實現大段樣式的重用。
簡單混合器
使用@mixin定義一個混合器,混合器的書寫跟CSS代碼塊同樣,能夠定義多個規則 flex
@mixin flex-container{
display:flex;
flex-wrap: wrap;
justify-content: space-between;}
//其餘的代碼塊中都可以使用該混合器
@include flex-container;//使用混合器
}
.container{
background: lightblue;
@include flex-container;//使用混合器
}
編譯後生成:
.main{
font-size:1.1em;
color:inherit;
display:flex;
flex-wrap: wrap;
justify-content: space-between;
}
.container{
background: lightblue;
display:flex;
flex-wrap: wrap;
justify-content: space-between;
}