CSS預編譯語言Less的用法總結

huanghui8030發表於2018-05-09

1、什麼是Less?

​ less官網:Less is More , Than CSS -少即是多,比CSS

​ 官網gitHub:https://github.com/less/less.js

1.1 Less介紹

Less是一門css預處理語言,或是一種動態樣式語言。擴充套件了css語言,增加了變數、繼承、巢狀、運算、函式等特性,使css更易維護和擴充套件。(類似jquery)

Less既可以在瀏覽器端上執行(支援IE7+、chrome、ff等主流瀏覽器,不支援iPad 待測試),也可以在Node伺服器端執行。

例如:

@base: #f938ab;
@width:200px;
.box-shadow(@style, @c) when (iscolor(@c)) {
    width:@width;
    height:@width;
    margin-top:20px;
  -webkit-box-shadow: @style @c;
  box-shadow:         @style @c;
}
.box-shadow(@style, @alpha: 50%) when (isnumber(@alpha)) {
  .box-shadow(@style, rgba(0, 0, 0, @alpha));
}
.box {
  color: saturate(@base, 5%);
  border-color: lighten(@base, 30%);
  .div1 { .box-shadow(0 0 5px, 30%) }
  .div2{
      .box-shadow(5px 5px 5px 5px,@base);
  }
}

解析:

.box {
  color: #fe33ac;
  border-color: #fdcdea;
}
.box .div1 {
  width: 200px;
  height: 200px;
  background-color: red;
  color: #fff;
  margin-top: 20px;
  -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
  box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
}
.box .div2 {
  width: 200px;
  height: 200px;
  background-color: red;
  color: #fff;
  margin-top: 20px;
  -webkit-box-shadow: 5px 5px 5px 5px #f938ab;
  box-shadow: 5px 5px 5px 5px #f938ab;
}

現在流行的css預編譯語言:Less和Sass

1.2 Less的優點

  • 簡單,易於維護,CSS管理更加容易
  • 高效的進行開發
  • 使用Less實現配色將變得非常容易。
  • 與CSS能夠很好地融合使用。
  • 同時相容CSS3

2、如何呼叫less

2.1 Less呼叫方法

  • 運用GUI工具運用工具koala或者SimpLess是來自動解析成.css檔案(已給大家講過,這裡不在重複)
  • 引用less.js進行解析,在頁面引入less.js對.less檔案進行解析。
  • less官網線上解析:http://less2css.org
  • 運用node來解析成css
  • 利用gulp等自動化工具進行解析研究中

2.2 GUI工具Koala

  • Source Map:編譯過程中生成 css 對應的 map 檔案。除錯時使用,有了source map,瀏覽器裡直接顯示less,非常方便
  • Line Comments:保留註釋,勾選後編譯中在註釋上一行新增一條空行。
  • Autoprefix:自動給 CSS3 元素加上瀏覽器字首。

    參考:知乎

2.3 伺服器端解析: less.js解析

  • 第一步,引入styls.less,注意 rel=“stylesheet/less”

    1、內聯樣式:

    <style type="text/less">
      // less 程式碼
    </style>

​ 2、外聯樣式

  <link rel="stylesheet/less"  href="styles.less" />
  • 第二步,引數配置(可省略)具體意思待研究

    <!-- 在引入less.js之前配置引數項 -->
    <script>
      less = {
        env: "development",
        logLevel: 2,
        async: false,
        fileAsync: false,
        poll: 1000,
        functions: {},
        dumpLineNumbers: "comments",
        relativeUrls: false,
        rootpath: ":/a.com/"
      };
    </script>
引數 型別 預設值 引數 說明
evn String 取決於頁面的URL 可以在development或是production環境下執行。
logLevel Number 2 2 – 提示資訊(Information)和錯誤(errors)1 – 錯誤(Errors)0 – 空(Nothing) javascript控制檯日誌量(錯誤等級)。注意:在production環境下,獲取不到日誌。
async Boolean false false、true 是否非同步匯入檔案
fileAsync Boolean false false 使用檔案協議訪問頁面時非同步載入匯入的檔案。
poll Integer 1000 在監視模式下,每兩次請求之間的時間間隔(ms)。
functions Object 在functions這個物件中,key作為函式的名字。
dumpLineNumbers String comment、mediaQuery、all 當設定dumpLineNumbers直接輸出源行資訊到編譯好的CSSS的檔案中時,有利於你除錯指定行。
relativeUrls Boolean false 是否調整相對路徑。如果為false,則url已經是相對於入口的LESS檔案。
rootpath String false 新增到每個URL開始處的路徑
  • 第三步,引入less.js,在此前加入.less檔案。

    <script src="less.js" type="text/javascript"></script>
  • 第二步和第三步一起

    <script src="less.js" data-poll="1000" data-relative-urls="false"></script>
    <link data-dump-line-numbers="all" data-global-vars=`{ myvar: "#ddffee", mystr: ""quoted"" }` rel="stylesheet/less" type="text/css" href="less/styles.less">
  • 注意:

    • 如果載入多個.less樣式表檔案,每個單獨編譯,一個檔案中定義的任何變數都無法再其他檔案中訪問。不會存在變數重複問題。
    • 在伺服器環境下使用,本地直接開啟可能會報錯!
    • Less相容IE7+,如需相容則需要先引入es5-shim.js即可。
    • 其中還有一些高階配置,也可通過瀏覽器直接除錯,具體見參考文件。
    • 不建議使用,增加伺服器壓力,不利於除錯。

2.4 Node解析

  • 先按照node.js
  • 下載less的管理工具包

    $ sudo npm install -g less
  • 執行方法解析成css檔案

    $ lesssc styles.less styles.css
  • 解析成min.css檔案,安裝clean-css

    $ npm install clean-css
    $ lessc --clean-css styles.less styles.min.css

    less命令列用法

  • node上安裝即時編譯的外掛

    $ (sudo) npm install -g less-watch-compiler
    $ less-watch-compiler path_input path_out
    $ less-watch-compiler path_input path_out fileName.less
  • 新增廠商字首

    $(sudo) npm install -g less-plugin-autoprefix
    $ less inputFile.less outFile.less —autoprefix=“browsers”
    $ lessc test.less test.css --autoprefix="ie >= 8, last 3 versions, > 2%"

2.5 IDE 對應的外掛

3、Less語法詳解

3.1 註釋

  • /** 可解析 **/
  • //不可解析

3.2 變數

變數@來定義,允許單獨定義一系列通用的樣式,然後在需要的時候進行呼叫。

//less                          
@cGray:#ccc; 
@cRed:red;
@width:80px;
@height:120px;
.div1{
  color:@cGray;
  border:1px solid @cGray;
  width:@width;
  height:@height;
}
.div2{
  color:@cRed;
  background:@cGray;
  width:@height;
  height:@width;
}
 /*生成的css*/
.div1 {
  color: #cccccc;
  border: 1px solid #cccccc;
  width: 80px;
  height: 120px;
}
.div2 {
  color: #ff0000;
  background: #cccccc;
  width: 120px;
  height: 80px;
}

3.3 巢狀

在一個選擇其中巢狀另一個選擇器來實現繼承,減少程式碼量,程式碼更清晰。程式碼優化考慮,最多巢狀三層。

&時解析的是同一個元素或此元素的偽類,沒有&解析是後代元素

// LESS
#demo2 {
  h2 {
    font-size: 18px;
    font-weight: bold;
  }
  p { 
    font-size: 12px;
    color:#90bd39;
    a { text-decoration: none;
      &:hover { text-decoration: underline; }
    }
  }
}
/* 生成的 CSS */
#demo2 h2 {
  font-size: 18px;
  font-weight: bold;
}
#demo2 p {
  font-size: 12px;
  color:#90bd39;
}
#demo2 p a {
  text-decoration: none;
}
#demo2 p a:hover {
  text-decoration: underline;
}

3.4 運算

運算提供了加減乘除操作,可以對任何數字、顏色、變數進行運算,可以實現屬性值之間的複雜關係。和Javascript程式碼一樣。

//less
@basewidth: 100px;
@baseColor: #111;
@blue: #09c;
.div1 {
  color: @baseColor * 3;
  height: @basewidth;
  width: @basewidth * 2;
}
.div2 { 
  color: @baseColor + #003300;
  background-color: desaturate(@blue, 10%);
}
/* 生成的 CSS */
.div1 {
  color: #333333;
  height: 100px;
  width: 200px;
}
.div2 { 
  color: #114411;
  background-color: #0a94c2;
}

運算有順序,和平時的四則運算一樣

@var: 20px;
.div3 {
  width: @var + 5 * 2;
  height: (@var + 5 ) * 2;
}
.div3 {
  width: 30px;
  height: 50px;
}

3.5 顏色函式

  • 色輪,spin(param1,param2)函式

    • 互補色,互補的顏色正好在色輪相反的位置

      @colorBase:#3bafdA;
      @colorComplement:spin(@colorBase,180);//得到#dc6939
    • 三元色。我們可以進一步探討顏色模型並且建立一個三元色結構。“三元”,顧名思義,是由三種顏色組成。因此,我們將色輪分成三部分,並且用函式spin()來設定旋轉的度數:

      @triadicSecondary:spin(@colorBase,-(360/3));//第二種顏色#b1d926
      @triadicTertiary:spin(@colorBase, 360/3);//第三種顏色#db43b2
  • 混合色,mix(param1,param2),對兩個顏色進行混合

    #div1{color:mix(red,yello)}//#ff800
  • 明暗度,lighten(param1,param2)淺一點,darken(param1,param2)深一點

    @ahover:lighten(@colorBase,10%);
    @afocus:darken(@colorBase,10%);
  • 飽和度,saturate(param1,param2)和desaturate(param1,param2)。飽和度定義了一種顏色的深度。飽和度越大,顏色越亮麗,最低飽和度則會使顏色趨於灰色。

    @btnHover:saturate(@colorBase,10%);
    @btnFocus:desaturate(@colorBase,10%);
    @btnDisable:lightness(desaturate(@colorBase,100%),30%;
  • 智慧色彩輸出。LESS讓我們的樣式變得更智慧。舉例來說,我們能讓我們的樣式自己“思考”並決定什麼顏色在什麼條件下適用。假設我們正在建立一個網站模板,這是按鈕的
    基本樣式,你打算用不同的顏色和風格來擴充套件它。但是我們怎樣控制顏色的輸出呢?我們當然不希望深色的文字在深色的背景上,反之亦然。我們需要確保文字保留對比,以便於閱讀,這樣,contrast()函式就派上用場了。

    @bColor:#000;
    div{
      background-color:@bColor;
      color:contrast(@bColor);//#ff
    }

3.6 繼承

混合可以將一個定義好的class A輕鬆引入到另個class B裡面,從而簡單實現class B繼承class A中的所有屬性。還可以帶引數呼叫,和函式一樣。

有預設值,也可以不加預設值,或者是不加引數、多個引數都可行。

需要帶括號,如果是沒有變數的時候可不帶括號。

例如:

//less
.rounded-corners (@radius: 5px) {
  width:100px;
  height:30px;
  margin-bottom:10px;
  background-color: #ccc;
  color:#333;
  border-radius: @radius;
  -webkit-border-radius: @radius;
  -moz-border-radius: @radius;
}
.div1{
  .rounded-corners();//.rounded-corners;
}
.div2{
  .rounded-corners(10px);
} 
/* 生成的 CSS */
.div1 {
  width: 100px;
  height: 30px;
  margin-bottom: 10px;
  background-color: #ccc;
  color: #333;
  border-radius: 5px;
  -webkit-border-radius: 5px;
  -moz-border-radius: 5px;
}
.div2 {
  width: 100px;
  height: 30px;
  margin-bottom: 10px;
  background-color: #ccc;
  color: #333;
  border-radius: 10px;
  -webkit-border-radius: 10px;
  -moz-border-radius: 10px;
}

3.7 匹配模式

匹配模式,即使同一個函式用不同的引數時呼叫不同的方法。例如寫一個三角:

.triangleBase{
  width:0;
  height:0;
  overflow:hidden;
}
.triangle(top,@w:5px,@c:#ccc){
  .triangleBase;
  border-width:@w;
  border-color:@c transparent transparent transparent;
  border-style:solid dashed dashed dashed;
}
.triangle(bottom,@w:5px,@c:#ccc){
  .triangleBase;
  border-width:@w;
  border-color:transparent transparent @c transparent;
  border-style: dashed dashed solid dashed;
}
.div1{
  .triangle(top);
}
.div2{
  .triangle(bottom);
} 

另一種寫法,@_ 所有方法都呼叫:

.triangle(@_){
  width:0;
  height:0;
  overflow:hidden;
}
.triangle(top,@w:5px,@c:#ccc){
  border-width:@w;
  border-color:@c transparent transparent transparent;
  border-style:solid dashed dashed dashed;
}
.triangle(bottom,@w:5px,@c:#ccc){
  border-width:@w;
  border-color:transparent transparent @c transparent;
  border-style: dashed dashed solid dashed;
}
.div1{
  .triangle(top);
}
.div2{
  .triangle(bottom);
} 

生成的css:

.div1 {
  width: 0;
  height: 0;
  overflow: hidden;
  border-width: 5px;
  border-color: #cccccc transparent transparent transparent;
  border-style: solid dashed dashed dashed;
}
.div2 {
  width: 0;
  height: 0;
  overflow: hidden;
  border-width: 5px;
  border-color: transparent transparent #cccccc transparent;
  border-style: dashed dashed solid dashed;
}

3.8 其他

@arguments變數包含所有傳遞進來的引數。

//@argumentts變數
.border(@w:30px,@c:red,@s:solid){
  border:@arguments;
}
.test_arguments{
  border();
}

避免編譯,有時候需要輸出一些不正確的css語法或者使用一些Less不認識的專有語法,在前面加入~

.test{
  filter: ~"progid:DXImageTransform.Microsoft.Alpha(opacity=20)";
}
.test{
  filter: progid:DXImageTransform.Microsoft.Alpha(opacity=20); 
}

!important關鍵字,會為所有混合所帶來的樣式,新增上!important

.test{
  .border()!important;
}

JavaScript 賦值,在樣式表中使用Javascript——相當精彩。你可以使用表示式,也可以參考環境方向來使用反單引號。

@string: ``hello`.toUpperCase()`; /* @string 變成 `HELLO` */ 
   
/* 你也可以使用前面提到的插值: */ 
@string: `HELLO`;  
@var: ~``@{string}`.topUpperCase()`; /* 變為 `HELLO` */ 
   
/* 獲取文件的資訊 */ 
@height = `document.body.clientHeight`;

@import,用@import匯入css或者less檔案,減少伺服器資源請求

  • less檔案可以省略字尾名,同時可以在檔案任意地方引入
  • css檔案需要加入字尾名

用@import時,Koala編譯會讓軟體崩潰,用node吧!

3.9 總結

  • 註釋,可解析註釋和不可解析的註釋
  • 變數用@定義,通過改變一個值改變多處樣式
  • 巢狀,符合dom結構
  • 運算,加減乘除四則運算規律
  • 繼承,和js函式一樣
  • 匹配模式,類似函式引數
  • @arguments 變數包含所有傳遞進來的引數、避免編譯~、!important為所有樣式加上!important
  • color函式:lighten(@color,10%)darken(@color,10%)
  • 匯入:@import:`style` less副檔名可選,@import:`style.css` 。減少伺服器資源請求
  • 字串插入,字串也可以用於變數中,然後通過@{name} 來呼叫
@base_url : `http://www.t1.chei.com.cn/common`;  
background-image: url("@{base_url}/images/background.png"); 

4、Less和Sass的對比

相同點

  • 兩者都是css預編譯
  • 很多語法類似,思想一樣

不同點

  • Less環境以及使用方面比Sass簡單
  • 條件語句與控制,less不支援。Sass可以使用if { } else { } 條件語句,以及for { }迴圈。它甚至支援 and、 or和 not,以及 <、 >、 <=、 >= 和 == 等操作符。
  • koala輸出格式,LESS:normal(正常)、compress(壓縮)。而Sass提供4中輸出選項:nested(正常縮排)、expanded(括號不單獨佔一行)、 compact(一個類一行顯示)和compressed (壓縮為一行)。
  • less基於純JavaScript,通過伺服器端來處理的;Sass是基於Ruby的,在伺服器端處理。

總結

​ 如果你是Ruby或HAML的粉絲,那麼Sass會是你的好助手。對我來說,一個前端開發人員,我傾向於LESS,因為它便於引入和能夠使用JavaScript的表示式以及文件屬性。對於新手來說更簡單可用。

​ 對於剛接觸的css預編譯的前端,我推薦用Less。

5、參考文件

原始碼,其中還有對應的PPT,想要看PPT的可以私信或留言給我,我發給大家。

相關文章