1. 程式人生 > >less 新手入門(二) Mixin 混合、帶引數的 Mixin

less 新手入門(二) Mixin 混合、帶引數的 Mixin

二、mixin 混合

mixin 屬性只能基於現在已有的樣式規則!你可以在 mixin 中使用類選擇器和 id 選擇器:

.a,#b{
    color: rebeccapurple;
}
.mixin-class{
    .a();
}
.mixin-id{
    #b();
}

輸出:

.a,
#b {
  color: rebeccapurple;
}
.mixin-class {
  color: rebeccapurple;
}
.mixin-id {
  color: rebeccapurple;
}

注意,當呼叫 mixin 時,括號是可選的

.a()  //此種寫法和下面寫法無區別
.a;

3.1 不輸出的 mixin

如果你想建立一個 mixin,但你不想讓 mixin 在生成 css 中輸出,你可以在它後面加上括號 () 。

.my-mixin{
    color: black;
}
.my-other-mixin(){
    background: wheat;
}
.class{
    .my-mixin;
    .my-other-mixin;
}

輸出:

.my-mixin {
  color: black;
}
//此處並沒有輸出 .my-other-mixin
.class {
  color
: black; background: wheat; }

3.2 選擇器在 mixin 的用法

mixin 不僅可以包含屬性,還可以包含選擇器

.my-hover-mixin(){
    &:hover{
        border: 1px solid red;
    }
}
button{
    .my-hover-mixin();
}

輸出:

button:hover {
  border: 1px solid red;
}

3.3 命令空間 Namespaces

如果想要在一個更復雜的選擇器中混合屬性,可以堆疊多個 id 或類

#outer
{ .inner{ color: red; } } .c{ #outer>.inner; }

同樣,上面的 > 符號是可選的,

// 下面寫法都一樣
#outer > .inner;
#outer > .inner();
#outer.inner;
#outer.inner();

這種使用方法被稱為名稱空間。您可以將 mixin 置於 id 選擇器之下,這樣可以確保它不會和另一個庫衝突。

#my-library {
  .my-mixin() {
    color: black;
  }
}
// which can be used like this
.class {
  #my-library > .my-mixin();
}

3.4 !important 關鍵字

在 mixin 後使用 !important 關鍵字,將會標記呼叫所有繼承的屬性為! important

.foo (@bg: #f5f5f5, @color: #900) {
  background: @bg;
  color: @color;
}
.unimportant {
  .foo(1);
}
.important {
  .foo(2) !important;
}

輸出:

.unimportant {
  background: #f5f5f5;
  color: #900;
}
.important {
  background: #f5f5f5 !important;
  color: #900 !important;
}

四、帶引數的 Mixin

如何將引數傳遞給 mixin?

mixin 還可以接受引數,這些引數在混合時傳遞給選擇器塊。舉例:

.border-radius(@radius) {
  -webkit-border-radius: @radius;
     -moz-border-radius: @radius;
          border-radius: @radius;
}

下面是我們如何將其混合到各種規則中:

#header {
  .border-radius(4px);
}
.button {
  .border-radius(6px);
}

引數 mixin 還可以為其引數設定預設值

.border-radius(@radius: 5px) {
  -webkit-border-radius: @radius;
     -moz-border-radius: @radius;
          border-radius: @radius;
}

我們現在可以這樣來呼叫:

#header {
  .border-radius;
}

你也可以使用不帶引數的引數混合。如果您希望從 CSS 輸出中隱藏規則集,但希望將其屬性包含在其他規則集中,則這非常有用:

.wrap() {
  text-wrap: wrap;
  white-space: -moz-pre-wrap;
  white-space: pre-wrap;
  word-wrap: break-word;
}

pre { .wrap }

輸出如下:此案例同 上方 3.1

pre {
  text-wrap: wrap;
  white-space: -moz-pre-wrap;
  white-space: pre-wrap;
  word-wrap: break-word;
}

4.1 mixin 中包含多個引數 - Mixins With Multiple Parameters

引數是 分號逗號 分割的。

建議使用分號。因為逗號有雙重含義:它既可以被解釋為 mixin 引數的分隔符,也可以作為 css 列表分隔符,容易混淆。

如果使用逗號作為 mixin 分隔符,那麼就不可能建立使用逗號分隔的列表作為引數。另一方面,如果編譯器在 mixin 呼叫或宣告中看到至少一個分號,那麼它假設引數由分號分隔,所有逗號都屬於 css 列表:

  • 兩個引數和每個包含逗號分隔的列表: .name(1, 2, 3; something, else)
  • 三個引數,每個引數包含一個數字:.name(1, 2, 3)
  • 使用假分號來建立一個包含逗號分隔的 css 列表的 mixin 呼叫:.name(1, 2, 3;)
  • 逗號分隔的預設值:.name(@param1: red, blue;)

定義多個具有相同名稱和引數的 mixin 是合法的。Less 將使用所有可以應用的屬性。如果你用 mixin 與一個引數,例如,. mixin(green),那麼就會使用所有具有一個強制引數的 mixin 屬性:

.mixin(@color) {
    color-1:@color;
}
.mixin(@color;@padding:2){
    color-2:@color;
    padding-2:@padding
}
.mixin(@color;@padding;@margin:2){
    color-3:@color;
    padding-3:@padding;
    margin: @margin @margin @margin @margin;
}

.some .selector div{
    .mixin(#008000);
}

輸出:

.some .selector div {
  color-1: #008000;
  color-2: #008000;
  padding-2: 2;
}

4.2 命令引數

mixin 引用的時候僅使用引數名稱引用即可,不需要有任何特殊的順序

.class1(@color:black;@margin:10px;@padding:20px){
    color: @color;
    margin: @margin;
    padding: @padding;
}
.demo1{
    .class1(@margin:20px; @color:#33acfe);
}
.demo2{
    .class1(#efca33; @padding:40px;)
}

輸出:

.demo1 {
  color: #33acfe;
  margin: 20px;
  padding: 20px;
}
.demo2 {
  color: #efca33;
  margin: 10px;
  padding: 40px;
}

4.3 @arguments 變數

@arguments 在 mixin 中有一個特殊的含義,它包含所有傳入的引數,當 mixin 被呼叫時。如果你不想處理個別引數,這很有用:

.box-shadow(@x:0; @y:0; @blur:1px; @color:#000){
    -webkit-box-shadow:@arguments;
       -moz-box-shadow:@arguments;
           -box-shadow:@arguments;
}
.big-block{
    .box-shadow(2px; 5px;)
}

輸出:

.big-block {
  -webkit-box-shadow: 2px 5px 1px #000;
  -moz-box-shadow: 2px 5px 1px #000;
  -box-shadow: 2px 5px 1px #000;
}

4.4 高階引數和 @rest 變數

您可以使用 … ,如果你想讓你的 mixin 採取一個可變數目的引數。在變數名之後使用這個變數會將這些引數賦給變數。

.mixin(...) {        // 匹配0-N 個引數
.mixin() {           // 只匹配0個引數
.mixin(@a: 1) {      // 匹配0-1個引數
.mixin(@a: 1; ...) { // 匹配0-N個引數
.mixin(@a; ...) {    // 匹配1-N個引數

此外,

.mixin(@a; @rest...) {
   // @rest繫結到 @a 之後的引數
   // @arguments 繫結到所有引數
}

4.5 模式匹配

有時,您可能希望根據你傳遞給它的引數來更改 mixin 的行為。讓我們從一些基本的東西開始:

.mixin(@s; @color) { ... }

.class {
  .mixin(@switch; #888);
}

現在我們想要 .mixin 的行為方式不同,基於 @ switch 的值,我們可以像這樣定義 .mixin:

.mixin(dark; @color) {
  color: darken(@color, 10%);
}
.mixin(light; @color) {
  color: lighten(@color, 10%);
}
.mixin(@_; @color) {
  display: block;
}

現在, 如果我們執行:

?

| 12345 | @switch: light; .class {``.mixin(@switch; #888``);``} |

輸出:

.class {
  color: #a2a2a2;
  display: block;
}

上例說明:

  • 第一個 mixin 定義不匹配,因為它設定第一個引數是 dark 。
  • 第二個 mixin 定義匹配,因為它設定的引數是 light。
  • 第三個 mixin 定義匹配,因為它設定的引數為 任何值。

只有匹配到的 mixin 定義才會被使用,變數可以匹配並繫結到任何值。除了變數之外的,其他任何東西都只匹配一個與自身相等的值。 這裡我們也可以對顏色的濃度進行匹配,例如:

.mixin(@a) {
  color: @a;
}
.mixin(@a; @b) {
  color: fade(@a; @b);
}

現在如果我們使用 .mixin 只定義一個引數,我們將得到第一個定義的輸出,但是如果我們用兩個引數呼叫它,我們將得到第二個定義,即顏色值為 @ a 淡入到 @ b。