好程序員web前端培訓分享JavaScript學習筆記SASS

  好程序員web前端培訓分享JavaScript學習筆記SASS,世界上最成熟、最穩定、最強大的專業級CSS擴展語言!
sass 是一個 css 的預編譯工具
也就是能夠 更優雅 的書寫 css
sass 寫出來的東西 瀏覽器不認識
依舊是要轉換成 css 在瀏覽器中運行
這個時候就需要一個工具來幫我們做
安裝 sass 環境
以前的 sass 需要依賴一個 ruby 的環境
現在的 sass 需要依賴一個 python 的環境
但是我們的 node 強大了以後,我們只需要依賴 node 環境也可以
需要我們使用 npm 安裝一個全局的 sass 環境就可以了

安裝全局 sass 環境

$ npm install sass -g
編譯 sass
有了全局的 sass 環境以後
我們就可以對 sass 的文件進行編譯了
sass 的文件後綴有兩種,一種是 .sass 一種是 .scss
他們兩個的區別就是有沒有 {} 和 ;
.scss 文件
h1 {
width: 100px;
height: 200px;}
.sass 文件
h1 width: 100px height: 200px
.scss 文件
h1 { width: 100px; height: 200px;}
我們比較常用的還是 .scss 文件
因爲 .sass 我們寫不習慣,當然,如果你能寫習慣也比較好用
我們先不管裏面的的什麼內容,至少這個 .scss 或者 .sass 文件瀏覽器就不認識
我們就要用指令把 這兩種 文件變成 css 文件

把 index.scss 編譯,輸出成 index.css$ sass index.scss index.css

這樣我們就能得到一個 css 文件,在頁面裏面也是引入一個 css 文件就可以了
實時編譯
我們剛纔的編譯方式只能編譯一次
當你修改了文件以後要從新執行一遍指令纔可以
實時編譯就是隨着你文件的修改,自動從新編譯成 css 文件
也是使用指令來完成

實時監控 index.scss 文件,只要發生修改就自動編譯,並放在 index.css 文件裏面

$ sass --watch index.scss:index.css
然後你只要修改 index.scss 文件的內容,index.css 文件中的內容會自動更新
實時監控目錄
之前的實時監控只能監控一個文件
但是我們有可能要寫很多的文件
所以我們要準備一個文件夾,裏面放的全部都是 sass 文件
實時的把裏面的每一個文件都編譯到 css 文件夾裏面
依舊是使用指令的形式來完成

實時監控 sass 這個目錄,只要有變化,就會實時響應在 css 文件夾下

$ sass --watch sass:css
這樣,只要你修改 sass 文件夾下的內容,就會實時的相應在 css 文件夾中
你新添加一個文件也會實時響應
但是你刪除一個文件,css 文件夾中不會自動刪除,需要我們自己手動刪除
sass 語法
我們能編譯 sass 文件了,接下來我們就該學習一下 sass 的語法了
爲什麼他這麼強大,這麼好用,都是靠強大的語法
.sass 和 .scss 文件的語法是一樣的,只不過區別就是 {} 和 ;
變量
定義一個變量,在後面的代碼中使用
使用 $ 來定義變量
// 定義一個 $c 作爲變量,值是 紅色
$c: red;​h1 {
// 在使用 $c 這個變量 color: $c;}
上面定義的變量全局都可以使用
我們也可以在規則塊內定義私有變量
h1 {
// 這個 $w 變量只能在 h1 這個規則塊中使用 $w: 100px; width: $w;}
嵌套
sass 裏面我們最長用到的就是嵌套了
而且相當的好用
h1 {
width: 100px;

div {
width: 200px;

}}​// 編譯結果h1 {

width: 100px;}​h1 div {
width: 200px;}
這個就是嵌套,理論上可以無限嵌套下去
ul {

width: 100px;

li {
    width: 90px;
    
    div {
        width: 80px;
        
        p {
            width: 70px;
            
            span: {
                color: red;
            }
        }
    }
}}

嵌套中的 &
在嵌套中還有一個標識符是 & 我們可以使用
先來看一個例子
div { width: 100px; height: 100px;

:hover { width: 200px;
}}​// 我想的是 div 被鼠標懸停的時候 width 變成 200// 但是編譯結果卻是div { width: 100px; height: 100px;}div :hover {  width: 200px;}

和預想的結果不一樣了
這個時候就要用到 & 來連接了
div { width: 100px; height: 100px;​

&:hover { width: 200px;
}}​// 編譯結果div { width: 100px; height: 100px;}div:hover {  width: 200px;}

這個時候就和我需要的一樣了
羣組嵌套
羣組嵌套就是多個標籤同時嵌套
div {
width: 100px;

.box1, .box2, .box3 {
color: red;

}}​// 編譯結果div {

width: 100px;}div .box1, div .box2, div .box3 {
color: red;}
還有一種就是多個標籤同時嵌套一個標籤
h1, h2, h3 { width: 100px;​
.box { color: red;

}}​// 編譯結果h1, h2, h3 {  width: 100px;}h1 .box, h2 .box, h3 .box {  color: red;}

嵌套屬性
在 scss 裏面還有一種特殊的嵌套
叫做 屬性嵌套
和選擇器嵌套不一樣,是寫屬性的時候使用的
div { border: { style: solid; width: 10px; color: pink;

}}​// 編譯結果div { border-style: solid; border-width: 10px; border-color: pink;}

這個屬性嵌套還可以有一些特殊使用
div { border: 1px solid #333 { bottom: none;

}}​// 編譯結果div { border: 1px solid #333; border-bottom: none;}

混入
也叫 混合器
其實就是定義一個 “函數” 在 scss 文件中使用
// 定義一個混合器使用 @mixin 關鍵字@mixin radius { -webkit-border-radius: 10px; -moz-border-radius: 10px; -ms-border-radius: 10px; -o-border-radius: 10px; border-radius: 10px;}
上面是定義好的一個混合器
他是不會被編譯的,只有當你使用了他以後,纔會被編譯
// 使用混合器使用 @include 關鍵字div { width: 100px; height: 100px;​
@include radius;}
這個就是吧剛纔定義的混合器拿過來使用
編譯結果
div { width: 100px; height: 100px; -webkit-border-radius: 10px; -moz-border-radius: 10px; -ms-border-radius: 10px; -o-border-radius: 10px; border-radius: 10px;}
混合器傳參
我們既然說了,混合器就像一個 “函數” 一樣,那麼就一定可以像 “函數” 一樣傳遞參數
和 “函數” 的使用方式一樣,在定時的時候是 “形參”,在調用的時候是 “實參”
// 定義混合器@mixin my_transition($pro, $dur, $delay, $tim) { -webkit-transition: $pro $dur $delay $tim; -moz-transition: $pro $dur $delay $tim; -ms-transition: $pro $dur $delay $tim; -o-transition: $pro $dur $delay $tim; transition: $pro $dur $delay $tim;}
使用這個混合器的時候傳遞 “實參”
div { width: 100px; height: 100px;​
@include my_transition(all, 1s, 0s, linear);}
編譯結果
div {
width: 100px;
height: 100px;
-webkit-transition: all 1s 0s linear;
-moz-transition: all 1s 0s linear;
-ms-transition: all 1s 0s linear;
-o-transition: all 1s 0s linear;
transition: all 1s 0s linear;}
寫了多少個 “形參”,那麼調用的時候就要傳遞多少個 “實參”
不然會報錯的
參數默認值
我們在定義混合器的時候,也可以給一些參數寫一些默認值
這樣一來,就可以不傳遞 “實參” 了
// 設置一些帶有默認值的參數@mixin my_transition($dur: 1s, $pro: all, $delay: 0s, $tim: linear) {
-webkit-transition: $dur $pro $delay $tim;
-moz-transition: $dur $pro $delay $tim;
-ms-transition: $dur $pro $delay $tim;
-o-transition: $dur $pro $delay $tim;
transition: $dur $pro $delay $tim;}
使用的時候,如果你不傳遞,那麼就是使用默認值
div { width: 100px; height: 100px;

// 使用的時候,只傳遞一個,剩下的使用默認值
@include my_transition(2s);}
編譯結果
div {
width: 100px;
height: 100px;
-webkit-transition: 2s all 0s linear;
-moz-transition: 2s all 0s linear;
-ms-transition: 2s all 0s linear;
-o-transition: 2s all 0s linear;
transition: 2s all 0s linear;}
繼承
在 sass 裏面使用繼承可以大大的提高開發效率
其實繼承很簡單,就是把之前寫過的選擇器裏面的內容直接拿過來一份
div {
width: 100px;
height: 100px;
background-color: pink;}
這個是之前寫過的一個規則樣式表
接下來我要寫另外一個樣式了,發現我要寫的一些內容和之前這個 div 一樣,並且還有一些我自己的內容
那麼我就可以把這個樣式表先繼承下來,再寫我自己的內容就好了
p {
@extend div;​
font-size: 20px;
color: red;}
編譯結果
div, p {
width: 100px;
height: 100px;
background-color: pink;}​p {
font-size: 20px;
color: red;}
註釋
在 scss 文件中的註釋分爲幾種
1、編譯的時候不會被編譯的註釋
// 我是一個普通註釋,在編譯的時候,我就被過濾了
2、編譯的時候會被編譯的註釋
/ 我在編譯的時候,會被一起編譯過去 /
3、強力註釋
/! 我是一個強力註釋,不光編譯的時候會被編譯過去,將來壓縮文件的時候也會存在 /
導入文件
我們剛纔學過了定義變量,定義混合器
而這兩個內容在定義過以後,如果沒有使用,是不會被編譯出內容的
所以我們可以把變量單獨寫一個文件,混合器單獨寫一個文件,然後直接導入後使用
// 我是 variable.scss$w: 100px;$h: 200px;$c: pink;​// 我是 mixin.scss@mixin my_transition($dur: 1s, $pro: all, $delay: 0s, $tim: linear) {
-webkit-transition: $dur $pro $delay $tim;
-moz-transition: $dur $pro $delay $tim;
-ms-transition: $dur $pro $delay $tim;
-o-transition: $dur $pro $delay $tim;
transition: $dur $pro $delay $tim;}​@mixin radius {
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
-ms-border-radius: 10px;
-o-border-radius: 10px;
border-radius: 10px;}
然後在我們的主要文件中把這個兩個文件導入進來就行了
// 我是 index.scss@import './variable.scss';@import './mixin.scss';​div {
width: $w;
height: $h;
background-color: $c;​
@include radius;}​h1 {
@include my_transition;}
編譯結果
div {
width: 100px;
height: 200px;
background-color: pink;
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
-ms-border-radius: 10px;
-o-border-radius: 10px;
border-radius: 10px;
}

h1 {
-webkit-transition: 1s all 0s linear;
-moz-transition: 1s all 0s linear;
-ms-transition: 1s all 0s linear;
-o-transition: 1s all 0s linear;
transition: 1s all 0s linear;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章