文章目錄
-
- 概覽
-
- 什麼是 CSS 預處理器?
- Less 簡介
- 變量
- 混合
- 嵌套規則
- 函數 & 運算
- less的安裝和使用
-
- 用戶端
-
- 用戶端使用
- 監視模式
- 服務端
-
- 服務端安裝
- 伺服器端Less的使用
- 文法
-
- 注釋
- 變量
-
- 基本使用
- 用變量名定義為變量
- 混合
-
- 基礎混合
- 帶參混合
- @arguments 變量
- 模式比對
-
- 簡單參數比對
- 導引
- 常見的檢測函式
- 更多檢測函式
- 邏輯運算
- 嵌套規則
- 運算
- Color 函數
概覽
什麼是 CSS 預處理器?
- 定義:CSS 預處理器定義了一種新的語言,其基本思想是,用一種專門的程式設計語言,為 CSS 增加了一些程式設計的特性,将 CSS 作為目标生成檔案,然後開發者就隻要使用這種語言進行編碼工作。
- Less 是CSS預處理器之一。
- 簡而言之:CSS 預處理器用一種專門的
,進行 Web 頁面樣式設計,然後再程式設計語言
成正常的 CSS 檔案,以供項目使用。CSS 預處理器為 CSS 增加一些程式設計的特性,無需考慮浏覽器的相容性問題,例如你可以在 CSS 中使用編譯
、變量
、簡單的邏輯程式
等等在程式設計語言中的一些基本特性,可以讓你的 CSS 更加簡潔、适應性更強、可讀性更佳,更易于代碼的維護等諸多好處。函數
- 常見的CSS預處理器語言:LESS、Sass(SCSS)、Stylus、Turbine、Swithch CSS、CSS Cacheer、DT CSS
Less 簡介
- LESS 賦予了 CSS 動态語言的特性,如
,變量
,繼承
,運算
。LESS 既可以在 用戶端 上運作 (支援IE 6+, Webkit, Firefox),也可以借助Node.js或者Rhino在服務端運作。函數
/* LESS */ @color: #4D926F; #header { color: @color; } h2 { color: @color; } /* 編譯為css */ #header { color: #4D926F; } h2 { color: #4D926F; }
變量
- 變量允許我們單獨定義一系列 通用 的樣式,然後在需要的時候去調用。是以在做 全局樣式 調整的時候我們可能隻需要修改幾行代碼就可以了。
/* 定義變量 bgcolor 設定值為 #4D926F */ @bgcolor: #4D926F; #header { background: @bgcolor; } /* 編譯為css */ #header { background: #4D926F; }
混合
- 混合可以将一個定義好的class A輕松的引入到另一個class B中,進而簡單實作class B
class A中的繼承
。我們還可以帶所有屬性
地調用,就像使用函數一樣。參數
.rounded-corners (@radius: 5px) { // 定義函數,并設定參數預設值 border-radius: @radius; -webkit-border-radius: @radius; -moz-border-radius: @radius; } #header { .rounded-corners; // 不傳參引用 } #footer { .rounded-corners(10px); // 傳參引用 } /* 編譯為css */ #header { border-radius: 5px; -webkit-border-radius: 5px; -moz-border-radius: 5px; } #footer { border-radius: 10px; -webkit-border-radius: 10px; -moz-border-radius: 10px; }
嵌套規則
- 我們可以在一個選擇器中
另一個選擇器來實作嵌套
,這樣很大程度減少了代碼量,并且代碼看起來更加的清晰。繼承
#header { h1 { font-size: 26px; font-weight: bold; } p { font-size: 12px; a { text-decoration: none; &:hover { border-width: 1px } } } } /* 編譯後 */ #header h1 { font-size: 26px; font-weight: bold; } #header p { font-size: 12px; } #header p a { text-decoration: none; } #header p a:hover { border-width: 1px; }
函數 & 運算
- LESS中的函數一一映射了
代碼,如果願意的話可以操作屬性值。JavaScript
- 運算提供了 加,減,乘,除 操作;我們可以做
的運算,這樣就可以實作屬性值之間的複雜關系。屬性值和顔色
@the-border: 1px; @base-color: #111; @red: #842210; #header { color: @base-color * 3; // 乘法運算 border-left: @the-border; border-right: @the-border * 2; } #footer { color: @base-color + #003300; // 加法運算 border-color: desaturate(@red, 10%); // 預定義顔色函數 } /* 編譯為css */ #header { color: #333; border-left: 1px; border-right: 2px; } #footer { color: #114411; border-color: #7d2717; }
less的安裝和使用
用戶端
用戶端使用
- 引入你的
樣式檔案的時候要設定.less
屬性值為rel
:stylesheet/less
<link rel="stylesheet/less" type="text/css" href="styles.less">
- 接着 下載下傳less.js,并在
标簽中引入<head>
,less.js
<script src="less.js" type="text/javascript"></script> <!-- 如果不想下載下傳就使用下面這種方式 --> <script src="//cdnjs.cloudflare.com/ajax/libs/less.js/2.5.3/less.min.js"></script>
- 注意: 你的less樣式檔案一定要在引入less.js前先引入。 備注:請在伺服器環境下使用!本地直接打開可能會報錯!
監視模式
- 監視模式是用戶端的一個功能,這個功能允許你當你改變樣式的時候,用戶端将自動重新整理。
- 要使用它,隻要在URL後面加上
,然後重新整理頁面就可以了。另外,你也可以通過在終端運作#!watch
來啟動監視模式。less.watch()
服務端
服務端安裝
- 最簡單的方式是通過 npm(node 的包管理器)
$ npm install less // 下載下傳最新穩定版本的 LESS, $ npm install [email protected]
的全稱是 Node Package Manager ,是一個 NodeJS包管理和分發工具,已經成為了非官方的釋出Node子產品(包)的标準。NPM
伺服器端Less的使用
- 隻要安裝了 less,就可以在Node中像這樣調用編譯器:
輸出:var less = require('less'); less.render('.class { width: 2 + 3 }', function (e, css) { console.log(css); });
.class { width: 5; }
- 也可以手動調用解析器和編譯器:
var parser = new(less.Parser); parser.parse('.class { width: 1 + 1 }', function (err, tree) { if (err) { return console.error(err) } console.log(tree.toCSS()); });
- 配置:向解析器傳遞參數
var parser = new(less.Parser)({ paths: ['.', './lib'], // 指定 @import 指令的搜尋路徑 filename: 'style.less' // 指定檔案名,以獲得更好的錯誤消息 }); parser.parse('.class { width: 2 + 3 }', function (e, tree) { tree.toCSS({ compress: true }); // 開啟CSS壓縮 });
-
在指令行下使用
在終端調用 LESS 解析器:
上面的指令會将編譯後的 CSS 傳遞給 stdout, 你可以将它儲存到一個檔案中:$ lessc styles.less
$ lessc styles.less > styles.css
文法
注釋
- CSS注釋:CSS 形式的注釋在 LESS 中是依然保留的。
/* 你好,這裡是Less中的一種注釋,保留CSS注釋形式 */ .class { color: black }
- less注釋:LESS 同樣也支援雙斜線的注釋, 但是編譯成 CSS 的時候自動過濾掉。
// 你好我是一個單行注釋, 在編譯成CSS檔案是我将被過濾掉 .class { color: white }
變量
基本使用
- LESS中也可以設定變量,然後通過變量可以改變整個網站的設計風格。良好的掌握LESS中變量的用法,是LESS的基礎。
- 使用方法:在“
”後添加變量名稱然後與變量值用冒号“@
”連結。:
@nice-blue: #5B83BE; @light-blue: @nice-blue + #111; #header { color: @light-blue; } /** 編譯為css之後 **/ #header { color: #6C94CF; }
用變量名定義為變量
- 示例:
@loen: "I am loen."; @var: 'loen'; content: @@var; /** 編譯為css之後 **/ content: "I am loen.";
- 解析:
中的@@var
編譯後變為@var
,此時less代碼變為loen
,而content: @loen
則被認為是另一個變量,其值為@loen
,是以最終的結果如上所示。I am loen.
注意: LESS 中的變量為完全的 ‘常量’ ,是以隻能定義一次。
混合
基礎混合
- 在 LESS 中我們可以定義一些 通用 的屬性集為一個class,然後在另一個class中去調用這些屬性。
.bordered { border-top: dotted 1px black; border-bottom: solid 2px black; }
- 如果我們現在需要在其他class中引入通用的屬性集,那麼我們隻需要在任何class中像下面這樣調用就可以了:
#menu a { color: #111; .bordered; //引用屬性集 } .post a { color: red; .bordered; //引用屬性集 } /** 編譯後的css **/ #menu a { color: #111; border-top: dotted 1px black; border-bottom: solid 2px black; } .post a { color: red; border-top: dotted 1px black; border-bottom: solid 2px black; }
任何 CSS
,class
或者id
屬性集都可以以同樣的方式引入.元素
帶參混合
- 在 LESS 中,還可以像函數一樣定義一個帶參數的屬性集合:
.border-radius (@radius) { border-radius: @radius; -moz-border-radius: @radius; -webkit-border-radius: @radius; }
- 調用:
#header { .border-radius(4px); } .button { .border-radius(6px); } /** 編譯為css **/ #header { border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px; }
- 參數數設定預設值
.border-radius (@radius: 5px) { border-radius: @radius; -moz-border-radius: @radius; -webkit-border-radius: @radius; }
- 調用:
#header { .border-radius; } /** 編譯為css **/ #header { border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px; }
@arguments 變量
- 如果屬性集合需要傳進來的參數比較多, 你又不想單獨處理每一個參數的話,可以使用
.@arguments
包含了所有傳遞進來的參數。類似于javascript中函數的預設參數@arguments
。argument[]
.box-shadow (@x: 0, @y: 0, @blur: 1px, @color: #000) { box-shadow: @arguments; -moz-box-shadow: @arguments; -webkit-box-shadow: @arguments; } #leftbox { .box-shadow(2px, 5px); } /** 編譯為css後 **/ #leftbox { box-shadow: 2px 5px 1px #000; -moz-box-shadow: 2px 5px 1px #000; -webkit-box-shadow: 2px 5px 1px #000; }
@arguments 儲存了所有參數通過
隔開的字元串空格
模式比對
簡單參數比對
- 有些情況下,我們想根據傳入的參數來改變混合的預設呈現:
原理:.mixin就得到傳入的是.mixin (dark, @color) { color: darken(@color, 10%); // darken 是Less自帶的函數用以計算顔色的深色 } .mixin (light, @color) { color: lighten(@color, 10%); // lighten 計算顔色的淺色 } .mixin (@_, @color) {// @_ 接受任意值 display: block; } @switch: light; .class { .mixin(@switch, #888); } /** 編譯為css後 **/ .class { color: #a2a2a2; display: block; }
,第一個混合定義并未被比對,因為它隻接受light
做為首參。第二個混合定義被成功比對,因為它隻接受dark
。第三個混合定義被成功比對,因為它接受任意值,隻有被比對的混合才會被使用。變量可以比對任意的傳入值,而變量以外的固定值就僅僅比對與其相等的傳入值。light
當然傳參也不限定于一個,可以多個不定的參數。
導引
- 當我們想根據 表達式 進行比對,而非根據 值和參數 比對時,導引就顯得非常有用。
在 c,php 等程式設計語言中,條件判斷一般使用
實作 Less 為了盡可能地保留CSS的if/else
,通過導引混合而非if/els e語句來實作條件判斷,因為Less已在 @media query特性中被定義。可聲明性
//when關鍵字用以定義一個導引序列 .mixin (@a) when (lightness(@a) >= 50%) { background-color: black; } .mixin (@a) when (lightness(@a) < 50%) { background-color: white; } .mixin (@a) { color: @a; } .class1 { .mixin(#ddd) } .class2 { .mixin(#555) } /** 編譯為css後 **/ .class1 { background-color: black; color: #ddd; } .class2 { background-color: white; color: #555; }
- 導引中可用的全部比較運算有:
。此外,關鍵字> >= = =< <
隻表示布爾真值,下面兩個混合是相同的:true
.truth (@a) when (@a) { ... } .truth (@a) when (@a = true) { ... } //除去關鍵字true以外的值都被視示布爾假: .class { .truth(40); // 将不比對以上定義 }
- 導引序列使用逗号
分割,隻要有一個符合條件就會執行,
- 導引可以無參數,也可以對參數進行比較運算:
@media: mobile; .mixin (@a) when (@media = mobile) { ... } .mixin (@a) when (@media = desktop) { ... } .max (@a, @b) when (@a > @b) { width: @a } .max (@a, @b) when (@a < @b) { width: @b }
- 最後,如果想基于
進行比對,可以使用值的類型
函式:is*
.mixin (@a, @b: 0) when (isnumber(@b)) { ... } .mixin (@a, @b: black) when (iscolor(@b)) { ... }
常見的檢測函式
-
iscolor isnumber isstring iskeyword isurl
- 示例:
.mixin (@a, @b: 0) when (isnumber(@b)) { width: @a px; height: @b px; } .mixin (@a, @b: black) when (iscolor(@b)) { color: @a; background-color: @b; } // 調用 .nav { .mixin(100,100); } .banner { .mixin(#333,#efefef); } /** 編譯為css後 **/ .nav { width: 100 px; height: 100 px; } .banner { color: #333; background-color: #efefef; }
更多檢測函式
-
ispixel ispercentage isem
- 示例:
.mixin (@a, @b: 0) when (ispixel(@b)) { width: @a; height: @b; } .mixin (@a, @b: 50%) when (ispercentage(@b)) { max-width: @a; max-height: @b; } // 使用 .nav { .mixin(100px,100px); } .banner { .mixin(80%,60%); } /** 編譯為css後 **/ .nav { width: 100px; height: 100px; } .banner { max-width: 80%; max-height: 60%; }
邏輯運算
-
運算符 ,相當于and
運算與
,必須條件全部為 true才會執行&&
.mixin (@a) when (isnumber(@a)) and (@a > 0) { z-index: @a; } .leftbox { .mixin(12); } /** 編譯為css後 **/ .leftbox { z-index: 12; }
-
逗号分隔符:相當于,
運算或
,隻要有一個條件為true 就會執行||
.font(@size:20px) when (@size>50px) , (@size<100px){ font-size: @size; } .desc{ .font(6px); } /** 編譯為css後 **/ .desc{ font-size:6px; }
-
運算符,相當于not
運算非
,進行取反操作, 是以當條件為false, 就會執行!
.mixin (@b) when not (@b > 0) { left: @b; } .gameball { .mixin(-15); } /** 編譯為css後 **/ .gameball { left: -15; }
嵌套規則
- 使用嵌套規則可以使樣式代碼看起來更具有層次感。
/** css代碼 **/ #header { color: black; } #header .navigation { font-size: 12px; } #header .logo { width: 300px; } #header .logo:hover { text-decoration: none; } // less #header { color: black; .navigation { font-size: 12px; } .logo { width: 300px; &:hover { text-decoration: none } } }
- &:如果寫 串聯選擇器 ,而不是寫後代選擇器,就可以用到&了。這點對僞類尤其有用如
和:hover
。:focus
.bordered { &.float { float: left; } .top { margin: 5px; } } /** 編譯為css**/ .bordered.float { float: left; } .bordered .top { margin: 5px; }
運算
- 任何數字、顔色和變量都可以進行運算。
@base: 5%; @filler: @base * 2; @other: @base + @filler; color: #888 / 4; background-color: @base-color + #111; height: 100% / 2 + @filler;
- LESS 的運算已經超出了我們的期望,它能夠分辨出顔色和機關。括号也同樣允許使用。并且可以在複合屬性中進行運算。
@var: 1px + 5; /* 6px */ width: (@var + 5) * 2; /* width:22px; */ border: (@width * 2) solid black; /* border: 44px solid black; */
Color 函數
- LESS 提供了一系列的顔色運算函數. 顔色會先被轉化成 HSL 色彩空間, 然後在通道級别操作:
lighten(@color, 10%); // 傳回比 @color 亮 10%的顔色 darken(@color, 10%); // 傳回比 @color 暗 10%的顔色 saturate(@color, 10%); // 飽和度增加 10% desaturate(@color, 10%); // 飽和度減少 10% fadein(@color, 10%); //透明度減少 10% fadeout(@color, 10%); // 透明度增加 10% fade(@color, 50%); // 設定透明度 50% spin(@color, 10); // 傳回顔色比@color大10度的顔色 spin(@color, -10); // 傳回比@color小10度的顔色 mix(@color1, @color2); // 傳回 @color1 和 @color2 的混合
- 在一種顔色的通道上建立另一種顔色:
hue(@color); // 傳回@color的 hue 頻道 saturation(@color); // 傳回@color的 飽和度 通道 lightness(@color); // 傳回@color的 亮度 通道 @new: hsl(hue(@old), 45%, 90%);
注:未完待續。