摘要:區別在于,類是在中運用的,混合器是在樣式表中使用的。基本用法選擇器繼承,用去繼承一個選擇器定義的所有樣式。繼承背后的基本實現思路背后最基本的想法是,如果繼承了,那么樣式表中的任何一處選擇器都會用這一選擇器組進行替換和打開。
零. 混合器——樣式層上復用上一篇詳述了Sass如何嵌套、導入和注釋這3個基本方式來保持條理性和可讀性,這一篇更進一步地闡述sass保持樣式復用和簡潔的方式——混合器和選擇器繼承——這兩種方式都能復用樣式,使用它們也不難,但一定要注意什么時候該用什么。
當你需要一直復用大段樣式的時候,可以考慮下混合器。
1. 基本用法混合器使用@mixin標識符定義,然后通過@include引入,簡單的說就是用@mixin定義一個混合器,它具有一個名字和一堆包含在花括號中的規則,用@include引入這個混合器(通過混合器的名字),混合器中的樣式規則就會被提取到調用@include的地方。
此外,混合器中也可以包含CSS規則,可以包含選擇器和選擇器中的規則,甚至可以用父選擇器標識符&。
@mixin rounded-corners{ -moz-border-radius:5px; -webkit-border-redius:5px; border-radius:5px; } .notice{ background-color:green; border:2px solid #0a0; @include rounded-corners; } //導出的css如下 .notice{ background-color:green; border:2px solid #0a0; -moz-border-radius:5px; -webkit-border-redius:5px; border-radius:5px; }2. 可以給混合器傳參
混合器復用樣式的時候,可以通過傳參改變混合器中的具體屬性值,和function很像。
混合器定義時,參數名稱必須以變量名形式指定,此外,可選的是,參數可以有默認值,只需要在參數名后面以冒號:分隔后寫上默認屬性值,如果你了解各類編程語言函數的默認參數值,這應該不會陌生。
引入含有參數的選擇器時,有兩種傳入參數的形式,一種是僅僅傳入參數值,這要求傳入參數值的順序和混合器定義的參數順序一致,另一種則是通過$name:value的形式指定傳入參數的名字和值,這就不要求順序。
以下代碼定義了一個有3個參數的選擇器來設置一個鏈接各個狀態的顏色樣式,其中常規樣式的顏色$normal有一個默認值#233,另外兩個參數沒有默認值:
@mixin link-col($hover, $visited, $normal:#233){ color:$normal; &:hover { color:$hover; } &:visited { color:$visited; } }
當引入這個混合器的時候,可以有以下兩種方式引入:
//可以這么引入,因為最后一個參數默認,可以不傳入 a{ @include link-col(red, gray); } //也可以這樣,就不用管順序 a{ @include link-col($visited:gray, $hover:red); }3. 混合器的使用場景——注意和類的區別
如果發現一直在不停復用一段樣式,應該考慮把這段樣式構造成一個混合器,尤其是它本身可能是一組有意義的樣式組合,并且考慮進參數的設置,讓混合器更加智能。
判斷一組選擇器是否應該組合在一起組成一個混合器,一條經驗法則:能否為這個混合器想出一個能概括它的好名字。如果能想出一個短名字來描述這幾條樣式組合的作用,那么往往能構造出一個合適的混合器。
混合器和CSS類很像,css類也可以復用樣式,一段樣式給一個類,然后那里需要這一段樣式去修飾,就在哪里添加這個類。
區別在于,類是在HTML中運用的,混合器是在樣式表中使用的。這意味著,“類”具有語義化的含義,而混合器僅僅是有關樣式的,僅僅是描述展示出來是什么樣子的。
能區分這兩者微妙的區別,并且有意地去選擇更合適的方式去復用樣式,這能讓你的代碼保持可讀性和可維護性。誠然,現在很多流行框架,依舊在用類去復用樣式,但是語義和樣式的解耦絕對是趨勢。
一. 選擇器繼承——語義化關系上復用樣式剛描述完混合器和類的差別,在于“語義”和“展示樣式”,又突然到了建立在語義化關系上復用樣式的選擇器繼承,似乎有點繞,為什么不用類而要用選擇器繼承呢?
實際上,選擇器繼承最常用的場景就是和類一起工作的。
1. 基本用法選擇器繼承,用@extend去繼承一個選擇器定義的所有樣式。以下代碼,.seriousError將會繼承.error定義的所有樣式。
.error{ border: 1px red; background-color: #fdd; } .seriousError{ @extend .error; border-width: 3px; } //輸出的CSS代碼是這樣的 .error, .seriousError{ border: 1px red; background-color: #fdd; } .seriousError{ border-width: 3px; }
是的,平時我們完全可以寫輸出的純CSS代碼,多寫一個選擇器名字和多寫一行@extend命令,我們覺得差不多。
但是,在上面的例子中,.seriousError不僅會繼承.error自身的所有樣式(就像上面的那樣),任何和.error有關的組合選擇器樣式也會被.seriousError以組合選擇器的形式繼承。
比如,在上面的樣式代碼是這樣的:
.error{ border: 1px red; background-color: #fdd; } .seriousError{ @extend .error; border-width: 3px; } .error a{ color:red; font-weight:bold; } h1.error{ font-size:1.3em; } //輸出的CSS是這樣的,注意看下面的選擇器 .error, .seriousError{ border: 1px red; background-color: #fdd; } .seriousError{ border-width: 3px; } .error a, .seriousError a{ color:red; font-weight:bold; } h1.error, h1.seriousError{ font-size:1.3em; }
這個時候,如果我們不借助Sass的選擇器繼承,而用純CSS來寫,是不是就會有一些繁瑣了。
我們再來想一下這幾段代碼的含義:我們描述了一個.error類來整體修飾錯誤提示都應該有的樣式,然后.seriousError是.error類的細化,描述了一個嚴重的錯誤應該有的進一步的樣式。所以.seriousError應該有.error相關的所有樣式,而這就是選擇器繼承幫助我們做的事。
2. 繼承背后的基本實現思路@extend背后最基本的想法是,如果.seriousError繼承了.error,那么樣式表中的任何一處.error選擇器都會用.error, .seriousError這一選擇器組進行替換和打開。
3. 繼承的使用場景繼承是建立在語義化的關系上的,當一個元素擁有的類表明它是屬于另一個類時(是另一個類的細化時),在這種情況下需要復用樣式時使用,它的本質作用還是樣式復用。
它和混合器相比,繼承生成的代碼量會相對較少,因為繼承僅僅重復選擇器,而混合器是重復一段樣式。
另外,可以看到,一般它和類一起協同工作,當你在構建一些有關系的類時,在寫這些具有層級關系的類的樣式的時候,選擇器繼承可以幫你嚴謹地完成某些樣式的復用,無論是這個選擇器本身,還是隱藏在其他復雜選擇器中的目標選擇器。
4. 繼承的高級用法既然這被稱為選擇器繼承,不是“類”繼承,那么必然繼承是可以針對類之外的選擇器使用的,只是繼承類是最常用的使用場景。
還有一種場景是,繼承一個HTML元素的樣式,如定一個.disabled類,樣式修飾讓它看上去像一個灰掉的鏈接,通過繼承a這一元素實現:
.disabled{ color: gray; @extend a; }
還有一些關于復雜選擇器的繼承規則:
如果繼承了一個復雜的選擇器,那么只會繼承這個復雜選擇器命中的樣式, 比如.seriousError @extend .important.error,那么被繼承的.important.error被看做一個整體,多帶帶的.important或者.error是不會被繼承的;
如果一個選擇器序列繼承了另一個選擇器,那么只會完全命中序列選擇器的才會繼承,比如(#main .seriousError) @extend .error(最好不要這么做),那么前者的#main .seriousError也被看做一個整體,只有完全命中這個選擇器的才會繼承;
以逗號分隔的選擇器序列是不能被繼承的,因為這和繼承其中任何一個選擇器效果一樣。
5. 使用繼承時注意后代選擇器可以放心地繼承有后代選擇器修飾的選擇器,但不用用后代選擇器去繼承別的選擇器。即放心地用.serious { @extend (.main .error) },但是不要用.something .serious { @exten .error }。
為什么,因為不這么做可能會導致繼承迅速變復雜,sass可能會遺漏一些情況,考慮:
.foo .bar { @extend .baz; } .bip .baz { a:b; }
當下面那條規則應用到.foo .bar時,有3種情況:
所以sass必須要生成3種組合選擇器才能覆蓋這3種情況,但遺憾的是,sass并不總是會生成所有情況,另外,這樣做,選擇器的個數會迅速增加,所以最好的方式是不要這么用。
三. 小結Sass保持樣式復用和簡潔的兩個方式,一是混合器,混合器主要用于樣式展示層的復用,可以給混合器傳參從而在復用代碼的同時保持靈活性,二是選擇器繼承,一般和類一起使用,主要用于建立在語義化關系上的樣式復用,注意繼承可能引發的問題。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/115380.html
摘要:如下區塊標題前綴可以讓我們使用命令查找標題名時將搜索范圍限制在區塊標題中。 在參與規模龐大、歷時漫長且參與人數眾多的項目時,所有開發者遵守如下規則極為重要: 保持 CSS 易于維護 保持代碼清晰易懂 保持 CSS 的可拓展性 為了實現這一目標,我們要采用諸多方法。 本文檔第一部分將探討語法、格式以及分析 CSS 結構;第二部分將圍繞方法論、思維框架以及編寫與規劃 CSS 的看法...
摘要:這個時候小明如果僅僅引入不想改,那么就是這個值,如果他想改,就可以在任何一處重新聲明這個變量,那么就會變成小明的值。 這一篇主要詳述保持sass條理性和可讀性的3個最基本方法——嵌套、導入和注釋。 零. 變量 變量本身的作用是為了保持屬性值的可維護性,把所有需要維護的屬性值放在同一個地方,快速更改,處處生效,可謂售后無憂。 1.變量聲明 變量用$符號開頭進行聲明,任何可以用作CSS屬性...
摘要:前言很久沒有用文章記錄自己的學習歷程了,主要是因為實在寫的不行,相比大牛寫的博客,我這只能算是東拼西湊或者說是讀書筆記。以前我只使用外部,現在的更加好用,所以在學習過程中記了一些筆記。在后面加一個感嘆號,表示這是重要注釋。 前言 很久沒有用文章記錄自己的學習歷程了,主要是因為實在寫的不行,相比大牛寫的博客,我這只能算是東拼西湊或者說是讀書筆記。但是今天還是拾起筆來了,雖然沒什么干貨,但...
摘要:輸出的是這樣的可以看到,當用繼承的樣式時,和也完全套用了的樣式,而且你會發現,規則并沒有被重復輸出,而且這樣的方式更符合我們對于這幾個選擇器的認知如果你之前用過面向對象編程的話。 Sass學習筆記持續整理中,開篇不講怎么安裝,sass是什么,這些搜索引擎會告訴你,我們從sass的作用開始講起,知道sass用來干什么,有什么作用,我們才能相信用sass的好處,并且時時刻刻想著sass的設...
閱讀 3533·2021-11-18 13:22
閱讀 2547·2021-09-23 11:53
閱讀 714·2019-08-30 13:17
閱讀 1339·2019-08-30 13:12
閱讀 890·2019-08-29 15:43
閱讀 1091·2019-08-29 12:53
閱讀 2826·2019-08-26 18:27
閱讀 1493·2019-08-26 11:52