Less的嵌套規則
在使用標准CSS時,要為多層嵌套的元素定義樣式,要么使用后代選擇器從外到內的嵌套定義,要么給這個元素加上類名或 id 來定義。這樣的寫法雖然很好理解,但維護起來很不方便,因為無法清晰了解到樣式之間的關系。
在Less中,嵌套規則使這個問題迎刃而解。嵌套規則允許在一個選擇器中嵌套另一個選擇器,這更容易設計出精簡的代碼,並且樣式之間的關系一目了然。假設以下HTML 代碼片段:
<header><h1><a href="http://www.waibo.wang/">歪脖網</a></h1><p>學Web開發,就到歪脖網!</p></header>
Less代碼可以這樣寫:
header {h1 {font-size: 26px;font-weight: bold;a {color: #f36;text-decoration: none;&:hover {color: #63f;text-decoration: underline;}}}p {font-size: 12px;&.slogan {color: #f00;}}}
這難道不就是DOM的寫法嗎?說實話,當你第一眼看到這種寫法,你就會情不自禁地愛上Less。這種寫法減了選擇器的層級關系,使代碼的結構非常清晰,無論是閱讀、還是后期維護都是那么自然,是不是有一種本來就該如此的感覺?
在使用嵌套規則時,需要特別注意 & 符號。內層選擇器前面的 & 符號就表示對父選擇器的引用。在一個內層選擇器的前面,如果沒有 & 符號,則它被解析為父選擇器的后代;如果有 & 符號,它就被解析為父元素自身或父元素的偽類。
比如,上述代碼中,由於選擇器 h1 前面沒有 & 符號,則 h1 被解析為 header 選擇器的后代,即 header h1;而 :hover 和 .slogan 前面有 & 符號,& 符號表示對父選擇器的引用,則 &.slogan 表示父元素自身,&:hover 表示父元素的偽類,解析結果為 a:hover 和 p.slogan。編譯后的CSS代碼為:
header h1 {font-size: 26px;font-weight: bold;}header h1 a {color: #f36;text-decoration: none;}header h1 a:hover {color: #63f;text-decoration: underline;}header p {font-size: 12px;}header p.slogan {color: #f00;}
事實上,父選擇器運算符 & 的作用,就是讓當前的選擇器和父級選擇器,按照特定的規則進行連接。它有多種用途,比如創建重復的類名:
.button {&-ok {background-image: url("ok.png");}&-cancel {background-image: url("cancel.png");}&-custom {background-image: url("custom.png");}}
編譯后的CSS代碼為:
.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;}}
編譯后的CSS代碼為:
.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;}}}
編譯后的CSS代碼為:
.grand .parent > .grand .parent {color: red;}.grand .parent .grand .parent {color: green;}.grand .parent.grand .parent {color: blue;}.grand .parent,.grand .parentish {color: cyan;}
還可以將 & 放在一個選擇器的后面,來改變選擇器的順序,將當前選擇器排列到最前面。如:
.header {.menu {border-radius: 5px;.no-borderradius & {background-image: url('images/button-background.png');}}}
選擇器 .no-borderradius & 會使 .no-borderradius 置於他的父選擇器 .header .menu 的前面,形成 .no-borderradius .header .menu的結構。編譯后的CSS代碼為:
.header .menu {border-radius: 5px;}.no-borderradius .header .menu {background-image: url('images/button-background.png');}
將 & 用在一個使用逗號分隔的選擇器列表中,可以產生列表中所有選擇器的所有可能的排列,這被稱作組合爆炸。如:
p, a, ul, li {border-top: 2px dotted #366;& + & {border-top: 0;}}
上述列表中有 4 個選擇器,列表中所有選擇器的所有可能的排列,將有 16 種可能。編譯后的CSS代碼為:
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;}
