LESS語言特性總結(jié)

2.1變量

2.1.1 變量語法

使用@來定義變量性芬,變量名自定義闹伪。

@color: #00f;

此時定義了一個變量color其值為十六進制顏色值

使用變量的時候需要加上@滞谢,表示取出color變量的值省古。

使用變量:

h1 {
    color: @color;
}
2.1.2 變量的作用域

可以定義多個變量,但是當多個變量同名的時候,應(yīng)該使用哪個變量的值呢合是?less和其他語言類似了罪,采用就近原則,也即如果當前作用域下有該變量則使用該變量的值聪全,否則逐層作用域向上查找泊藕,直到查找失敗,解析錯誤难礼,如果配置了File Wather控制臺會報錯娃圆,并指向出錯的less文件位置:

less_16.png

比如:

@color:#00f;

div {
  @color: #f00;
  color: @color;
}
less_17.png

此時可以看到,color使用的是最近一級的@color變量的值

特別的是蛾茉,查看以下代碼:

@color:#00f;

div {
  @color: #f00;
  .my {
    @color: #ff0;
    background-color: @color;
    @color: #0f0;
  }
}

如果同一作用域下讼呢,使用該變量的位置比變量定義位置靠前,那么該使用哪個變量的值呢谦炬?由于less對變量的處理是先對變量統(tǒng)一處理悦屏,也即按照變量順序進行處理之后,再對使用其的地方進行賦值操作键思,因此會使用最后一次定義變量的地方础爬。

也即結(jié)果為:

less_18.png
2.1.3 字符串插值

類似于es6的模板字符串一樣,可以在字符串中使用變量吼鳞。

語法:

@variable: "xxx";
將變量放入到{}中 
@{variable}

使用:

@url: "/images/";
div {
  width: 200px;
  height: 200px;
  background-image: url("@{url}1.jpg"); // 結(jié)果為/images/1.jpg
}
2.1.4 選擇器插值

類似于字符串插值一樣看蚜,將變量放入到{}中。不同的是赔桌,選擇器插值則是作為對選擇器的定義

使用:

@mydiv: div;

@{mydiv} {
  width: 200px;
  height: 200px;
}

編譯之后:
div {
    width: 200px;
    height: 200px;
}
2.1.5 媒體查詢定義變量的方式

由于“~”后面的值是不被編譯的供炎,所以可以用作媒體查詢的參數(shù)。

使用:

@mediaQuery: ~"(max-width: 600px)";

@media screen and @mediaQuery {
  div {
    width: 200px;
    height: 200px;
    background-color: #898900;
  }
}
2.1.6 變量之間相互使用
  • 不加@

    如果一個變量直接引用一個變量疾党,而不加@音诫,則使用該變量的值的時候,需要加上兩個@

    @color: #00f;
    @mycolor: color;
    
    div {
      color: @@mycolor;
    }
    

    類似于先取出color雪位,然后再對color變量進行值得提取

  • 加上@

    如果引用得變量加上了@纽竣,表明直接使用得是值,此時和使用普通變量得用法一致

    @color: #00f;
    @mycolor: @color;
    
    div {
      color: @mycolor;
    }
    

2.2 混合

2.2.1 繼承屬性

可以在一個選擇器內(nèi)部引用已經(jīng)定義好的類樣式和ID選擇器樣式(只能是這兩個選擇器樣式)茧泪,那么這個選擇器就可以直接使用引用的選擇器樣式屬性

使用:

.div {
  width: 200px;
  height: 200px;
}

span {
  .div;
}

// 編譯之后的結(jié)果:
.div {
  width: 200px;
  height: 200px;
}

span {
  width: 200px;
  height: 200px;
}

可以看到引用的樣式也同樣出現(xiàn)在編譯之后的文件中

2.2.2 帶參數(shù)混合

帶參數(shù)混合就類似函數(shù)一樣的性質(zhì)。

以上繼承屬性的方式是直接使用繼承之后的屬性聋袋,除此之外队伟,還可以傳入?yún)?shù)給繼承的類/ID樣式,便于動態(tài)引用幽勒,同時便于擴展

使用:

.div(@width) {
  width: @width;
  height: @width;
}

span {
  .div(20px);// 傳參過去嗜侮,類似于函數(shù)
}

// 編譯之后的結(jié)果
span {
  width: 20px;
  height: 20px;
}

可以看到引用的樣式不會出現(xiàn)在編譯之后的文件中

注意:如果繼承的樣式需要參數(shù),則必須傳參過去,否則會出錯锈颗。

除了傳遞一個參數(shù)過去以外顷霹,還可以傳遞多個參數(shù),多個參數(shù)之間使用分號;分隔击吱。

.div(@width;@height) {
  width: @width;
  height: @height;
}

如果存在選擇器一樣淋淀,參數(shù)個數(shù)不一致的情況,會出現(xiàn)什么情況呢覆醇?

CSS是順序編譯朵纷,當找到第一個滿足要求的選擇器,則進行匹配

比如:

.div(@width) {
  width: @width;
  height: @width;
}

.div(@width;@height) {
  width: @width;
  height: @height;
}

span {
  .div(200px);
}
// 編譯之后的結(jié)果為:
span {
  width: 200px;
  height: 200px;
}

由于第一個匹配成功永脓,則繼承第一個樣式袍辞。

但是如果參數(shù)個數(shù)一致,選擇器名稱也一致呢常摧?

只要滿足要求搅吁,就進行匹配,并繼承

比如:

.div(@width) {
  width: @width;
}

.div(@height) {
  height: @height;
}

span {
  .div(200px);
}

// 編譯之后的結(jié)果為:
span {
  width: 200px;
  height: 200px;
}

由于以上兩個都匹配落午,所以都會繼承

2.2.3 隱藏屬性繼承

直接繼承屬性谎懦,繼承的父樣式同樣也會出現(xiàn)在編譯之后的結(jié)果中,而帶參數(shù)混合的方式繼承板甘,繼承的父樣式不會出現(xiàn)在編譯之后的結(jié)果中党瓮。

有時,只是為了使用繼承的公共的樣式盐类,而在html頁面中不會單獨使用公共樣式寞奸,所以不想讓公共樣式出現(xiàn)在編譯之后的結(jié)果中。

所以結(jié)合上面兩種寫法在跳,可以使用隱藏屬性繼承的方式枪萄,既繼承了公共樣式,又不讓其出現(xiàn)在編譯之后的結(jié)果中猫妙。

使用:

.div() {
  width: 200px;
  height: 200px;
}

span {
  .div();
}


// 編譯之后的結(jié)果 只包含span選擇器樣式
span {
  width: 200px;
  height: 200px;
}

注意:()不能省略

2.2.4 默認值混合

可以給參數(shù)設(shè)置默認值瓷翻,這樣可以使用默認值且不用傳參的情況下繼承樣式

使用:

.div(@width: 100px) {
  width: @width;
  height: @width;
}

span {
  .div; // 也可以是.div();
}
2.2.5 @arguments參數(shù)

類似于js中函數(shù)中內(nèi)置對象arguments一樣,可以獲取傳遞的全部參數(shù)值割坠,less中@arguments也可以獲取全部的參數(shù)值齐帚,但也僅限于獲取參數(shù)值,不能做其他操作彼哼。但是有時不想對單個參數(shù)進行操作对妄,只用全部的參數(shù)值的時候還是很有用的。

使用:

.transition(@property: all;@duration: 4s;@delayTime: 2s;@TimingFuction: ease) {
  -moz-transition: @arguments;
  -webkit-transition: @arguments;
  -o-transition: @arguments;
  transition: @arguments;
}

span {
  .transition();
}

// 編譯之后的結(jié)果
span {
  -moz-transition: all 4s 2s ease;
  -webkit-transition: all 4s 2s ease;
  -o-transition: all 4s 2s ease;
  transition: all 4s 2s ease;
}
2.2.6 !important

如果給一個一個屬性添加!important會很麻煩敢朱,此時可以在引用父級樣式的時候加上!important剪菱,引用的父級樣式中所有屬性都會加上!important屬性摩瞎。

使用:

.div(@width;@height) {
  width: @width;
  height: @height;
}

span {
  .div(100px,100px)!important;
}

// 編譯之后的結(jié)果
span {
  width: 100px !important;
  height: 100px !important;
}
2.2.7 擴展運算符...

可以使用擴展運算符...來不指明有多少個參數(shù),而參數(shù)的獲取通過@arguments參數(shù)來獲取孝常。

使用:

.div(...) {
  width: @arguments;
}

span {
  .div(100px);
}

// 編譯之后的結(jié)果為
span {
  width: 100px;
}
2.2.8 模式匹配

只有滿足匹配要求的混合才會被使用旗们。混合中的變量可以匹配任何值构灸,非變量形式的值只有與傳入的值完全相等時才可以匹配成功。

使用:

.border(soild,@size) {
  border: @size;
}

.div(@height) {
  height: @height;
}

span {
  .border(soild,2px);
}

只有傳入的值是solid才能與.border類匹配成功,否則匹配不成功。

所以非變量形式的值也即不加@的值,此值只是用于進行繼承限定的,不用于傳參使用。

2.2.9 條件混合
  • when

    只有當when中的條件滿足的時候,才會應(yīng)用該樣式

    // 當@a的值大于400px的時候,才能使用改樣式,等效于when(true)的時候才可以
    .minin(@a) when (@a > 400px) {
      width: @a;
    }
    
    #header {
      .minin(500px);// 滿足要求
    }
    
    // 編譯之后的結(jié)果為:
    #header {
      width: 500px; // 成功引入
    }
    

    而如果不滿足:

    .minin(@a) when (@a > 400px) {
      width: @a;
    }
    
    #header {
      .minin(200px);
    }
    // 編譯之后的結(jié)果:
    由于不滿足條件幽邓,所以沒有成功引入,也即沒有樣式
    

    如果變量的值為false/true,變量可以單獨寫在when括號中。

    .minin(@b) when (@b) {
      width:200px;
    }
    
    #header {
      .minin(false);
    }
    
  • 多個條件

    多個條件使用,進行分隔漾脂,且每個條件單獨寫在一個括號內(nèi)坦冠。只要有一個條件滿足,則這個選擇器被選中佛玄。類似于運算。

    .minin(@a,@b) when (@b),(@a<= 200px) {
      width: @a;
    }
    
    #header {
      .minin(200px,false);
    }
    
    // 編譯之后的結(jié)果為:
    #header {
      width: 200px;
    }
    
  • and

    多個條件都滿足時才被選中

    .minin(@a,@b) when (@b)and(@a<= 200px) {
      width: @a;
    }
    
    #header {
      .minin(200px,false);// 沒有被選中奥吩,沒有樣式輸出
    }
    
  • not

    當條件不滿足的時候被選中哼蛆,取反操作

    .minin(@b) when not(@b) {
      width: 200px;
    }
    
    #header {
      .minin(false);
    }
    
    // 編譯之后的結(jié)果為:
    #header {
      width: 200px;
    }
    

    not只作用于一個條件,不能作用于多個條件

    .minin(@a,@b) when not(@b)and(@a> 200px) {
      width: @a;
    }
    
    #header {
      .minin(200px,false);
    }
    
    // 由于not只作用于(@b)條件霞赫,而(@a > 200px)不滿足條件腮介,所以沒有樣式輸出
    

2.3 嵌套語法

Less提供了使用嵌套代替層疊或與層疊結(jié)合使用的能力。使用Less書寫可以模仿HTML的組織結(jié)構(gòu)

假設(shè)有以下html結(jié)構(gòu)

<main>
    <section>
        <div></div>
    </section>
</main>

編寫類似于html結(jié)構(gòu)的less文件端衰,一層一層嵌套類似于使用結(jié)構(gòu)選擇器對元素逐層查找一樣叠洗,和后代選擇器效果一致甘改。且內(nèi)層嵌套會繼承外層選擇器屬性。

main {
  width: 200px;
  height: 200px;
  section {
    width: 100%;
    height: 50%;
    div {
      width: 50%;
      height: 50%;
      background-color: #0ff;
    }
  }
}

編譯之后的css文件為:

main {
  width: 200px;
  height: 200px;
}
main section {
  width: 100%;
  height: 50%;
}
main section div {
  width: 50%;
  height: 50%;
  background-color: #0ff;
}
2.3.1 &的用法

&表示對父選擇器的引用灭抑,一般用在偽類選擇器上十艾。

在一個內(nèi)層選擇器的前面,如果沒有 & 符號腾节,則這個內(nèi)層選擇器會被解析為父選擇器的后代忘嫉。如果內(nèi)層選擇器前面有一個 & 符號,則內(nèi)層選擇器會被解析為父選擇器自身或父選擇器的偽類案腺。

有以下html代碼:

<main>
</main>

需要選中當鼠標懸浮時的樣式庆冕,也即main:hover

如果是以下寫法:

main {
  width: 200px;
  height: 200px;
  main:hover {
    background: #000;
  }
}

因為嵌套方式是選擇后代元素劈榨,所以編譯之后的結(jié)果是:

main {
  width: 200px;
  height: 200px;
}
main main:hover {
  background: #000;
}

顯然不是我們想要的結(jié)果访递,我們并不想要作為后代選擇器的方式出現(xiàn),而是兄弟選擇器的方式并排出現(xiàn)鞋既,所以此時可以使用&

main {
  width: 200px;
  height: 200px;
  &:hover {
    background: #000;
  }
}

以上代碼的解析過程是:當解析到&的時候力九,&會被選擇器替換替換,且與父選擇器出現(xiàn)在同一層邑闺,也即:

main {
  width: 200px;
  height: 200px;
}
main:hover {
  background: #000;
}

應(yīng)用:

2.3.1.1 重復(fù)引用父選擇器
.my {
  width: 200px;
  height: 200px;
  &-one {
    background-color: #f00;
  }
  &-two {
    background-color: #00f;
  }
  &-three {
    background-color: #ff0;
  }
}

編譯之后的結(jié)果為:

.my {
  width: 200px;
  height: 200px;
}
.my-one {
  background-color: #f00;
}
.my-two {
  background-color: #00f;
}
.my-three {
  background-color: #ff0;
}
2.3.1.2 更改選擇器的順序

有些時候可能需要將內(nèi)層選擇器放在父選擇器之前跌前,此時我們可以將 & 放在當前選擇器后面來完成。

.my {
  width: 200px;
  height: 200px;
  main & {
    background-color: #00f;
  }
}

編譯之后的結(jié)果為:

.my {
  width: 200px;
  height: 200px;
}
main .my {
  background-color: #00f;
}

2.4 命名空間

出于組織結(jié)構(gòu)或僅僅是為了提供一些封裝的目的陡舅,可以對混合進行分組抵乓。對一些沖突的變量規(guī)范于不同的命名空間中,同時也便于多次重復(fù)使用與擴展靶衍。

定義一個命名空間灾炭,可以使用任何的類/ID選擇器,作為命名空間颅眶,此時命名空間的性質(zhì)類似于函數(shù)蜈出。

.my() {
}

這里定義了一個命名空間.my,加上()涛酗,使其在編譯之后的文件中不輸出铡原。

接著便可以在這個命名空間中書寫混合。

.my() {
    
  .a {
    width: 20px;
    height: 20px;
    .b {
      width: 200px;
      height: 200px;
    }
    &:hover {
      background-color: #0ff;
    }
  }
    
}

使用命名空間中的混合商叹。類似于后代選擇器一樣選擇指定的選擇器進行使用燕刻。

這里使用>表用來選擇

.header {
    .my>.a;
}
// 結(jié)果為:
.header {
  width: 20px;
  height: 20px;
}
.header .b {
  width: 200px;
  height: 200px;
}
.header:hover {
  background-color: #0ff;
}

以上代碼的意思表示:選擇命名空間中的.a選擇器作為我要引入的樣式,所以.a樣式被全部引入到.header選擇器中剖笙,感覺就好像.header替代了.a一樣卵洗。

如果再先下一層引入呢?

.header {
    .my>.a>.b;
}

// 結(jié)果為:
.header {
  width: 200px;
  height: 200px;
}

以上代碼就很好解釋了弥咪,選擇命名空間中.b選擇器作為要引入的樣式过蹂,所以.b中的樣式被全部引入到.header選擇器中十绑,感覺就好像.header替代了.b一樣。

除了可以使用>表示逐層選擇榴啸,還可以使用空格

以下代碼效果一致:

.header {
    .my .a .b;
}

// 結(jié)果為:
.header {
  width: 200px;
  height: 200px;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末孽惰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鸥印,更是在濱河造成了極大的恐慌,老刑警劉巖坦报,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件库说,死亡現(xiàn)場離奇詭異,居然都是意外死亡片择,警方通過查閱死者的電腦和手機潜的,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來字管,“玉大人啰挪,你說我怎么就攤上這事〕笆澹” “怎么了亡呵?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長硫戈。 經(jīng)常有香客問我锰什,道長,這世上最難降的妖魔是什么丁逝? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任汁胆,我火速辦了婚禮,結(jié)果婚禮上霜幼,老公的妹妹穿的比我還像新娘嫩码。我一直安慰自己,他們只是感情好罪既,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布铸题。 她就那樣靜靜地躺著,像睡著了一般萝衩。 火紅的嫁衣襯著肌膚如雪回挽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天猩谊,我揣著相機與錄音千劈,去河邊找鬼。 笑死牌捷,一個胖子當著我的面吹牛墙牌,可吹牛的內(nèi)容都是我干的涡驮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼喜滨,長吁一口氣:“原來是場噩夢啊……” “哼捉捅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起虽风,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤棒口,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辜膝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體无牵,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年厂抖,在試婚紗的時候發(fā)現(xiàn)自己被綠了茎毁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡忱辅,死狀恐怖七蜘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情墙懂,我是刑警寧澤橡卤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站垒在,受9級特大地震影響蒜魄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜场躯,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一谈为、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧踢关,春花似錦伞鲫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至儒搭,卻和暖如春吠架,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搂鲫。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工傍药, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓拐辽,卻偏偏與公主長得像拣挪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子俱诸,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

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

  • 預(yù)處理語言的誕生 其中 就我所知的有三門語言:Sass菠劝、Less 、Stylus 睁搭。 Sass 誕生于 2007 ...
    moly琴閱讀 168評論 0 0
  • 學(xué)習(xí)Less-看這篇就夠了 前言 CSS的短板 預(yù)處理語言的誕生 其中 就我所知的有三門語言:Sass赶诊、Less ...
    DragonRat閱讀 592評論 1 4
  • 前言 CSS的短板 預(yù)處理語言的誕生 其中 就我所知的有三門語言:Sass、Less 园骆、Stylus 甫何。 Sass...
    嵐平果閱讀 424評論 0 1
  • 2018web前端最新面試題總結(jié) 一、Html/Css基礎(chǔ)模塊 基礎(chǔ)部分 什么是HTML遇伞?答:? HTML并不是...
    duans_閱讀 4,666評論 3 27
  • 前端經(jīng)典面試題: 1、(前端面試題)https://zhuanlan.zhihu.com/p/84212558?f...
    who_are_you_閱讀 332評論 0 2