less學習筆記7-語言特性(Loop&Merge&Parents Selectors)

到這一篇,less文檔的語言特性部分就全部完成了,閱讀過程中,依舊建議結合官網的原文進行理解并且在電腦里面安裝less,跟著內容自己試試,看看編譯結果會更加直觀的理解,也可以多多嘗試加深理解。接下來的部分就是less的函數手冊,函數手冊大概下周會出,爭取不拖延,不會像兩篇這樣說好上周末出的結果拖到現在,會踏實的每天都寫一些的。


循環(Loop)

在less中一個mixin可以調用其本身。當結合了guards表達式和模式匹配后,這樣一個遞歸的mixins可以用來創建各種各樣的迭代/循環的結構。

.loop(@counter) when (@counter > 0) {
  .loop((@counter - 1));    // 下一次迭代
  width: (10px * @counter); // 每次迭代的代碼
}

div {
  .loop(5); //啟動循環
}

編譯為:

div {
  width: 10px;
  width: 20px;
  width: 30px;
  width: 40px;
  width: 50px;
}

使用遞歸循環的一般的例子是生成CSS的格網類(grid classes):

.generate-columns(4);

.generate-columns(@n, @i: 1) when (@i =< @n) {
  .column-@{i} {
    width: (@i * 100% / @n);
  }
  .generate-columns(@n, (@i + 1));
}

編譯為:

.column-1 {
  width: 25%;
}
.column-2 {
  width: 50%;
}
.column-3 {
  width: 75%;
}
.column-4 {
  width: 100%;
}

合并(Merge)

合并屬性

合并特性允許將多個屬性的值聚合到一個使用逗號或者空格分隔的單屬性列表中。merge對于像background和transform屬性來說是非常有用的。

逗號(comma)

發布于v1.5.0

.mixin() {
  box-shadow+: inset 0 0 10px #555;
}
.myclass {
  .mixin();
  box-shadow+: 0 0 20px black;
}

編譯為:

.myclass {
  box-shadow: inset 0 0 10px #555, 0 0 20px black;
}

空格(space)

發布于v1.7.0

.mixin() {
  transform+_: scale(2);
}
.myclass {
  .mixin();
  transform+_: rotate(15deg);
}

編譯為:

.myclass {
  transform: scale(2) rotate(15deg);
}

為了避免各種非故意的連接,merge要求一個明確的 “+”或者“+_”作為標記在每個需要連接的聲明中。

父代選擇器(parent selectors)

&運算符代表了嵌套中的父代選擇器,在將一個修改過的類或者偽類加到一個已存在的選擇器中的情況下是很常用的。

a {
  color: blue;
  &:hover {
    color: green;
  }
}

編譯為:

a {
  color: blue;
}

a:hover {
  color: green;
}

注意到如果沒有&,上面的例子將不會產生a:hover的樣式(會變成一個在<a>標簽里面的可以匹配任意懸停元素的后代選擇器),那就不是我們想要的嵌套的:hover的偽類選擇器。
“父代選擇器”運算符具有各種用途,你可以將嵌套規則的選擇器以非默認方式的其他方式組合在一起。另外一種典型用法就是產生重復的類名:

.button {
  &-ok {
    background-image: url("ok.png");
  }
  &-cancel {
    background-image: url("cancel.png");
  }

  &-custom {
    background-image: url("custom.png");
  }
}

編譯為:

.button-ok {
  background-image: url("ok.png");
}
.button-cancel {
  background-image: url("cancel.png");
}
.button-custom {
  background-image: url("custom.png");
}

多個&

&可以在一個選擇器中出現多次,這使得可以重復地引用父代選擇器而不重復它的名字。

.link {
  & + & {
    color: red;
  }

  & & {
    color: green;
  }

  && {
    color: blue;
  }

  &, &ish {
    color: cyan;
  }
}

編譯為:

.link + .link {
  color: red;
}
.link .link {
  color: green;
}
.link.link {
  color: blue;
}
.link, .linkish {
  color: cyan;
}

注意到 & 代表了所有的父代選擇器(不是最近的父代選擇器):

.grand {
  .parent {
    & > & {
      color: red;
    }

    & & {
      color: green;
    }

    && {
      color: blue;
    }

    &, &ish {
      color: cyan;
    }
  }
}

編譯為:

.grand .parent > .grand .parent {
  color: red;
}
.grand .parent .grand .parent {
  color: green;
}
.grand .parent.grand .parent {
  color: blue;
}
.grand .parent,
.grand .parentish {
  color: cyan;
}

改變選擇器的順序

可以使當前選擇器比其父代選擇器優先,這個可以通過將&放在當前選擇器的后面來實現。當使用Modernize時,您可能希望根據支持的特性指定不同的規則:

.header {
  .menu {
    border-radius: 5px;
    .no-borderradius & {
      background-image: url('images/button-background.png');
    }
  }
}

" .no-borderradius & " 選擇器 將會使" .no-borderradius "選擇器比其父代選擇器" .header .menu "優先。從而會編譯成" .no-borderradius .header .menu "

.header .menu {
  border-radius: 5px;
}
.no-borderradius .header .menu {
  background-image: url('images/button-background.png');
}

組合遍歷(Combinatorial Explosion)

&可以生產所有可能的選擇器排列,這些選擇器在一個由逗號分隔的列表中。

p, a, ul, li {
  border-top: 2px dotted #366;
  & + & {
    border-top: 0;
  }
}

這產生了指定元素所有可能的組合:

p,
a,
ul,
li {
  border-top: 2px dotted #366;
}
p + p,
p + a,
p + ul,
p + li,
a + p,
a + a,
a + ul,
a + li,
ul + p,
ul + a,
ul + ul,
ul + li,
li + p,
li + a,
li + ul,
li + li {
  border-top: 0;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,886評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,136評論 25 708
  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優秀的...
    笨鳥慢飛閱讀 5,583評論 0 4
  • 常量與變量使用let來聲明常量,使用var來聲明變量。聲明的同時賦值的話,編譯器會自動推斷類型。值永遠不會被隱式轉...
    莫_名閱讀 461評論 0 1
  • 初始化服務器環境 配置gunicorn服務器 Gunicorn(gunicorn.org)是一個Python WS...
    linxiangyu閱讀 2,861評論 0 3