本篇博客將會詳細描述less的常見用法,適合入門的新手。css
旺財:"less可以大量的簡化重複的代碼能舉個例子?" 問渠:"閱讀bootstrape源碼,按鈕樣式的實現用less語法只須要168行,而用CSS語法寫須要439行"
方式一:在瀏覽器裏面直接引入能夠解析less語法的js文件,來瞧瞧下面一個例子;less.min.js文件請到官網下載html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>less001</title> <!-- 注意type="text/less"依賴的js才能正確解析 --> <style type="text/less"> @width: 100px; @height: @width + 10px; .header { width: @width; height: @height; background-color:red; } </style> </head> <body> <div class="header"> 1234567890 </div> </body> <!-- 依賴的less.min.js文件必須放在要解析的less語法後面纔能有效 --> <script src="./less.min.js"></script> </html>
方式二:經過開發工具自身的支持,好比koala;前端
方式三:node.js曉不曉得?高端玩家都用這個;node
第一步:全局環境下安裝less編譯器 npm install -g less 第二部:lessc 須要編譯的文件名稱 編譯後的文件名稱 lessc 001.less 001.css
001.less文件內容: @width: 100px; @height: @width + 10px; .header { width: @width; height: @height; background-color:red; }
用html文件中引入編譯後的001.css文件查看效果 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>less003</title> <link type="text/css" rel="stylesheet" href="./001.css" /> </head> <body> <div class="header"> 方式三:1234567890 </div> </body> </html>
方式四:在webpack打包工具中使用;webpack
npm i less less-loader --save-dev
//讓咱們先看一段less編譯前的代碼: @color:red; @selector: .header; @srcName: width; @{selector}{ @{srcName}: 200px; height: 200px; background-color:@color; } //如下是編譯後的代碼: .header { width: 200px; height: 200px; background-color: red; }
由此咱們須要知道以下用法:web
編譯前的less文件: //開頭的註釋,不會編譯到css文件中 /*包裹的註釋,編譯到css文件中*/ .header{ height: 200px; } 編譯後的css文件: /*包裹的註釋,編譯到css文件中*/ .header { height: 200px; }
//假設有以下HTML片斷 <div class="header"> <div class="nav">123</div>> <div class="logo">456</div>> </div> //對應的有以下css代碼: .header { font-size: 12px; } .header .nav { float: left; background-color: red; } //.nav { //沒有.header的前綴 // float: left; // background-color: red; //} .header .logo { float: left; width: 300px; }
以上代碼存在嵌套關係,即類nav和類logo是header的子類,可是代碼結構卻沒有體現出來;若是代碼是小白寫的(註釋的那一段),類nav沒有加上前綴header,那就更加可怕了,看下面less如何實現npm
//帶有嵌套規則的less代碼: .header { font-size: 12px; .nav { float:left; background-color:red; } .logo { float:left; width: 300px; } }
less可以容許咱們像寫html結構代碼同樣去寫css代碼。可是在使用嵌套的時候有兩種狀況須要注意:bootstrap
一: &表明當前選擇器的父級;當你使用僞元素的時候,前面若是沒有具體選擇器,編譯後僞元素前面會有空格,致使樣式代碼不生效,這個時候能夠在僞元素前面加上&。瀏覽器
//:hover、 :after、 :focus...各類僞元素都逃不了在前面加&或者選擇器 &:hover { background-color:green; }
二: 在前面變量部分咱們說過@符號在less語法中是用於定義變量的。可是在實際過程當中css自身語法中@就有特定的用法,好比說@media表示媒體查詢,這樣的話就和less語法衝突了。less解決方案是把css自身的@語法放到其它語法前面以下:app
//less語法 .component { width: 300px; @media (min-width: 768px) { width: 600px; @media (min-resolution: 192dpi) { background-image: url(/img/retina2x.png); } } @media (min-width: 1280px) { width: 800px; } } //編譯後的css語法 .component { width: 300px; } @media (min-width: 768px) { .component { width: 600px; } } @media (min-width: 768px) and (min-resolution: 192dpi) { .component { background-image: url(/img/retina2x.png); } } @media (min-width: 1280px) { .component { width: 800px; } }
旺財:"你不是說用less可以大量的簡化重複的代碼嗎?我看着代碼咋那麼麻煩呢?" 問渠:"以前的語法只是鋪墊,less混合這個功能十分強大,保證完成簡化代碼的任務"
混合的做用有點相似於函數,可以經過調用混合名稱,獲取一堆預先定義的規則屬性,而不用再去寫重複的代碼,具體看下案例。 基本用法以下,咱們一一來分析下:
//1. 混合的基本使用 //假設有以下代碼: .div1 { float: left; width: 200px; height: 200px; background-color: green; } .div2 { float: left; width: 200px; height: 200px; background-color: red; } //很明顯這段代碼中除了背景顏色不同以外,其它的代碼都是相同的,那麼就能夠達到公用的目標 //用less的混合語法能夠改寫成以下形式 .less-mixins{ float:left; width:200px; height:200px; } .div1{ .less-mixins; background-color:green; } .div2{ .less-mixins; background-color:red; } //最終編譯後的css代碼 .less-mixins { float: left; width: 200px; height: 200px; } .div1 { float: left; width: 200px; height: 200px; background-color: green; } .div2 { float: left; width: 200px; height: 200px; background-color: red; }
混合的基本使用以下:
A、定義的混合爲.less-mixins,有沒有感受就行定義類同樣
B、引用定義的混合方式爲.less-mixins,即直接寫上類名便可
C、不用懷疑,你沒有看錯,編譯後的css代碼中還有混合.less-mixins(這部分代碼是多餘的,接下來的案例就是去除這部分無效代碼)
//2. 不帶輸出的混合 //less代碼改成以下: .less-mixins(){ float:left; width:200px; height:200px; } .div1{ .less-mixins; background-color:green; } .div2{ .less-mixins; background-color:red; } //最終編譯後的css代碼 .div1 { float: left; width: 200px; height: 200px; background-color: green; } .div2 { float: left; width: 200px; height: 200px; background-color: red; }
相對於上述案例,改變的只是在混合名稱後面加了一對小括號,再次編譯less文件就不會在生成的css文件中包含無效的混合定義
//3. 混合的參數用法 .less-mixins(@width,@height,@color){ float:left; width:@width; height:@height; background-color:@color; } .div1{ .less-mixins(200px,200px,yellow); } .div2{ .less-mixins(200px,300px,green); } //編譯後的css文件 .div1 { float: left; width: 200px; height: 200px; background-color: yellow; } .div2 { float: left; width: 200px; height: 300px; background-color: green; }
就像定義函數參數似的,上述(@width,@height,@color)就是定義的混合參數,在混合內部就可使用這些參數,調用混合傳參就像js語法中調用函數同樣
//4. 混合的參數添加默認值 .less-mixins(@width:100px,@height:100px,@color:red){ float:left; width:@width; height:@height; background-color:@color; } .div1{ .less-mixins(200px,200px,yellow); } .div2{ .less-mixins(); } //編譯後的css .div1 { float: left; width: 200px; height: 200px; background-color: yellow; } .div2 { float: left; width: 100px; height: 100px; background-color: red; }
混合的參數默認值添加,只須要在變量名稱後面加上:默認值便可。可是有木有發現問題,假設我調用的混合的時候只傳入一個參數怎麼辦?或者入參小於實參怎麼辦呢?
//5. 命名參數 .less-mixins(@width:100px,@height:100px,@color:red){ float:left; width:@width; height:@height; background-color:@color; } .div1{ .less-mixins(200px,200px,yellow); } .div2{ .less-mixins(@color:green); } //編譯後的css .div1 { float: left; width: 200px; height: 200px; background-color: yellow; } .div2 { float: left; width: 100px; height: 100px; background-color: green; }
上述咱們在調用混合的時候爲.less-mixins(@color:green),經過@color:來指定我要傳入的是哪一個參數。
//6.匹配模式 .less-mixins(L,@width:100px,@height:100px,@color:red){ float:left; width:@width; height:@height; background-color:@color; } .less-mixins(R,@width:100px,@height:100px,@color:red){ float:right; width:@width; height:@height; background-color:@color; } .div1{ .less-mixins(L,200px,200px,yellow); } .div2{ .less-mixins(R,@color:green); } //編譯後的css文件 .div1 { float: left; width: 200px; height: 200px; background-color: yellow; } .div2 { float: right; width: 100px; height: 100px; background-color: green; }
混合.less-mixins定義了兩次,這兩次的功能除了浮動的方向不一致以外其它都是相同的(固然這裏也能夠定義成兩個變量名),這種狀況要想區分調用哪次混合的定義,須要在調用混合的時候,指定第一個參數匹配字符串。