極簡(jiǎn)Less筆記

CSS預(yù)處理器

作為一只有點(diǎn)追求的程序猿魔眨,你有木有經(jīng)常在使用CSS定義樣式的時(shí)候產(chǎn)生這樣的想法——我能不能像寫JS代碼一樣去組織CSS的代碼,很遺憾的是純CSS沒(méi)法提供這樣的編程式的開(kāi)發(fā)流程給你使用硝训,它更像是給設(shè)計(jì)獅進(jìn)行頁(yè)面的簡(jiǎn)單維護(hù)而生的;

基于這樣的需求,于是CSS預(yù)處理器就應(yīng)運(yùn)而生送朱。如同源代碼需要通過(guò)通過(guò)編譯才能變成二進(jìn)制文件而后被計(jì)算機(jī)執(zhí)行搞坝,CSS預(yù)處理器扮演的角色就是對(duì)CSS進(jìn)行“預(yù)先編程”搔谴,然后編譯成CSS文件;

給CSS預(yù)處理器下一個(gè)定義就是:CSS預(yù)處理器是一門編程語(yǔ)言桩撮,能夠?qū)?yè)面樣式進(jìn)行設(shè)計(jì)然后再編譯成CSS文件敦第;

試想一下,你的CSS文件可以以編程的形式表現(xiàn)店量,必然使得設(shè)計(jì)樣式的代碼如同JS般代碼更加具有:

  • 開(kāi)發(fā)友好芜果;
  • 組織性;
  • 簡(jiǎn)潔性融师;
  • 可維護(hù)性右钾;
  • 可讀性;

目前常見(jiàn)的CSS預(yù)處理器包括:

  • Sass(Scss)
  • Less
  • Stylus

本文主要以Less為例去分享一下CSS預(yù)處理的語(yǔ)法和實(shí)例旱爆;

配置Less

  • 服務(wù)器端配置
# 安裝
$ npm install -g less
# 編譯
$ lessc style.less > style.css
# 壓縮
$ lessc style.less -x > style.css

# 作為模塊引用
var less = require('less');
less.render('./style.less',function(error,css){console.log(css)});

# 利用自動(dòng)化構(gòu)建工具舀射,如gulp配置less;
$ npm install gulp -g
$ npm install gulp-less -S

//main.js
var gulp = require('gulp');
var less = require('gulp-less');

gulp.task('less',function(){
    return gulp.src('./src/style.less')
                      .pipe(less())
                      .pipe(gulp.dest('../dist/css'))
})

$ gulp less;
  • 客戶端配置
//先將less文件引入<head>
<link rel="stylesheet/less" type="text/css" href="styles.less" />
//再將less.js引入<head>
<script src="less.js" type="text/javascript"></script>

可通過(guò)以下配置信息實(shí)時(shí)監(jiān)測(cè)編譯后的文件效果;

<script>less = { env: 'development'};</script><script src="less.js"></script><script>less.watch();</script>

Less的語(yǔ)言特性

1.變量

Less可以定義變量,怀伦,這個(gè)特性的好處是如果特定的屬性值在經(jīng)常用到可以不用重新賦值脆烟;通過(guò)變量進(jìn)行運(yùn)算更加符合編程思想;

//定義變量
@variable: value;
//引用
@variable | @{variable}
//簡(jiǎn)單引用
@bg-color: #000;
body{
    background: @bg-color + #ccc;
    #header{
    background: darken(@bg-color,10%);
  }    
}
注意房待,當(dāng)變量作為rule屬性邢羔、rule屬性部件、選擇器吴攒、選擇器部件和字符串拼接時(shí)张抄,必須使用@{variable}
//rule屬性
@bgc : background-color
.header{
    @{bgc} : #ccc;
}
//rule屬性部件
@color:color
.header{
    background-@{color} :#ccc;
}
//選擇器
@rule: .rule
@{rule}{
      color: red;
}
//選擇器部件
.header-@{rule}{
    color: red;
}
//字符串拼接
@hello: 'hello';
@world: world;
.hi {
    content: '@{hello}@{world}';
}

//less變量支持列表類型數(shù)據(jù),通過(guò)extract(variable , index)獲取指定下標(biāo)的值洼怔,通過(guò)length(variable)獲取列表類型變量的元素個(gè)數(shù)署惯;
@colors : #fff, #ccc, #000;
.header{
      color: extract(@colors,0);
      font-size: 12px*length(@colors);
}
```



#####2.嵌套

Less的嵌套特性能夠**減少CSS代碼的冗余**镣隶;

```
.box{
  >.item-1{
    color:darken(#fff,5%);
  }
  .item-2{
    color:darken(#fff,20%);
  }
  + .item-3{
    color:darken(#fff,40%)
  }
}

```

```
//嵌套過(guò)程极谊,如果需要重新返回上一級(jí)的父選擇器诡右,可以使用&;
.border{
    border:1px solid #fff;
}

.parent{
    .children{.border;}
    &:hover{
        color:red;
    }
}
```


#####3. 混合

Less的混合特性能夠在另個(gè)一類的規(guī)則集中引用定義好的規(guī)則集轻猖,從而實(shí)現(xiàn)**代碼的復(fù)用性**帆吻;
```
.font-rule{
  font-size: 30px;
  text-align: center;
  color:#fff;
  line-height: 50px;
}

.item{
     height: 50px;
    background: lighten(@bg-color,40%);
    .font-rule
}
```

mixin本質(zhì)上相當(dāng)于**函數(shù)**;

```
.change-bg-color(@color){
  background: @color;
}

.box{
  .item-1{
    color:darken(#fff,5%);
  }
  .item-2{
    color:darken(#fff,20%);
  }
  .item-3{
    color:darken(#fff,40%);
    .change-bg-color(pink)
  }
}
```

```
//minxin內(nèi)置兩個(gè)對(duì)象@arguments和@reset咙边,@arguments代表mixin的所有入?yún)?而@reset代表mixin的入?yún)?shù)組猜煮;

.rule (@width,@height,@color,@font-size){
  width: @width;
  height: @height;
  color:@color;
  font-size:@font-size;
  background: #aaa;
}

.border(@width,@style,@color){
  border:@arguments;
}

.box{
  .border(1px,solid,black);
  .rule(100px,100px,#fff,20px);
}
```

**Less中的"條件語(yǔ)句"**

```
@true:true;
@false:false;
.box when(@true){
  &::after{
    display:block;
    content:'hi';
    color:#000;
  }
}
.box when (@true) or (@false){
  &:hover{
   background: #fff;
  }
} 
//可結(jié)合以下運(yùn)算符和內(nèi)置函數(shù)一起使用
// =,>,>=,<=,< 關(guān)系運(yùn)算符
// and、not败许、or(使用,號(hào)表示) 邏輯運(yùn)算符
/* 類型判斷函數(shù) * iscolor * isnumber * isstring * iskeyword * isurl */
/* 單位判斷函數(shù) * ispixel * ispercentage * isem * isunit */
```

**Less中的“循環(huán)語(yǔ)句”**

```
.container(@i,@n) when ((@i) =< @n){
  .item-@{i}{
    height: 100px;
    background: #000;
  }
  .container(@i+1)
}
.container(1,4);
```


---

Less中存在內(nèi)置函數(shù)可供調(diào)用王带,這里重點(diǎn)提以下default();

> default():作用相當(dāng)于條件語(yǔ)句的else

```
.container(@i) when('.item-@{i}' = '.item-1'){
    width: 100px;
    height: 100px;
    background: #aaa;
  

.container(@i) when('.item-@{i}' = '.item-2'){
     width: 100px;
    height: 100px;
    background: pink;
  }

.container() when(default()){
     width: 100px;
    height: 100px;
    background: blue;
  } 
div{.container();}
```

#####4.@import

> @import引入外部less文件;

less的@import提供6個(gè)配置選項(xiàng)(reference、inline市殷、less愕撰、css、once醋寝、multiple)來(lái)改變引入文件的特性搞挣;

- @import (reference) 'path':less文件作為樣式庫(kù)供extend和minxin引用;

- @import (inline) 'path' :用于引入與less不兼容的css文件音羞,通過(guò)inline配置告知編譯器不對(duì)引入的文件進(jìn)行編譯處理囱桨,直接輸出到最終輸出;*注意:引入的文件和當(dāng)前文件會(huì)被編譯為一個(gè)樣式樣式*

- @import (less) 'path':引入less文件;

- @import (css) 'path' : 引入css文件黄选,但*當(dāng)前文件會(huì)輸出一個(gè)樣式文件蝇摸,而被引入的文件自身為一個(gè)獨(dú)立的樣式文件*

- @import (once) 'path':對(duì)同一資源僅引入一次;

- @import (multiple) 'path' : 對(duì)同一資源引入多次办陷;

#####5.繼承extend()

- 兩種繼承方式

```
.bgc{
    background:red;
}

.header:extend(.bgc){
    color:white;
}

.footer{
    &:extend(.bgc)
}
```

使用less的繼承方法時(shí)要注意一下幾點(diǎn):
** 父選擇器不支持變量形式**
```
@p1: .parent1;
@p2: .parent2;.
parent1{  
  height: 100px;
}
@{p2}{  
  height: 200px;
}
// 匹配失敗
// 形式1貌夕,不支持以變量作入?yún)?.son1:extend(@{p1}){}
// 形式2,不支持以變量作為選擇器的規(guī)則集合
.son1:extend(.parent2){} 
// 匹配成功
.son2:extend(.parent1){}

```

**media query影響繼承的作用域**

```
// 非media query內(nèi)的extend操作民镜,將會(huì)繼承所有media query中匹配的選擇器樣式
@media screen{
  .parent{
     height: 100px;
   }
   @media (min-width: 1023px){
     .parent{
         width: 200px;
       }
   }
}
.son:extend(.parent){}
//等價(jià)于
@media screen {
  .parent,
  .son {
    height: 100px;
  }
}
@media screen and (min-width: 1023px) {
  .parent,
  .son {
    width: 200px;
  }
}
```

```
//media query內(nèi)的extend操作啡专,僅能繼承當(dāng)前塊的其他選擇器樣式;

.parent1{
  height: 200px;
}
@media screen{
  .parent1{
    height: 100px;
  }    
   // 無(wú)法繼承子media query塊的選擇器樣式
   .son1:extend(.parent2){}
   @media (min-width: 1023px){
     // 繼承父media query塊的選擇器樣式
      .son2:extend(.parent1){}
      .parent2{
        width: 200px;
      }
   }
}  
```

---
參考資料:
- [Less文檔](http://lesscss.cn/)
- [前端構(gòu)建:Less入了個(gè)門](http://www.cnblogs.com/fsjohnhuang/p/4187675.html)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市制圈,隨后出現(xiàn)的幾起案子们童,更是在濱河造成了極大的恐慌,老刑警劉巖鲸鹦,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慧库,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡馋嗜,警方通過(guò)查閱死者的電腦和手機(jī)齐板,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人甘磨,你說(shuō)我怎么就攤上這事橡羞。” “怎么了济舆?”我有些...
    開(kāi)封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵卿泽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我滋觉,道長(zhǎng)签夭,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任椎侠,我火速辦了婚禮覆致,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肺蔚。我一直安慰自己,他們只是感情好儡羔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布宣羊。 她就那樣靜靜地躺著,像睡著了一般汰蜘。 火紅的嫁衣襯著肌膚如雪仇冯。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天族操,我揣著相機(jī)與錄音苛坚,去河邊找鬼。 笑死色难,一個(gè)胖子當(dāng)著我的面吹牛泼舱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播枷莉,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼娇昙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了笤妙?” 一聲冷哼從身側(cè)響起冒掌,我...
    開(kāi)封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蹲盘,沒(méi)想到半個(gè)月后股毫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡召衔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年铃诬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氧急,死狀恐怖颗胡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吩坝,我是刑警寧澤毒姨,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站钉寝,受9級(jí)特大地震影響弧呐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嵌纲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一俘枫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逮走,春花似錦鸠蚪、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至墓臭,卻和暖如春蘸鲸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窿锉。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工酌摇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嗡载。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓窑多,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親洼滚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子怯伊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)判沟,斷路器耿芹,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,116評(píng)論 25 707
  • 表妹和舅舅、舅母長(zhǎng)得一點(diǎn)也不像挪哄。 六年級(jí)畢業(yè)那年夏天吧秕,我和堂姐回到老家。去外婆家拜訪的時(shí)候迹炼,見(jiàn)到了我久別的表妹砸彬。堂...
    北灼閱讀 389評(píng)論 4 1
  • 我是個(gè)有福氣的人颠毙,你也應(yīng)該這樣想。 我總是鼓勵(lì)別人這么想:我是個(gè)有福氣的人砂碉。對(duì)蛀蜜,想想看,你遇到的好運(yùn)氣增蹭,人就應(yīng)該這...
    K歪閱讀 410評(píng)論 0 0
  • 這一段中滴某,書里講了關(guān)于《最強(qiáng)大腦》的許多幕后故事,及李威參加《最強(qiáng)大腦》的各類項(xiàng)目滋迈,如辨變臉霎奢、碎顏修復(fù)、...
    文魁大腦俱樂(lè)部潘若琨閱讀 337評(píng)論 0 0