Less基礎(chǔ)使用指南

本文目錄

  • 1.變量
  • 2.混合(Mixins)
  • 3.嵌套(Nesting)
  • 4.運(yùn)算(Operations)
  • 5.轉(zhuǎn)義(Escaping)
  • 6.函數(shù)(Functions)
  • 7.命名空間和訪問(wèn)符
  • 8.映射(Maps)
  • 9.作用域(Scope)
  • 10.導(dǎo)入(Importing)
  • 11.Less和Sass的聯(lián)系和區(qū)別
  • 12.Less 中的嵌套規(guī)則講解
    • 12.1.嵌套的使用
    • 12.2.&符號(hào)的使用
    • 12.3.&的重復(fù)使用
    • 12.4.反向嵌套
    • 12.5.@規(guī)則嵌套的冒泡

Less 是一門 CSS 預(yù)處理語(yǔ)言,它擴(kuò)展了 CSS 語(yǔ)言,增加了變量、Mixin、函數(shù)等特性,使 CSS 更易維護(hù)和擴(kuò)展。
Less 可以運(yùn)行在 Node 或?yàn)g覽器端。
常見(jiàn)的css預(yù)處理語(yǔ)言有Less,Sass,Stylus等,
我在平時(shí)寫(xiě)項(xiàng)目時(shí)比較多使用Less,現(xiàn)將Less基本使用方法總結(jié)如下:

1.變量

使用@將常用的屬性定義為變量

@width: 10px;
@height: @width + 10px;

#header {
  width: @width;
  height: @height;
}

編譯結(jié)果

#header {
  width: 10px;
  height: 20px;
}

2.混合(Mixins)

混合(Mixin)是一種將一組屬性從一個(gè)規(guī)則集包含(或混入)到另一個(gè)規(guī)則集的方法。假設(shè)我們定義了一個(gè)類(class)如下:

.bordered {
  border-top: dotted 1px black;
  border-bottom: solid 2px black;
}

如果我們希望在其它規(guī)則集中使用這些屬性呢?沒(méi)問(wèn)題,我們只需像下面這樣輸入所需屬性的類(class)名稱即可,如下所示:

#menu a {
  color: #111;
  .bordered();
}

.post a {
  color: red;
  .bordered();
}

.bordered 類所包含的屬性就將同時(shí)出現(xiàn)在 #menu a 和 .post a 中了。

3.嵌套(Nesting)

Less 提供了使用嵌套(nesting)代替層疊或與層疊結(jié)合使用的能力。假設(shè)我們有以下 CSS 代碼:

#header {
  color: black;
}
#header .navigation {
  font-size: 12px;
}
#header .logo {
  width: 300px;
}

用 Less 語(yǔ)言我們可以這樣書(shū)寫(xiě)代碼:

#header {
  color: black;
  .navigation {
    font-size: 12px;
  }
  .logo {
    width: 300px;
  }
}

用 Less 書(shū)寫(xiě)的代碼更加簡(jiǎn)潔,并且模仿了 HTML 的組織結(jié)構(gòu)。
你還可以使用此方法將偽選擇器(pseudo-selectors)與嵌套(Nesting)一同使用。下面是一個(gè)經(jīng)典的 clearfix 技巧,重寫(xiě)為一個(gè)嵌套(Nesting) (& 表示當(dāng)前選擇器的父級(jí))

.clearfix {
  display: block;
  zoom: 1;

  &:after {
    content: " ";
    display: block;
    font-size: 0;
    height: 0;
    clear: both;
    visibility: hidden;
  }
}

4.運(yùn)算(Operations)

算術(shù)運(yùn)算符 +、-、、/ 可以對(duì)任何數(shù)字、顏色或變量進(jìn)行運(yùn)算。如果可能的話,算術(shù)運(yùn)算符在加、減或比較之前會(huì)進(jìn)行單位換算。計(jì)算的結(jié)果以最左側(cè)操作數(shù)的單位類型為準(zhǔn)。如果單位換算無(wú)效或失去意義,則忽略單位。無(wú)效的單位換算例如:px 到 cm 或 rad 到 % 的轉(zhuǎn)換。
乘法和除法不作轉(zhuǎn)換。因?yàn)檫@兩種運(yùn)算在大多數(shù)情況下都沒(méi)有意義,一個(gè)長(zhǎng)度乘以一個(gè)長(zhǎng)度就得到一個(gè)區(qū)域,而 CSS 是不支持指定區(qū)域的。Less 將按數(shù)字的原樣進(jìn)行操作,并將為計(jì)算結(jié)果指定明確的單位類型。

calc() 特例

為了與 CSS 保持兼容,calc() 并不對(duì)數(shù)學(xué)表達(dá)式進(jìn)行計(jì)算,但是在嵌套函數(shù)中會(huì)計(jì)算變量和數(shù)學(xué)公式的值。

@var: 50vh/2;
width: calc(50% + (@var - 20px));  // 結(jié)果是 calc(50% + (25vh - 20px))

5.轉(zhuǎn)義(Escaping)

轉(zhuǎn)義(Escaping)允許你使用任意字符串作為屬性或變量值。任何 ~"anything" 或 ~'anything' 形式的內(nèi)容都將按原樣輸出。

@min768: ~"(min-width: 768px)";
.element {
  @media @min768 {
    font-size: 1.2rem;
  }
}

編譯為:

@media (min-width: 768px) {
  .element {
    font-size: 1.2rem;
  }
}

注意,從 Less 3.5 開(kāi)始,可以簡(jiǎn)寫(xiě)為:

@min768: (min-width: 768px);
.element {
  @media @min768 {
    font-size: 1.2rem;
  }
}

在 Less 3.5+ 版本中,許多以前需要“引號(hào)轉(zhuǎn)義”的情況就不再需要了。

6.函數(shù)(Functions)

Less 內(nèi)置了多種函數(shù)用于轉(zhuǎn)換顏色、處理字符串、算術(shù)運(yùn)算等。這些函數(shù)在Less 函數(shù)手冊(cè)中有詳細(xì)介紹。
函數(shù)的用法非常簡(jiǎn)單。下面這個(gè)例子將介紹如何利用 percentage 函數(shù)將 0.5 轉(zhuǎn)換為 50%,將顏色飽和度增加 5%,以及顏色亮度降低 25% 并且色相值增加 8 等用法:

@base: #f04615;
@width: 0.5;

.class {
  width: percentage(@width); // returns `50%`
  color: saturate(@base, 5%);
  background-color: spin(lighten(@base, 25%), 8);
}

7.命名空間和訪問(wèn)符

有時(shí),出于組織結(jié)構(gòu)或僅僅是為了提供一些封裝的目的,你希望對(duì)混合(mixins)進(jìn)行分組。你可以用 Less 更直觀地實(shí)現(xiàn)這一需求。假設(shè)你希望將一些混合(mixins)和變量置于 #bundle 之下,為了以后方便重用或分發(fā):

#bundle() {
  .button {
    display: block;
    border: 1px solid black;
    background-color: grey;
    &:hover {
      background-color: white;
    }
  }
  .tab { ... }
  .citation { ... }
}

現(xiàn)在,如果我們希望把 .button 類混合到 #header a 中,我們可以這樣做:

#header a {
  color: orange;
  #bundle.button();  // 還可以書(shū)寫(xiě)為 #bundle > .button 形式
}

注意:如果不希望它們出現(xiàn)在輸出的 CSS 中,例如 #bundle .tab() ,請(qǐng)將()附加到命名空間后面(例如 #bundle().tab)。

8.映射(Maps)

從 Less 3.5 版本開(kāi)始,你還可以將混合(mixins)和規(guī)則集(rulesets)作為一組值的映射(map)使用。

#colors() {
  primary: blue;
  secondary: green;
}

.button {
  color: #colors[primary];
  border: 1px solid #colors[secondary];
}

輸出符合預(yù)期:

.button {
  color: blue;
  border: 1px solid green;
}

9.作用域(Scope)

Less 中的作用域與 CSS 中的作用域非常類似。首先在本地查找變量和混合(mixins),如果找不到,則從“父”級(jí)作用域繼承。

@var: red;

#page {
  @var: white;
  #header {
    color: @var; // white
  }
}

與 CSS 自定義屬性一樣,混合(mixin)和變量的定義不必在引用之前事先定義。因此,下面的 Less 代碼示例和上面的代碼示例是相同的:

@var: red;

#page {
  #header {
    color: @var; // white
  }
  @var: white;
}

10.導(dǎo)入(Importing)

“導(dǎo)入”的工作方式和你預(yù)期的一樣。你可以導(dǎo)入一個(gè) .less 文件,此文件中的所有變量就可以全部使用了。如果導(dǎo)入的文件是 .less 擴(kuò)展名,則可以將擴(kuò)展名省略掉:

@import "library"; // library.less
@import "typo.css";

11.Less和Sass的聯(lián)系和區(qū)別

Less和Sass都是css的預(yù)處理語(yǔ)言,也有很多共性,比如下面這些
1、混入(Mixins)——class中的class;
2、參數(shù)混入——可以傳遞參數(shù)的class,就像函數(shù)一樣;
3、嵌套規(guī)則——Class中嵌套class,從而減少重復(fù)的代碼;
4、運(yùn)算——CSS中用上數(shù)學(xué);
5、顏色功能——可以編輯顏色;
6、名字空間(namespace)——分組樣式,從而可以被調(diào)用;
7、作用域——局部修改樣式;
8、JavaScript 賦值——在CSS中使用JavaScript表達(dá)式賦值。

當(dāng)然它們也有很多不同之處:

  • 1.最明顯的區(qū)別:編譯符不一樣
    Less是@,而Sass是$
  • 2.Sass支持if{}else{}作為條件語(yǔ)句,而Less的條件語(yǔ)句使用when;
  • 3.編譯環(huán)境不一樣
    Sass需要安裝Ruby,屬于服務(wù)端處理,然而Less是需要引入官網(wǎng)提供和的less.js,屬于客戶端處理。

Less和Sass都使得css更容易維護(hù)和擴(kuò)展,隨著兩者的不斷發(fā)展,很多內(nèi)容也都變得更人性化,我們根據(jù)日常開(kāi)發(fā)的需求選擇使用即可。

注:SCSS 是 Sass 3 引入新的語(yǔ)法,其語(yǔ)法完全兼容 CSS3,并且繼承了 Sass 的強(qiáng)大功能。Sass 和 SCSS 其實(shí)是同一種東西,我們平時(shí)都稱之為 Sass。

12.Less 中的嵌套規(guī)則講解

Less 中嵌套應(yīng)該很容易理解,html 語(yǔ)言中就支持標(biāo)簽的嵌套。我們?cè)谑褂?css 時(shí),如果想要為多層嵌套的元素設(shè)置樣式,要么給元素加上一個(gè)類選擇器或ID選擇器,要么使用后代選擇器。例如:

.rcdemo{
  font-size: 14px;
}
.rcdemo p{
  line-height: 25px;
}
.rcdemo p span{
  color: #ccc;
}

這樣寫(xiě)雖然也好理解,但是沒(méi)有那么直觀,維護(hù)起來(lái)也不方便。
而 Less 中的嵌套規(guī)則正好可以解決這樣問(wèn)題,嵌套規(guī)則允許在一個(gè)選擇器中嵌套另一個(gè)選擇器,這樣可以使得代碼看起來(lái)一目了然,后期維護(hù)也方便。

12.1.嵌套的使用

例如上面的 css 代碼使用 Less 語(yǔ)言來(lái)寫(xiě):

.rcdemo{
   font-size: 14px;
   p{
      line-height: 25px;
      span{
         color: #ccc;
      }
   }
}

這樣整體看起來(lái)是不是更直觀一些,一層套一層。但是注意喲,一般我們不會(huì)嵌套太多層,嵌套的層數(shù)越多,性能就越差,建議一般嵌套三層左右。

12.2.&符號(hào)的使用

在我們使用嵌套規(guī)則時(shí),要特別注意 & 符號(hào)的使用,& 符號(hào)可以表示對(duì)父選擇器的引用。
在一個(gè)內(nèi)層選擇器的前面,如果沒(méi)有 & 符號(hào),則這個(gè)內(nèi)層選擇器會(huì)被解析為父選擇器的后代。如果內(nèi)層選擇器前面有一個(gè) & 符號(hào),則內(nèi)層選擇器會(huì)被解析為父選擇器自身或父選擇器的偽類。
例如我們看下面這段代碼:

.rcdemo{
    a{
        color: #eee;
    }
}

編譯成 css 代碼:

.rcdemo a {
  color: #eee;
}

可以看到,標(biāo)簽選擇器 a 前面沒(méi)有加 & 符號(hào),所以這個(gè)標(biāo)簽選擇器 a 被解析為 .rcdemo 選擇器的后代。
再來(lái)看一下內(nèi)層選擇器前面加 & 符號(hào):

.rcdemo{
   &one{
      font-size: 12px;
   }
   &:hover{
       color: #fff;
   }
}

編譯成 css 代碼:

.rcdemoone {
  font-size: 12px;
}
.rcdemo:hover {
  color: #fff;
}

上面代碼中,one 前面添加了一個(gè) & 符號(hào),這個(gè)符號(hào)就表示父選擇器本身,所以解析后為.rcdemoone。當(dāng)然 :hover 偽類前面的 & 符號(hào)也是同理。

12.3.&的重復(fù)使用

通過(guò)使用 & 符號(hào),可以重復(fù)引用父類選擇器。
例如下面這段 Less 代碼,如果我們希望每個(gè)選擇器名的前綴都為 top,可以像下面這樣簡(jiǎn)寫(xiě):

.rcdemo{
   &-one{
       font-size: 14px;
   }
   &-two{
       font-size: 16px;
   }
   &-three{
       font-size: 18px;
   }
}

編譯為 css 代碼:

.rcdemo-one {
  font-size: 14px;
}
.rcdemo-two {
  font-size: 16px;
}
.rcdemo-three {
  font-size: 18px;
}

除此之外,還可以同時(shí)使用多個(gè) & 符號(hào),并使用其他運(yùn)算符連接起來(lái):

.rcdemo{
   &&-one{
       font-size: 14px;
   }
   &,&-two{
       font-size: 16px;
   }
   &, &er{
       font-size: 18px;
   }
}

編譯為 css 代碼:

.rcdemo.rcdemo-one {
  font-size: 14px;
}
.rcdemo,
.rcdemo-two {
  font-size: 16px;
}
.rcdemo,
.rcdemoer {
  font-size: 18px;
}

12.4.反向嵌套

有些時(shí)候可能我們可能需要將內(nèi)層選擇器放在父選擇器之前,此時(shí)我們可以將 & 放在當(dāng)前選擇器后面來(lái)完成。
例如下面這段代碼,我們希望 .rcdemo 選擇器位于 .nav 選擇器之前,可以在 .rcdemo 選擇器的后面加一個(gè) & 符號(hào):

.nav{
   font-size: 14px;
   .rcdemo &{
     color: #fff;
   }
}

編譯為 css 代碼:

.nav {
  font-size: 14px;
}
.rcdemo .nav {
  color: #fff;
}

可以看到,編譯之后的 css 代碼中 .rcdemo 選擇器位于 .nav 選擇器前面。
當(dāng)然了,這種方法我們了解即可,在開(kāi)發(fā)中盡量不要去使用。

12.5.@規(guī)則嵌套的冒泡

@ 規(guī)則(例如 @media 或 @supports)可以與選擇器以相同的方式進(jìn)行嵌套。@ 規(guī)則會(huì)被放在前面,同一規(guī)則集中的其它元素的相對(duì)順序保持不變。這叫做冒泡(bubbling)。

.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;
  }
}

編譯為

.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;
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容