摘要:另外這個方法還用到了內置函數,和中的方法一樣,很容易使用,除了它還有函數。不過好像還在使用低版本的,比如一些內置函數就不可用。
Stylus似乎并不是很有名,以至于很多人不知道它,但提到SASS相信有不少人聽說過甚至使用過很長時間。其實無論是LESS、SASS還是Stylus甚至是Absurd這些預處理工具,都是對CSS的一種延伸和強化。出現這些工具的原因很簡單,CSS本身只是一種描述性質的東西,甚至它不能算是語言而是樣式表,所以我們需要一個有條件語句和變量甚至是函數的東西去動態生成CSS代碼來達到提高效率和增強可維護性的目的。
本文主要以Stylus語法本身和簡單的使用為主要內容,它的目的是介紹和簡單指南。將不會過多涉及Javascript的API調用等問題。
介紹官方的介紹非常簡短而精煉:
Expressive, dynamic, robust CSS
富有表現力的動態的強壯的CSS,它反應了一些主要特點。
首先Stylus相較于SASS更加簡潔,甚至冒號也都可以省略,初學Stylus時感到它太神奇了,僅僅以空格分隔屬性名和多個屬性值就可以生成想要的CSS,而且還可以拼接字符串等等。與此同時,類似Ruby或Python完善的縮進語法,Stylus在簡約自由中有效的防止了語法歧義。
body border 10px*.1 soli+"d" darken(red,10%) // => body { border: 1px solid #e60000; }
其次是動態,這正是其精髓所在,Stylus由Javascript編譯,其結構語句也和Javascript相差不多,前端人員可以很輕松的上手。雖然這方面Absurd是一個極端,但Stylus較之LESS則要優越不少,不僅僅是可定義變量,如Javascript般的條件語句和循環語句也為Stylus帶來各種可能,加上豐富的內置函數,可以輕松判斷和操作各種變量。而利用這樣的動態性,就可以寫出非常強壯的CSS以滿足不同環境和條件下的需要。
pos(type, args) i = 0 position unquote(type) {args[i]} args[i + 1] is a "unit" ? args[i += 1] : 0 {args[i += 1]} args[i + 1] is a "unit" ? args[i += 1] : 0 absolute() pos("absolute", arguments) fixed() pos("fixed", arguments) #prompt absolute top 150px left 5px width 200px margin-left -(@width / 2) #logo fixed top left // => #prompt { position: absolute; top: 150px; left: 5px; width: 200px; margin-left: -100px; } #logo { position: fixed; top: 0; left: 0; }簡單指南
可以看到上面的代碼中使用了Mixin(混合)還有三目運算符等手段構建了一個針對position的方法,用來快速生成一個定位代碼片段。有底向上來看這段代碼,#prompt和#logo是2個ID選擇器,在其中調用了一些Mixin,其實Mixin與Function的區別在于,Mixin的內容是一段CSS代碼,而Function應該是一個值并自動返回,所以調用它們的時候,前者將會替換為一段CSS,而后者將返回一個Boolean或者像素或者顏色之類的東西,也許用于判斷也許直接放入CSS。然后其中的absolute和fixed分別調用了pos這個Mixin。
而且在調用時,也不一定要使用括號的形式,可以使用CSS的形式,直接Mixin名加空格然后寫參數。所以有時候可以直接寫一個Mixin來修改CSS屬性的功能,比如看看下面這個兼容所有標準瀏覽器陰影的寫法,可以很方便的為標準調用加上各標準瀏覽器的前綴:
box-shadow() -webkit-box-shadow arguments -moz-box-shadow arguments -ms-box-shadow arguments -o-box-shadow arguments box-shadow arguments box-shadow 2px 1px 10px red // => -webkit-box-shadow: 2px 1px 10px #f00; -moz-box-shadow: 2px 1px 10px #f00; -ms-box-shadow: 2px 1px 10px #f00; -o-box-shadow: 2px 1px 10px #f00; box-shadow: 2px 1px 10px #f00;
可以看到調用時的寫法與一般的寫法一樣,但是因為Mixin的存在,box-shadow不再是一個屬性,可以變成5行帶有各瀏覽器前綴的CSS。不僅僅是box-shadow,CSS3的許多屬性都需要添加前綴,那是不是可以更近一步呢,來寫一個前綴Mixin吧:
// add prefix for attribute prefix(p_attr, argu...) $pfs = webkit moz ms o for $pf in $pfs -{$pf}-{p_attr} argu {p_attr} argu // box shadow mixin box-shadow() prefix(box-shadow, arguments) // run box-shadow 2px 1px 10px red
如同其他CSS預處理工具一樣,Stylus在顏色方面也擁有許多內置函數,無論是判斷,提取還是修改都十分強大。函數 red , blue , green , alpha 將分別返回顏色對應的rgba值,dark 和 light 用于判斷顏色屬于亮色還是暗色,hue , saturation , lightness 則分別返回顏色的色相、飽和度以及亮度,其中色相是在色環上的角度,單位是deg。我經常用的是lighten 和 darken 這兩個函數,其作用是增加或減少一個顏色的亮度,另外還有飽和度的操作函數 desaturate 和 satucate。
似乎沒有用于修改色相的函數,不過這個需求很容易通過其他辦法搞定。首先使用hue等函數將原始色的色相、飽和度、亮度以及透明度取出,然后對色相的角度進行修改,比如加90deg,最后再使用hsla函數,把去除的對應值當作參數傳入即可。下面用一組三態按鈕來舉個栗子:
See the Pen Single Button by Zhang zhengzheng (@tychio) on CodePen
可以看到Stylus中的第一行代碼 $clr = #99ff22 只要修改這個顏色值就可以改變按鈕的整體風格,并無需考慮hover和active狀態時對應的顏色。比如邊框使用 darken 來加深,陰影泛光可以使用 lighten 來加亮,在觸碰時整體使用了 saturate 來改變飽和度,按下的Active狀態我使用了 invert 函數,可以翻轉顏色,在視覺設計中這個顏色叫做對位色,即色相處于色環的對面的兩種顏色,比如綠對紅,黃對藍,例子中使用了黃綠,所以對位色就是紫色。當然也可以使用上面提到的復雜一些的方法來修改色相,達到使用間隔色之類的效果。
對于響應式的支持,Stylus的media也可以省略花括號,但和Sass有一些區別。Stylus在@media的括號中會原樣輸出,也就是說,我們不能使用變量或混合還有計算等手段來直接寫media query。比如一般情況下需要寫一個min-width,如果這樣寫
$mobiWidth = 768px @media screen and (min-width $mobiWidth - 1px) body margin 0
產生的CSS代碼則仍然是
@media screen and (min-width $mobiWidth - 1px) { body { margin: 0; } }
這不是一個bug,盡管在Github上有無數的人提出issue或者在其后+1,作者仍然不為所動,原因不明,不過幸運地是有很多人都提出解決辦法,下面是一個比較好的方法:
media() join(" and ", arguments) $mobiWidth = 768px $media = media("screen", "(min-width: " + ($mobiWidth - 1px) + ")") @media $media body margin 0 /// => @media screen and (min-width: 767px) { body { margin: 0; } }
這樣就可以使用變量來作為media的參數了,只是寫起來會比sass麻煩一些,但我覺得這樣也許更自由,你可以改進這個方法,比如傳一個object來作為query條件,而不是拼接一個字符串。另外這個方法還用到了 join 內置函數,和Javascript中的Array方法join一樣,很容易使用,除了它還有 push , unshift 函數。
關于數組的定義,對于響應式來說有非常好的幫助,因為響應式往往是一系列的尺寸或設備,無論如何,使用數組可以輕松的定義多組對應與索引的配套值。比如我的blog,對于不同寬度的設備中有不同的內容寬度以及邊距,來看看簡化的代碼:
$screen = 1920px 1280px 1024px 768px 640px 320px $width = 1600px 1080px 840px 600px 480px 300px $margin = 180px 100px 80px 40px 20px 0 media() join(" and ", arguments) responsive(p_index) body width $width[p_index] margin-left $margin[p_index] responsive(0) for $i in 0 1 2 3 4 5 $media = media("screen", "(max-width: " + $screen[$i] + ")") @media $media responsive($i) // => body { width: 1600px; margin-left: 180px; } @media screen and (max-width: 1920px) { body { width: 1600px; margin-left: 180px; } } // ... @media screen and (max-width: 320px) { body { width: 300px; margin-left: 0; } }
當然響應式不是簡單的改變尺寸,如果你需要控制某些內容的顯示則可以使用一個Boolean的數組來判斷是否顯示,控制結構或樣式則可以字符串的數組來放置一些預先寫好的Mixin名稱。
對于CSS Sprite相信是所有切圖者的主要工作產出,以前我也推薦過一些在線的制作Sprite的工具,不過現在有了Stylus,也許我們可能更快的完成這一切。之前公司有需要國旗icon,所以做了這個小項目national_flag用來創建和維護國旗icon的CSS Sprite。由于國家數目眾多,每個國家對應一個國家代碼,所以我定義了一個二維數組用來表現圖片中國旗的位置,然后在數組中填入代碼,用來拼接圖標的class名稱,然后按照數組中的序號和尺寸就可以生成對應的background-position了。主要代碼如下:
iconBuild(id, col, row) .country-{id} background-position (0px - (row * $size)) (0px - (col * $size)) /*r /c-> 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16*/ $row00 = CN AF AZ BH BD BN KH TL IN ID IR IQ IL JP JO KZ KW $row01 = KG LA LB MY MV MN MM NP KP OM PK PS PH QA SA SG KR $row02 = LK SY TJ TH TM AE UZ VN YE DZ AO BJ BW BF BI CM CV $row03 = CF RO KM CG CI CD DJ EG GQ ER ET GA GH GN GW KE LS $row04 = LR __ MG MW ML MR MU MA MZ NA NE NG RW ST SN SC SL $row05 = SO ZA SD __ TZ __ TG TN UG ZM ZW __ __ __ __ __ __ $row06 = JM PR DO KN VC LC TT CR __ SV GT HN NI PA __ DE __ $row07 = MK AT __ __ __ BG CY __ __ DK SK SI ES EE FI FR __ $row08 = GR HU IE IS IT LV LI LT LU MT MD MC ME NO NL PL PT $row09 = UK CZ __ RU SM __ SE CH TR UA EU __ CA __ MX __ US $row10 = AR BO BR CL CO EC GY __ __ PE __ UY VE HK LY NZ RS $row11 = PY AU SR TJ FM AI __ __ __ __ __ __ __ __ __ __ __ $pos = $row00 $row01 $row02 $row03 $row04 $row05 $row06 $row07 $row08 $row09 $row10 $row11 for $rowList, $row in $pos for $country, $col in $rowList if $country != __ iconBuild($country, $row, $col)
其中for不同于Javascript,rowList為數組遍歷出的一個元素,而$row為索引,可以這樣理解 for [value], [index] in [array] 。所以可以在兩個嵌套的for中獲取縱橫的位置以及國家代碼,來生成CSS。
Stylue應用作為預處理工具,Stylus自然也需要預處理器,不過它不像Sass需要Ruby環境,Stylus由Javascript實現,所以有Javascript就可以處理Stylus。
SublimeText2-Stylus2CSS是一款SublimeText2的Stylus插件。另外我使用這個項目的SublimeText2插件來高亮styl文件的代碼。
另外今年8月WebStorm7也才剛剛支持 - Stylus Support。
CodePen支持各種CSS預處理,自然包括Stylus,上面的按鈕例子就是嵌入的CodePen。
Stylus官方在線其實是一些示例,不過它是可編輯的,所以你也可以隨便寫些什么,即時可以看到結果。不過好像還在使用低版本的Stylus,比如一些內置函數就不可用。
不過說到處理文件,Grunt還是我的最愛,尤其Stylus是由Javascript實現,在Nodejs中自然是得天獨厚。npmjs上有許多用來處理Stylus的插件,下面簡單介紹一下Grunt的官方Stylus插件grunt-contrib-stylus。先來看看最簡單的配置方法:
stylus: { compile: { files: { "path/to/result.css": "path/to/source.styl" } } }
如此就可以利用Grunt將source.styl文件中的Stylus代碼編譯為result.css的CSS代碼。當然還可以使用數組來進行多個Stylus文件的打包編譯。當然不僅于此,先來看看主要的幾個配置項:
paths 將自動使用@import來引入一些Stylus文件,比如一些Mixin集合,放在一個Stylus文件中進行維護,寫在paths中后,就可以在每個Stylus文件中調用它們。define 可以定義一些全局變量,然后在Stylus中使用,但我不喜歡使用這個配置,而是更喜歡把全局變量放在一個多帶帶的Stylus文件中,然后將這個文件加入paths的數組中。一句話,把所有不會直接產出CSS的Stylus代碼分成若干個Stylus文件,然后全部添加到paths中,這樣在所有Stylus文件中都可以隨時調用了,但要注意這些Stylus文件的調用關系和使用先后順序。
compress 及 linenos 是兩個Boolean值,用來控制是否壓縮處理后的CSS代碼以及是否在CSS代碼中保留注釋。
banner 是一個字符串,會被放置在CSS文件的最前面,一般我用來寫注釋,比如
banner: "/** * <%= pkg.name %> - <%= pkg.description %> * version <%= pkg.version %> * author <%= pkg.author %> * date <%= grunt.template.today() %> **/ "
firebug 將控制是否使用一個Firebug的Stylus插件FireStylus for Firebug,可以在Firefox中調試Stylus。
use 可以引入一些Stylus的其他grunt插件。
配合watch等Grunt插件就可以達到自動化的Stylus開發,寫樣式將會非常有效率。
總結Stylus是一個由Javascript實現的CSS預處理工具,文件后綴為styl,其擁有變量、函數、混合、條件及循環語句等功能,還有豐富的內置函數用于處理顏色、數字、數組等數據。在grunt的輔助下,Stylus將帶來極大的開發效率。
原文地址: http://www.tychio.net/tech/2013/11/16/stylus-guide.html
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/110861.html
摘要:你還需安裝一個依賴,告訴使用者,你這個是基于哪個版本開發的,當然你可以不安裝這個依賴,那只能自己用了。開發調試在根目錄中運行在本機全局為做一個軟鏈接,如果你移動了目錄你得重新做軟鏈接。因為你在前面添加了文件事實上導入的文件是。 由于Stylus的強大,它支持SCSS LESS 靈活的書寫方式,然后它不用像SCSS安裝Ruby,不是特別出名,流行的工具沒有使用它,只是在小的圈子里面挺火滴...
摘要:默認使用的作為文件擴展名,支持多樣性的語法。功能上更為強壯,和聯系更加緊密。所以我選擇,玩兒過一段時間,主要是這玩意依賴運行,所以我放棄使用了。這樣就算是安裝完了,也可以正常使用。用于保存項目元數據。 stylus介紹 是個什么鬼?對于開發來說,CSS的弱點在于靜態化。我們需要一個真正能提高開發效率的工具,LESS, SASS都在這方面做了一些貢獻。 Stylus 是一個CSS的預...
摘要:如果你使用作為你的預處理的工具,那么是你使用最簡單處理轉工具,使用方法如此簡單首先安裝工具然后只要在你的文件引用就可以里工具將編譯成并預處理將轉換成上面內容輸出為選擇使用和設置初始值默認你可以設置它。 showImg(https://segmentfault.com/img/remote/1460000004847061); showImg(https://segmentfault.c...
摘要:介紹是一個的預處理框架,年產生,來自社區,主要用來給項目進行預處理支持,所以是一種新型語言,可以創建健壯的動態的富有表現力的。 stylus介紹 Stylus 是一個CSS的預處理框架,2010年產生,來自Node.js社區,主要用來給Node項目進行CSS預處理支持,所以 Stylus 是一種新型語言,可以創建健壯的、動態的、富有表現力的CSS。比較年輕,其本質上做的事情與 SASS...
摘要:介紹是一個的預處理框架,年產生,來自社區,主要用來給項目進行預處理支持,所以是一種新型語言,可以創建健壯的動態的富有表現力的。 stylus介紹 Stylus 是一個CSS的預處理框架,2010年產生,來自Node.js社區,主要用來給Node項目進行CSS預處理支持,所以 Stylus 是一種新型語言,可以創建健壯的、動態的、富有表現力的CSS。比較年輕,其本質上做的事情與 SASS...
閱讀 1589·2021-09-02 15:41
閱讀 997·2021-09-02 15:11
閱讀 1278·2021-07-28 00:15
閱讀 2307·2019-08-30 15:55
閱讀 1144·2019-08-30 15:54
閱讀 1692·2019-08-30 15:54
閱讀 2975·2019-08-30 14:02
閱讀 2523·2019-08-29 16:57