SASS 學習筆記

SASS 學習筆記

總共會寫兩個練手項目,成品在 https://goldenaarcher.com/scss-study 可以看到,代碼在 https://github.com/GoldenaArcher/scss-study。

什么是 SASS

SASS 是 CSS 預處理,它提供了變量(雖然現在 CSS 也提供了,不過 SASS 的更加靈活),嵌套、mixin、函數、導入和擴展等功能,可以高效地做到代碼復用。SASS 包括 SASS 和 SCSS,二者都支持嵌套、mixin 和變量,主要的區別在:

  • 語法

    SCSS 的語法更加貼近 CSS,而 SASS 不適用 {};,并且依賴縮進定義結構(有點類似 python 的寫法)

    因此 SASS 的排版必然是更加簡潔和美觀的,相對而言剛從 CSS 轉到 SASS 也有可能會不太適應

  • 兼容性

    SCSS 更加接近 CSS 的語法,因此兼容性相對更好一些,比較適合作為 CSS 到 SASS 的過渡。當然,對于不是非常復雜的項目,使用 SCSS 本身也夠了

    SASS 的支持相對更強一些,不過因為兼容性和語法的問題,流行度相對低一些

  • 學習曲線

    SASS 比 SCSS 高

這篇筆記主要學習的是 SCSS 為主。

基礎

配置

SASS 作為 CSS 的預處理,無法直接在瀏覽器中運行,因此需要下載對應的包將寫好的 SASS 轉化為 CSS,使得瀏覽器可以解析。

編譯的方式有通過編輯器,或者是使用 node 依賴完成,這里使用后者,方式為下載 sass,并且在 package.json 中添加一下代碼:

{"scripts": {"watch": "sass scss/:css/ -w"}
}

這樣 sass 會將 scss 文件夾下的內容編譯后保存到 css 文件夾下,-w 的 flag 代表監聽狀態,他會監聽 scss 文件夾下的變化,并且重新進行編譯。

項目整體結構大概如下:

在這里插入圖片描述

除了 sass 之外,還有比較臭名昭著的 node-sass,雖然 node-sass 還是在維護的,并且目前也支持到 node20,而且常規的 SCSS 功能都能實現完成編譯,不過 node-sass 的兼容性真的很有問題……反正我本人在 Windows 上嘗試運行 node-sass 的時候碰到很多問題。

另一個 SASS 的配置方法在 sass 簡易配置 里有 cv,那個用的包比較多,具體干什么的還沒怎么看,不過想要比較完整的項目配置,可以看看這個。

變量

scss 的變量以 $ 開始,我是覺得目前 CSS 對變量的支持也挺好的,不過考慮到兼容性的問題,統一使用 SCSS 會方便些,具體使用方法如下:

// 定義
$color-dark: #262626;
$color-black: #000;
$color-primary: #d3ab55;
$color-secondary: #bbb;
$color-white: #fff;$font-dancingScript: 'Dancing Script', cursive;
$font-josefinSans: 'Josefin Sans', sans-serif;
$font-nunito: 'Nunito', sans-serif;// 使用
body {// local scope也可以重寫變量// 想要在本地重寫global變量可以使用下面的語法:// $color-white: #eee !global;background-color: $color-dark;
}

它的編譯結果如下:

body {background-color: #262626;
}

可以看到 $color-dark 已經被編譯了,而不是直接使用變量,所以如果要有老版瀏覽器兼容的考慮,使用 SCSS 變量會方便一些。

像是主題顏色(primary、 secondary、warning、success 這種顏色)和字體大小、breakpoint 一般都推薦使用全局定義的變量來實現。練手的項目 1 中對于顏色、字體都使用了變量進行定義,但是 media query 沒有,大概因為邊寫邊感覺的原因……?

嵌套

嵌套是一個我覺得使用 SCSS 非常方便的點,如下面這個 HTML 的結構:

<nav class="navbar"><input type="checkbox" name="check" id="check" class="checkbox" hidden /><div class="hamburger-menu"><label for="check" class="menu"><div class="menu-line menu-line-1"></div><div class="menu-line menu-line-2"></div><div class="menu-line menu-line-3"></div></label></div>
</nav>

要選擇 navbar > hamburger > menu,并且分別應用樣式,CSS 的寫法為:

.navbar {
}.navbar .hamburger {
}.navbar .hamburger .menu {
}@media (max-width: 760px) {.navbar .hamburger {}.navbar .hamburger .menu {}
}

SCSS 的寫法為:

.navbar {.hamburger {@media (max-width: 760px) {}.menu {@media (max-width: 760px) {}}}
}

我個人還是比較偏好這種嵌套式的寫法,尤其是一些樣式都比較依賴選擇多個 class selector 去增加權重覆寫樣式的情況下,這樣的確能少寫一些代碼。media query 也嵌套在這里,找 responsive 的實現代碼也更方便一些。

extend

extend 是一個比較強大的方法,其實現和使用方法如下:

.full-space {width: 100%;height: 100%;
}.header {@extend .full-space;
}

編譯后的結果為:

.full-space,
.header {width: 100%;height: 100%;
}

如果有多個樣式都 extend 了同一個樣式,那么 SCSS 也會將其打包在一起,而不是額外重復一遍 CSS,如:

.full-space {width: 100%;height: 100%;
}.header {@extend .full-space;
}.footer {@extend .full-space;
}

對應的 CSS:

.full-space,
.header,
.footer {width: 100%;height: 100%;
}

mixin

mixin 是另一個 SCSS 強大的地方,它的使用方法為:

@mixin textStyles($transform: uppercase) {font-weight: 300;letter-spacing: 2px;text-transform: $transform;
}.main-name {font-family: $font-nunito;font-size: 50px;color: $color-secondary;@include textStyles;
}

編譯后的結果為:

.main-name {font-family: 'Nunito', sans-serif;font-size: 50px;color: #bbb;font-weight: 300;letter-spacing: 2px;text-transform: uppercase;
}

與 extend 最大的不同有兩點:

  1. mixin 可以接受參數
  2. mixin 會將定義好的樣式添加到當前 selector 中

總體來說,如果一個樣式的代碼是固定且不會變動的,并且想減少 CSS 的大小,那么就可以使用 extend。相反,如果想要一個代碼更加的動態,需要依靠傳入的變量進行修改時,就可以使用 mixin,另一個比較適合使用 mixin 的案例是 transition,一般 duration、應用的樣式及延遲都不太一樣,這時候可以使用 mixin 減少編程時的代碼量。

mixin 在提供 default value 是可以不傳值的,不傳值的情況下 SCSS 會使用默認值。不提供默認值好像是會報錯的來著……

function

function 可以實現一些計算,如:

@function fontSize($size: 12px) {@return $size * 2;
}

對于一些小型的項目來說,function 的使用并不一定會很方便,不過對于一些大型項目,特別是 margin、padding 都有定義好的 responsive 項目,使用 function 會方便很多。

SCSS 也有一些預設的 function,如顏色有 darken, lightedn 等 數字有 percent 等,數學有 min, max 等,以便開發。

placeholder selector

extend 會創建一個空置的 class,使用 placeholder selector 可以解決這個問題,用法如下:

%full-space {width: 100%;height: 100%;
}.header {@extend %full-space;
}.footer {@extend %full-space;
}

對應的 CSS:

.header,
.footer {width: 100%;height: 100%;
}

import & partials

partial 指的是 SCSS 文件名在命名時使用 _ 作為前綴的命名規范,如 _base.scss,這樣 SCSS 就不會多生成一個 _base.scss 的文件。隨后使用 import 關鍵詞在 main.scss 中導入對應的包,就可以將 _base.scss 的樣式添加到 main.scss 中,如:

  • _base.scss

    $color-dark: #262626;
    $color-black: #000;
    $color-primary: #d3ab55;
    $color-secondary: #bbb;
    $color-white: #fff;$font-dancingScript: 'Dancing Script', cursive;
    $font-josefinSans: 'Josefin Sans', sans-serif;
    $font-nunito: 'Nunito', sans-serif;
    
  • main.scss

    @import 'base';
    @import 'layout';
    @import 'components';
    

因為 base 是最先導入的,layoutcomponent 也可以使用 base 中定義好的變量名。

一些有趣的 CSS 小技巧

使用 checkbox

checkbox 本身可以使用 HTML5 的 hidden,同時使用選擇器,這樣可以在不懈 JS 的情況下完成 onclick 的事件實現

hamburger icon

這個在點擊的時候有兩個特效:

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

第一個 90 度翻轉比較好理解,第二個也是用 CSS 實現的,簡單的說就是將中間的那條線透明度設置為 0,同時左右兩根線分別按照 z 軸向左向右旋轉一定角度,獲取下面的箭頭形狀:

在這里插入圖片描述

然后搭配 transform-origin: right; 使用即可。

這個用法真的好巧妙啊。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/43518.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/43518.shtml
英文地址,請注明出處:http://en.pswp.cn/news/43518.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++ 面向對象三大特性——繼承

?<1>主頁&#xff1a;我的代碼愛吃辣 &#x1f4c3;<2>知識講解&#xff1a;C 繼承 ??<3>開發環境&#xff1a;Visual Studio 2022 &#x1f4ac;<4>前言&#xff1a;面向對象三大特性的&#xff0c;封裝&#xff0c;繼承&#xff0c;多態&#xff…

【數倉建設系列之一】什么是數據倉庫?

一、什么是數據倉庫&#xff1f; 數據倉庫(Data Warehouse&#xff0c;簡稱DW)簡單來講&#xff0c;它是一個存儲和管理大量結構化和非結構化數據的存儲集合&#xff0c;它以主題為向導&#xff0c;通過整合來自不同數據源下的數據(比如各業務數據&#xff0c;日志文件數據等)…

內網穿透和服務器+IP 實現公網訪問內網的區別

內網穿透和服務器IP 實現公網訪問內網的區別在于實現方式和使用場景。 內網穿透&#xff08;Port Forwarding&#xff09;&#xff1a;內網穿透是一種通過網絡技術將公網用戶的請求通過中轉服務器傳輸到內網設備的方法。通過在路由器或防火墻上進行配置&#xff0c;將公網請求…

MySQL- sql語句基礎

文章目錄 1.select后對表進行修改&#xff08;delete&#xff09;2.函數GROUP_CONCAT()3.使用正則表達式3.DATE_FORMAT()4.count() 加條件 1.select后對表進行修改&#xff08;delete&#xff09; 報錯&#xff1a;You can’t specify target table ‘Person’ for update in …

proteus結合keil-arm編譯器構建STM32單片機項目進行仿真

proteus是可以直接創建設計圖和源碼的&#xff0c;但是源碼編譯它需要借助keil-arm編譯器&#xff0c;也就是我們安裝keil-mdk之后自帶的編譯器。 下面給出一個完整的示例&#xff0c;主要是做一個LED燈閃爍的效果。 新建工程指定路徑&#xff0c;Schematic,PCB layout都選擇默…

【Docker】 使用Docker-Compose 搭建基于 WordPress 的博客網站

引 本文將使用流行的博客搭建工具 WordPress 搭建一個私人博客站點。部署過程中使用到了 Docker 、MySQL 。站點搭建完成后經行了發布文章的體驗。 WordPress WordPress 是一個廣泛使用的開源內容管理系統&#xff08;CMS&#xff09;&#xff0c;用于構建和管理網站、博客和…

單例設計模式精講(餓漢式和懶漢式實現的重要方法)

目錄 什么叫做單例模式&#xff1f; 餓漢式和懶漢式的區別&#xff1f; 餓漢式-方式1&#xff08;靜態變量方式&#xff09; 餓漢式-方式2&#xff08;靜態代碼塊方式&#xff09; 懶漢式-方式1&#xff08;線程不安全&#xff09; 懶漢式-方式2&#xff08;線程安全&…

FifthOne:用于矢量搜索的計算機視覺接口

一、說明 數據太多了。數據湖和數據倉庫;廣闊的像素牧場和充滿文字的海洋。找到正確的數據就像大海撈針一樣&#xff01;如果你喜歡開源機器學習庫 FiftyOne&#xff0c;矢量搜索引擎通過將復雜數據&#xff08;圖像的原始像素值、文本文檔中的字符&#xff09;轉換為稱為嵌入矢…

PHP報錯:未定義常量的解決方法!

PHP報錯&#xff1a;未定義常量的解決方法&#xff01; 在PHP編程中&#xff0c;我們經常會遇到常量未定義的錯誤。這種錯誤通常會在代碼中使用未定義的常量時發生。本文將介紹常量的概念以及如何解決未定義常量的問題。 首先&#xff0c;讓我們來了解什么是常量。在PHP中&am…

大數據平臺運維實訓室建設方案

一、概況 本實訓室的主要目的是培養大數據平臺運維項目的實踐能力,以數據計算、分析、挖掘和可視化的案例訓練為輔助。同時,實訓室也承擔相關考評員與講師培訓考試、學生認證培訓考試、社會人員認證培訓考試、大數據技能大賽訓練、大數據專業課程改革等多項任務。 實訓室旨在培…

無人機跟隨一維高度避障場景--邏輯分析

無人機跟隨一維高度避障場景--邏輯分析 1. 源由2. 視頻3. 問題3.1 思維發散3.2 問題收斂 4. 圖示4.1 水平模式4.2 下坡模式4.3 上坡模式4.4 碰撞分析 5. 總結5.1 一維高度避障場景5.2 業界跟隨產品5.3 APM集成跟隨示意圖一&#xff1a;示意圖二&#xff1a;示意圖三&#xff1a…

Java算法_ 驗證二叉搜索樹(LeetCode_Hot100)

題目描述&#xff1a; 給你一個二叉樹的根節點 &#xff0c;判斷其是否是一個有效的二叉搜索樹。root 有效 二叉搜索樹定義如下&#xff1a; 節點的左子樹只包含 小于 當前節點的數。 節點的右子樹只包含 大于 當前節點的數。 所有左子樹和右子樹自身必須也是二叉搜索樹。 獲得…

【TypeScript】tsc -v 報錯 —— 在此系統上禁止運行腳本

在 VS Code 終端中執行 tsc -v &#xff0c;報錯 —— 在此系統上禁止運行腳本 然后 windows x &#xff0c;打開終端管理員&#xff0c;出現同樣的問題 解決方法&#xff1a; 終端&#xff08;管理員&#xff09;執行以下命令&#xff1a; 出現 RemoteSigned 則代表更改成功…

11,模板泛化、模板特化、所占字節數、繼承實現模板展開、using循環命名展開可變參數

模板泛化、模板特化、所占字節數、繼承實現模板展開、using循環命名展開可變參數 模板泛化模板特化模板全特化通過模板偏特化獲取類型所占字節數通過模板偏特化和宏獲取類型所占字節數...ParamTypes和ParamTypes...的區別 通過繼承實現模板展開using 通過using循環命名的方式來…

開發一個文生圖的功能

文章目錄 效果開發環境原理核心代碼代碼倉庫問題效果 開發環境 Python 3.10PyCharm原理 借助開源項目stable-diffusion,通過該項目封裝python庫diffusers,可以輕易的實現文生圖的功能。 關于更多diffusers的功能請訪問:https://huggingface.co/docs/diffusers/index 核心代…

css樣式表屬性

文章目錄 css樣式表屬性colorbackground-colorfont-sizefont-weightfont-familyfont-styletext-decorationtext-indentline-height(line-height的概念)width、heightletter-spacingtext-aligndirectionwriting-modefont-variantborder-radiusopacitycursorvertical-alignmin-wi…

【數據結構與算法】十大經典排序算法-歸并排序

&#x1f31f;個人博客&#xff1a;www.hellocode.top &#x1f3f0;Java知識導航&#xff1a;Java-Navigate &#x1f525;CSDN&#xff1a;HelloCode. &#x1f31e;知乎&#xff1a;HelloCode &#x1f334;掘金&#xff1a;HelloCode ?如有問題&#xff0c;歡迎指正&#…

如何用輸入函數為數組賦值

在編寫程序時我們經常使用數組&#xff0c;而數組的大小可能是很大的但是我們并不需要為每個元素都自己賦值&#xff0c;我們可能會自定義輸入數組元素個數&#xff0c;我們應該如何實現通過輸入函數為數組賦值呢&#xff1f; 目錄 第一種&#xff1a; 第二種&#xff1a; 第一…

大數據bug-sqoop(二:sqoop同步mysql數據到hive進行字段限制。)

一&#xff1a;sqoop腳本解析。 #&#xff01;/bin/sh mysqlHost$1 mysqlUserName$2 mysqlUserPass$3 mysqlDbName$4 sql$5 split$6 target$7 hiveDbName$8 hiveTbName$9 partFieldName${10} inputDate${11}echo ${mysqlHost} echo ${mysqlUserName} echo ${mysqlUserPass} ec…

OpenCV之remap的使用

OpenCV中使用remap實現圖像的重映射。 重映射是指將圖像中的某一像素值賦值到指定位置的操作&#xff1a;g(x,y) f ( h(x,y) )&#xff0c; 在這里&#xff0c; g( ) 是目標圖像, f() 是源圖像, 而h(x,y) 是作用于 (x,y) 的映射方法函數。為了完成映射過程, 需要獲得一些插值為…