摘要:變量聲明和調用這是的編程元素基礎之一。如下在最外層聲明的是全局變量,全局范圍內可以調用,在中聲明的是的局部變量,只在內部內進行調用。生成的如下上面的內容就是的基礎篇,進階篇的話會整理一下函數(shù)和方法規(guī)則相關的東西。
sass起源和簡介
css 其實不是一門編程語言, css 全稱 Cascading Style Sheets (層疊樣式表)是一種用來表現(xiàn)HTML(標準通用標記語言的一個應用)或 XML(標準通用標記語言的一個子集)等文件樣式的計算機語言。我們用它來實現(xiàn)表現(xiàn)層和結構層的分離,也就是 html 和樣式的分離。你可以用它為網頁制定樣式,但是他無法像 JavaScript 一樣聲明變量,調用函數(shù),使用條件語句,可以說 JavaScript 是靈活的,動態(tài)的,而 css 是死板的,一成不變的。
所以,有人想要為其加入編程的思想,讓他擁有遍歷,擁有方法,甚至擁有繼承,能夠告訴你語法上的錯誤,所以有了css預處理,它的思想是先用一門新的專門編程的語言來設計網頁樣式,再編譯成css,其實最后引用的仍舊是編譯出來的css。
說到css預處理,可能大部分人首先想到的是Less。現(xiàn)在做css預處理的語言比較優(yōu)秀的Less是其一:它快速方便入門簡單,sass是其二:相對來說說它更加靈活,語法更多(尤其是if else for),當然好多人不使用的原因是嫌棄它安裝不方便(還好有淘寶鏡像),其三是Stylus:他與sass比較類似都是更加靈活強大。
想好什么時候我們可以使用css預處理
css預處理讓我們對樣式的處理更加編程化,但是我們仍需要考慮好在怎樣的環(huán)境中使用它,因為我們知道,無論你的sass代碼多么炫酷,邏輯多么縝密,到最后都是生成了一個css文件。
所以我們需要根據(jù)項目的大小以及開發(fā)時間團隊成本來確定,如果項目比較小需要的css并不是太多并且開發(fā)時間緊迫團隊里很多人還不會使用,那么可能使用原生的css可能會更好一些。
sass基礎 安裝很多開發(fā)者原本是想使用sass的,但是因為sass是基于ruby的,墻在上,ruby裝半天裝不上,于是放棄,這里推薦使用淘寶的鏡像來進行安裝。
編譯 學習使用推薦使用koala, koala是一個前端預處理器語言圖形編譯工具,支持Less、Sass、Compass、CoffeeScript,幫助web開發(fā)者更高效地使用它們進行開發(fā)。跨平臺運行,完美兼容windows、linux、mac。
如果是學習的話可以先使用koala來進行調試,如果使用到現(xiàn)代工程化項目中,推薦使用webpack安裝配置sass-loader
sass和scss先來看看區(qū)別吧
$color : red; //sass語法 .box color:$color; //scss語法 .box{ color:$color; }
其實 sass 語法是 sass 最開始的語法結構,是通過 tab 縮進來進行的一個規(guī)則,有點類似 jade模板的那種縮進,而且這種語法規(guī)則十分嚴格,有啥不對勁,編譯的時候就報錯。
而 scss 呢,是 sass 的新語法格式,不要認為他是另外一種預處理語言,其實它是 sass 在發(fā)現(xiàn)之前的語法結構太過于嚴格,并且和 css 有點不像后重新定制的語法結構,它在外觀上是與css基本一致的,并且它十分寬松,你可以直接將之前的 css 代碼復制過來。
我在這里寫在了一個代碼塊中只是示例,其實他們文件名是分別以 .sass 和 .scss 來結尾的。
變量聲明和調用這是 sass 的編程元素基礎之一。在 JS 中我們使用 var 來聲明變量,當然 ES6 中新加了 let const。而在sass聲明和調用變量的規(guī)則如下
$height: 15px !default; //聲明默認變量 $height: 50px; //聲明普通變量 body{ height: $height; }
變量有默認變量和普通變量之分,默認變量只需像 !important 一樣在值后面加上 !default 即可。其實一般情況下我們只需要聲明普通變量,默認變量在開發(fā)組件時使用比較方便。
嵌套和局部變量,全局變量和JS類似,sass語法中也有局部變量和全局變量。如下在最外層聲明的是全局變量,全局范圍內可以調用,在em{}中聲明的是em的局部變量,只在em{}內部內進行調用。
$color:#000; //全局變量 .block { color: $color; } em { $color: #fff; //局部變量 a { //選擇器嵌套 color: $color; font: { //屬性嵌套 size: 12px; weight: bold; } &:hover { //偽類嵌套 color: $color; } } }數(shù)據(jù)類型
和JS類似,sass也擁有自己的數(shù)據(jù)類型分別是
數(shù)字: 如,1、 2、 13、 10px; 字符串:有引號字符串或無引號字符串,如,"foo"、 "bar"、 baz; 顏色:如,blue、 #04a3f9、 rgba(255,0,0,0.5); 布爾型:如,true、 false; 空值:如,null; 值列表:用空格或者逗號分開,如,1.5em 1em 0 2em 、 Helvetica, Arial, sans-serif。混合宏
編程的思想,混合宏是一個類似于函數(shù)的存在,當然,他并不是函數(shù),簡單來說就是增加參數(shù)功能的使得靈活度提升的可重用的代碼塊。
@mixin border-radius{ -webkit-border-radius: 5px; border-radius: 5px; } button { @include border-radius; }
這里是一個簡單的混合宏的使用,先是用 @mixin 定義了一個名叫 border-radius 的混合宏,然后在代碼中利用 @include 進行調用,其實這樣的話并不能太大體現(xiàn)出混合宏的特色。看下面的
@mixin border-radius1($radius){ -webkit-border-radius: $radius; border-radius: $radius; } @mixin border-radius2($radius:5px){ -webkit-border-radius: $radius; border-radius: $radius; } .box1 { @include border-radius(5px); } .box2 { @include border-radius; } .box2 { @include border-radius(5px); }
從代碼里可以看出,混合宏可以像函數(shù)一樣傳入?yún)?shù),并且可以像 ES6 的函數(shù)擴展一樣添加參數(shù)默認值,如果在調用的時候不傳參數(shù),那么就會使用默認的值,這樣極大的增加了代碼的靈活性,省卻很多開發(fā)時間。
其實,mixin 的靈活還不僅僅如此,它可以傳入多個參數(shù),這樣我們想到了函數(shù)可以根據(jù)參數(shù)數(shù)量的不同來執(zhí)行不同的代碼,是的,sass也可以做到。
@mixin size($width,$height){ //兩個參數(shù)或者多個參數(shù)可以這樣這樣定義 width: $width; height: $height; } .box-center { @include size(100px,200px); } @mixin box-shadow($shadows...){ //參數(shù)過多可以使用...來代替 @if length($shadows) >= 1 { -webkit-box-shadow: $shadows; box-shadow: $shadows; } @else { $shadows: 0 0 2px rgba(#000,.25); -webkit-box-shadow: $shadow; box-shadow: $shadow; } } .box { @include box-shadow(0 0 1px rgba(#000,.5),0 0 2px rgba(#000,.2)); }
上面兩個代碼塊第一個比較簡單,就是增加參數(shù)數(shù)目。下面的代碼塊我們利用sass的if else方法來實現(xiàn)了判斷,如果參數(shù)數(shù)目大于等于1,也就是傳了參數(shù),那么我們執(zhí)行上面的代碼,如果沒有傳參我們執(zhí)行下面的代碼,設置默認的$shadows值生成代碼塊。
但是混合宏也有不足之處:那就是調用一個混合宏生成的css代碼并不會進行合并,這也是因為他能夠傳參所設置的,所以對于復用性很強的代碼塊不推薦使用混合宏。
繼承和占位符sass允許你使用@extend繼承別的代碼塊,并且通過@extend所繼承的代碼塊會在生成css的時候進行合并~完美解決了上面的問題。
.btn1 { border: 1px solid #ccc; padding: 6px 10px; font-size: 14px; } %btn2 { border: 1px solid #ccc; padding: 6px 10px; font-size: 14px; } %btn3 { border: 1px solid #ccc; padding: 6px 10px; font-size: 14px; } .btn-primary1 { background-color: #f36; color: #fff; @extend .btn1; } .btn-primary2 { background-color: #f36; color: #fff; @extend %btn2; }
上面的代碼中.btn1是預先定義好的類,然后我們在.btn-primary1中繼承他的所有代碼塊,而%btn2就是在標題里所提到的占位符,占位符的代碼塊如果不被繼承在生成的css中是不會顯示出來的,所以如果你是用sass編譯css的話,公共類使用占位符來定義是一個很不錯的選擇。為了加深理解我們看下上面的代碼所生成的css代碼。
.btn1, .btn-primary1 { border: 1px solid #ccc; padding: 6px 10px; font-size: 14px; } .btn-primary2 { border: 1px solid #ccc; padding: 6px 10px; font-size: 14px; } .btn-primary1 { background-color: #f36; color: #fff; } .btn-primary2 { background-color: #f36; color: #fff; }
繼承btn1的btn-primary1他和btn1進行了合并,而我們使用占位符定義的%btn2 %btn3在生成代碼里沒有顯示,因為btn-primary2繼承了%btn2,所以他繼承的公共部分被多帶帶拿出來,如果有多個代碼塊繼承%btn2,他們會進行合并。
占位符還是混合宏,主要還是看你的代碼怎么使用,如果只是靜態(tài)的代碼公共塊,那么占位符會比較適合,而如果是可變的代碼例如寫一個復雜的css3動畫之類的,可能混合宏比較適合了。插值#{}
如果接觸過jade模板的朋友會比較熟悉,這里的插值和它用法是基本一致的。讓我們來看一個復雜的代碼塊。
$properties: (margin, padding); @mixin set-value($side, $value) { @each $prop in $properties { #{$prop}-#{$side}: $value; } } .login-box { @include set-value(top, 14px); }
首先我們聲明了一個$properties的變量,里面是一個值列表里面兩個字符串,@mixin方法里我們通過@each方法循環(huán)出值列表里面的字符串然后利用插值的方法將字符串插入進去,我們看下生成的css代碼
.login-box { margin-top: 14px; padding-top: 14px; }
這里只是做一個示例,正常情況下我們不會用這么復雜的方法來生成這么短的css代碼。
運算sass允許我們做一些基本的運算:加減乘除,但是我要說的是:注意單位!注意單位!注意單位!當然如果你異想天開em+px,px*px,px/rem.................
需要知道的是sass里允許進行顏色運算,也就是說 #222222 * 2你將會得到 #444444,其實顏色的運算機制是分段運算也就是說如果22*2 22*2 22*2然后在進行合并的。
字符串運算:字符串可以通過+來進行鏈接,需要注意的是因為sass的字符串有兩種類型,帶引號和不帶引號,相同相加當然出來的是一致的。如果有引號的字符串被添加了一個沒有引號的字符串 (也就是,帶引號的字符串在 + 符號左側), 結果會是一個有引號的字符串。 同樣的,如果一個沒有引號的字符串被添加了一個有引號的字符串 (沒有引號的字符串在 + 符號左側), 結果將是一個沒有引號的字符串,其實就是誰在左邊就跟著誰。
p:before { content: "Foo " + Bar; font-family: sans- + "serif"; } //生成的css如下 p:before { content: "Foo Bar"; font-family: sans-serif; }
上面的內容就是sass的基礎篇,進階篇的話會整理一下函數(shù)和方法規(guī)則相關的東西。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/113288.html
摘要:使用預編譯處理的優(yōu)勢使用預處理器,可以提供缺失的樣式層復用機制減少冗余代碼,提高樣式代碼的可維護性。所以我們在實際項目中衡量預編譯方案時,還是得想想,比起帶來的額外維護開銷,預處理器有沒有解決更大的麻煩。 一、什么是css預編譯處理? CSS 預編譯處理,從字面上理解,就是預先編譯處理CSS。它擴展了 CSS 語言,增加了變量、Mixin、函數(shù)等編程的特性,使 CSS 更易維護和擴展。...
摘要:字符串函數(shù)函數(shù)主要是用來刪除一個字符串中的引號,如果這個字符串沒有帶有引號,將返回原始的字符串。顏色函數(shù)顏色函數(shù)在的官方文檔中,列出了的顏色函數(shù)清單,從大的方面主要分為和三大函數(shù),當然其還包括一些其他的顏色函數(shù),比如說和等。 基礎篇中主要介紹了一些sass的基本特性,進階篇中,主要是寫一些我們常用的sass控制命令,函數(shù)和規(guī)則。 控制命令 可能看過基礎篇的朋友會發(fā)現(xiàn)在有些代碼中出現(xiàn)@i...
摘要:上面的命令會將編譯的傳遞給,你可以將它保存到一個文件中除了上面的命令轉譯源文件之外,現(xiàn)在還有很多第三方開發(fā)的工具,例如是一個前端預處理器語言圖形編譯工具,支持,幫助開發(fā)者更高效地使用它們進行開發(fā)。 一、Sass、LESS和Stylus的安裝 1.Sass的安裝 Sass是Ruby語言寫的,但是兩者的語法沒有關系。不懂Ruby,照樣可以正常使用Sass。只是必須先安裝Ruby,然后再安裝...
摘要:值得慶幸的是,這三款預處理器語言的語法和語法都差不多。在這一節(jié)中,我們依次來對比一下這三款預處理器語言各種特性的異同之處,以及使用方法。預處理器語言支持任何變量例如顏色數(shù)值文本。 一、Sass、LESS和Stylus的語法 每一種語言都有自己一定的語法規(guī)則,CSS預處理器語言也不例外,在真正使用CSS預處器語言之前還有一個不可缺少的知識點,就是對語法的理解。值得慶幸的是,這三款CSS預...
閱讀 2443·2021-10-09 09:44
閱讀 3812·2021-09-22 15:43
閱讀 2931·2021-09-02 09:47
閱讀 2556·2021-08-12 13:29
閱讀 3878·2019-08-30 15:43
閱讀 1687·2019-08-30 13:06
閱讀 2195·2019-08-29 16:07
閱讀 2756·2019-08-29 15:23