Sass 入門實戰(zhàn)

sass.jpg

Sass 學(xué)習(xí)起來是很無趣的一件事,畢竟如果沒有項目單單看文檔是挺無聊的缨历,還不如看政治課本有趣以蕴。這篇文章就從一個簡單的例子入手糙麦,通過用 Sass 來簡化 CSS 代碼來學(xué)習(xí) Sass 中的一些常用技巧。

學(xué)習(xí)方法

Sass 是前端的一種工具丛肮,所以對于工具一般是邊學(xué)邊用赡磅,而不是學(xué)完再去用。而且不要覺得這個例子中的 Sass 知識很少宝与,因為真實項目一般也用不了很多焚廊。如果用到了,可以直接 Google 查就行了习劫。

一個例子

我們要做的就是兩個按鈕咆瘟,當 Hover 的時候會上下動。

<div class="buttonWrapper">
  <button>Start</button>
  <button>End</button>
</div>

下面是用 CSS 實現(xiàn)的代碼诽里√徊停可以大概看下實現(xiàn)過程,但是不用細究须肆。之后會用 Sass 一步步去簡化這些代碼匿乃。

/* Reset */
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    height: 100vh;
    background: white;
    display: flex;
    justify-content: center;
    align-items: center;
}

/* First button */

.buttonWrapper button:first-child {
    padding: 10px 20px;
    font-size: 24px;
    border-radius: 4px;
    color: white;
    border: none;
    margin: 40px;
    background: #55acee;
    box-shadow: 0px 5px 0px 0px black;
}

/* First button hover */

.buttonWrapper button:first-child:hover {
    animation: horizontalShake .5s; 
}

/* Last button */

.buttonWrapper button:last-child {
    padding: 10px 20px;
    font-size: 24px;
    border-radius: 4px;
    color: white;
    border: none;
    margin: 40px;
    background: #2ECC71;
    box-shadow: 0px 5px 0px 0px black;
}

/* Last button hover */

.buttonWrapper button:last-child:hover {
    animation: verticalShake .5s; 
}

/* Shake horizontally */

@keyframes horizontalShake {
    0% {
        transform: translateX(10%);
    }
    25% {
        transform: translateX(-10%);
    }
    75% {
        transform: translateX(10%);
    }
    100% {
        transform: translateX(0%);
    }
}

/* Shake Vertically */

@keyframes verticalShake {
    0% {
        transform: translateY(10%);
    }
    25% {
        transform: translateY(-10%);
    }
    75% {
        transform: translateY(10%);
    }
    100% {
        transform: translateY(0%);
    }
}

代碼也很簡單桩皿,分別是兩個按鈕的基本樣式和 Hover 樣式豌汇,以及兩個動畫。

嵌套

下面開始重構(gòu)代碼泄隔。嵌套是 Sass 最常用的技巧拒贱,以后的

.a .b .c .d {
    color: red;
}

就可以寫成

.a {
    .b {
        .c {
            .d {
                
            }
        }
    }
}

我們的代碼里的 .buttonWrapperbutton 就是這種結(jié)構(gòu)的,所以可以改寫成下面:

...
.buttonWrapper {
    button {
        padding: 10px 20px;
        font-size: 24px;
        border-radius: 4px;
        color: white;
        border: none;
        margin: 40px;
    }

    // First button
    button:first-child {
        background: #55acee;
        box-shadow: 0px 5px 0px 0px black;
    }
    // First button hover
    button:first-child:hover {
        animation: horizontalShake .5s; 
    }

    // Last button
    button:last-child {
        background: #2ECC71;
        box-shadow: 0px 5px 0px 0px black;
    }
    button:last-child:hover {
        animation: verticalShake .5s;  
    }
}
...

占位符

我們發(fā)現(xiàn)像 button:first-childbutton 好像有點重復(fù)的感覺佛嬉,但是這又不是嵌套的關(guān)系逻澳,只是有點像。所以這就要用到 Sass 占位符了暖呕。

& 代表了上一級的選擇器斜做,這里可以用 & 來替換 button,代碼改寫如下:

...
.buttonWrapper {
    button {
        padding: 10px 20px;
        font-size: 24px;
        border-radius: 4px;
        color: white;
        border: none;
        margin: 40px;

        // First button
        &:first-child {
            background: #55acee;
            box-shadow: 0px 5px 0px 0px black;
            // First button hover
            &:hover {
                animation: horizontalShake .5s; 
            }
        }

        // Last button
        &:last-child {
            background: #2ECC71;
            box-shadow: 0px 5px 0px 0px black;
            // Last button hover
            &:hover {
                animation: verticalShake .5s;  
            }
        }
    }
}
...

Mixin

我們發(fā)現(xiàn)兩個按鈕的代碼差不多湾揽,唯一不同的就是顏色瓤逼。有沒有像函數(shù)一樣的東西,傳入顏色參數(shù)就生成一樣的代碼呢库物?Sass 有 Mixin 這個東西霸旗,其本質(zhì)就是函數(shù),只是名字有點奇怪戚揭。

定義 Mixin 前面要用 @mixin诱告,調(diào)用的時候要在前端用 @include

Sass 的變量要用 $ 開頭。還有一定別忘了要在結(jié)尾加分號民晒。

...
@mixin buttonStyles($color) {
    background: $color;
    box-shadow: 0px 5px 0px 0px black;
}

.buttonWrapper {
    button {
        padding: 10px 20px;
        font-size: 24px;
        border-radius: 4px;
        color: white;
        border: none;
        margin: 40px;

        // First button
        &:first-child {
            $blue: #55acee;
            @include buttonStyles($blue);
            // First button hover
            &:hover {
                animation: horizontalShake .5s; 
            }
        }

        // Last button
        &:last-child {
            $green: #2ECC71;
            @include buttonStyles($green);
            // Last button hover
            &:hover {
                animation: verticalShake .5s;  
            }
        }
    }
}
...

顏色函數(shù)

box-shadow 那里用黑色明顯不好精居,我們更希望的是按鈕顏色再深一點的顏色锄禽。可以使用 Sass 提供的 darken(color, percentage) 來生成對應(yīng)顏色箱蟆。

...
@mixin buttonStyles($color) {
    background: $color;
    box-shadow: 0px 5px 0px 0px darken($color, 20%);
}
...

循環(huán)和條件

@keyframes 里代碼也有很多相似的地方沟绪。這里可以用 Sass 提供的循環(huán)和條件語法來生成 keyframes 代碼。

for 循環(huán)使用 @for $i from x to y 將會從 x 開始到 y - 1 依次遍歷空猜。if 條件語句使用 @if condition绽慈。

#{$xxx} 和 ES6 的模板字符串一樣,里面要放變量辈毯。整體就是一個字符串坝疼。

...
/* Shake horizontally */
$offset: 10%;
$step: 25%;

@keyframes horizontalShake {
    @for $i from 0 to 4{
        #{$i * $step} {
            @if $i % 2 == 0 {
                transform: translateX(-$offset);
            }
            @else {
                transform: translateX($offset);
            }
        }
    }
}

/* Shake Vertically */
@keyframes verticalShake {
    @for $i from 0 to 4{
        #{$i * $step} {
            @if $i % 2 == 0 {
                transform: translateY(-$offset);
            }
            @else {
                transform: translateY($offset);
            }
        }
    }
}

總結(jié)

  1. 嵌套語法用于父子選擇器
  2. 占位符用代表父選擇器
  3. Mixin 就是我們熟悉的函數(shù)
  4. 可以使用 Sass 提供的顏色函數(shù)
  5. 變量使用 $variable
  6. 循環(huán)語句 @for $i from 0 to 4,條件語句 @if condition
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谆沃,一起剝皮案震驚了整個濱河市钝凶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌唁影,老刑警劉巖耕陷,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異据沈,居然都是意外死亡哟沫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門锌介,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嗜诀,“玉大人,你說我怎么就攤上這事孔祸÷「遥” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵崔慧,是天一觀的道長拂蝎。 經(jīng)常有香客問我,道長惶室,這世上最難降的妖魔是什么温自? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮拇涤,結(jié)果婚禮上捣作,老公的妹妹穿的比我還像新娘。我一直安慰自己鹅士,他們只是感情好券躁,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般也拜。 火紅的嫁衣襯著肌膚如雪以舒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天慢哈,我揣著相機與錄音蔓钟,去河邊找鬼。 笑死卵贱,一個胖子當著我的面吹牛滥沫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播键俱,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼兰绣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了编振?” 一聲冷哼從身側(cè)響起缀辩,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎踪央,沒想到半個月后臀玄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡畅蹂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年健无,在試婚紗的時候發(fā)現(xiàn)自己被綠了萍鲸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡奴饮,死狀恐怖率碾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情譬圣,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站检疫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏祷嘶。R本人自食惡果不足惜屎媳,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望论巍。 院中可真熱鬧烛谊,春花似錦、人聲如沸嘉汰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至双泪,卻和暖如春持搜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背焙矛。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工葫盼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人村斟。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓贫导,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蟆盹。 傳聞我的和親對象是個殘疾皇子脱盲,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 前言 什么是CSS預(yù)處理器 定義:CSS預(yù)處理器定義了一種新的語言,其基本思想是日缨,用一種專門的編程語言钱反,為CSS增...
    SA_Arthur閱讀 3,117評論 0 18
  • 聲明變量 定義變量的語法: 在有些編程語言中(如,JavaScript)聲明變量都是使用關(guān)鍵詞“var”開頭匣距,但是...
    Junting閱讀 1,467評論 0 6
  • 一面哥、Sass的語法格式及編譯調(diào)試 1. Sass和scss的區(qū)別 本質(zhì)上來說是同一個東西,只是語法上有細微的差異:...
    沒汁帥閱讀 1,319評論 0 5
  • 1毅待、SCSS 是 Sass 的新語法格式尚卫,從外形上來判斷他和 CSS 長得幾乎是一模一樣,代碼都包裹在一對大括號里...
    夜幕小草閱讀 1,707評論 2 10
  • 基礎(chǔ) 聲明變量 普通變量 默認變量 變量覆蓋:只需要在默認變量之前重新聲明下變量即可 變量的調(diào)用 局部變量和全局變...
    Jill1231閱讀 1,270評論 0 1