摘要:類選擇器具有更高的專用性,所以將戰(zhàn)勝元素選擇器。個(gè)位在整個(gè)選擇器中每包含一個(gè)元素選擇器或偽元素就在該列中加分。選擇器六明顯地輸給了了五,其專用性值為和它在鏈中少了一個(gè)元素選擇器。
當(dāng)有多個(gè)選擇器作用在一個(gè)元素上時(shí),哪個(gè)規(guī)則最終會(huì)應(yīng)用到元素上?
其實(shí)這是通過(guò)層疊機(jī)制來(lái)控制的,這也和樣式繼承(元素從其父元素那里獲得屬性值)有關(guān)。
元素的最終樣式可以在多個(gè)地方定義,它們以復(fù)雜的形式相互影響。這些復(fù)雜的相互作用使CSS變得非常強(qiáng)大,但也使其非常難于調(diào)試和理解。
CSS 是 Cascading Style Sheets 的縮寫,這暗示層疊(cascade)的概念是很重要的。在最基本的層面上,它表明CSS規(guī)則的順序很重要,但它比那更復(fù)雜。什么選擇器在層疊中勝出取決于三個(gè)因素(這些都是按重量級(jí)順序排列的——前面的的一種會(huì)否決后一種):
在CSS中,有一個(gè)特別的語(yǔ)法可以讓一條規(guī)則總是優(yōu)先于其他規(guī)則:!important
。(常見(jiàn)于應(yīng)用于iconfont圖標(biāo)屬性后面)把它加在屬性值的后面可以使這條聲明有無(wú)比強(qiáng)大的力量。
讓我們看一下這個(gè)例子:
This is a paragraph.
One selector to rule them all!
#winning {
background-color: red;
border: 1px solid black;
}
.better {
background-color: gray;
border: none !important;
}
p {
background-color: blue;
color: white;
padding: 5px;
}
這將生成以下:
讓我們一起來(lái)看看發(fā)生了什么。
你可以看到第三條規(guī)則 color
和 padding
被運(yùn)用了, 但 background-color
沒(méi)有,為什么?實(shí)際上,這三種情況都應(yīng)該應(yīng)用,因?yàn)樵谠错樞蚝竺娴囊?guī)則通常會(huì)覆蓋較早的規(guī)則。
然而, 在前面的規(guī)則被運(yùn)用了,因?yàn)?IDs/class 選擇器優(yōu)先于element選擇器。
這兩個(gè)元素都有 class
并帶有 better
屬性, 但是第二個(gè)元素有 id
值為winning
。 因?yàn)楸绕餭lass而言id專用性更高(在一個(gè)頁(yè)面上id是唯一的, 但很多元素可以擁有相同的class — ID 選擇器在它們的目標(biāo)中是非常優(yōu)先的),紅色背景色和1pixel的黑色邊框都應(yīng)應(yīng)用于第二元素,第一個(gè)元素獲得灰色背景色,沒(méi)有邊框,如類所指定。
第二個(gè)元素獲得紅色背景色,但沒(méi)有邊框。為什么?因?yàn)?!important
在第二條規(guī)則中的聲明——在 border: none
之后寫入它意味著盡管id具有更高的優(yōu)先性,該聲明也將優(yōu)先于前面規(guī)則中的邊界值聲明。
注意: 重載這個(gè) !important
聲明的唯一方法是在后面的源碼或者是一個(gè)擁有更高特殊性的源碼中包含相同的 !important
特性的聲明。
知道 !important
存在是很有用的,這樣當(dāng)你在別人的代碼中遇到它時(shí),你就知道它是什么了。但是!我們建議你千萬(wàn)不要使用它,除非你絕對(duì)必須使用它。您可能不得不使用它的一種情況是,當(dāng)您在CMS中工作時(shí),您不能編輯核心的CSS模塊,并且您確實(shí)想要重寫一種不能以其他方式覆蓋的樣式。 但是,如果你能避免的話,不要使用它。由于 !important
改變了層疊正常工作的方式,因此調(diào)試CSS問(wèn)題,尤其是在大型樣式表中,會(huì)變得非常困難。
要注意一個(gè)CSS聲明的重要性取決于它被指定在什么樣式表內(nèi)——用戶可以設(shè)置自定義樣式表覆蓋開(kāi)發(fā)商的樣式,例如用戶可能有視力障礙,想設(shè)置字體大小對(duì)所有網(wǎng)頁(yè)的訪問(wèn)是雙倍的正常大小,以便更容易閱讀。
相互沖突的聲明將按以下順序適用,后一種將覆蓋先前的聲明:
Web開(kāi)發(fā)者的樣式表覆蓋用戶的樣式表是合理的,所以設(shè)計(jì)可以保持預(yù)期,但是有時(shí)候用戶有很好的理由來(lái)重寫web開(kāi)發(fā)人員樣式,如上所述,這可以通過(guò)在用戶的規(guī)則中使用!important
。
專用性基本上是衡量選擇器的具體程度的一種方法——它能匹配多少元素。如上面所示的示例所示,元素選擇器具有很低的專用性。類選擇器具有更高的專用性,所以將戰(zhàn)勝元素選擇器。ID選擇器有甚至更高的專用性, 所以將戰(zhàn)勝類選擇器. 戰(zhàn)勝ID選擇器的唯一方法是使用 !important
。
一個(gè)選擇器具有的專用性的量是用四種不同的值(或組件)來(lái)衡量的,它們可以被認(rèn)為是千位,百位,十位和個(gè)位——在四個(gè)列中的四個(gè)簡(jiǎn)單數(shù)字:
style
屬性中該列加1分(這樣的聲明沒(méi)有選擇器,所以它們的專用性總是1000。)否則為0。注意: 通用選擇器 (*
), 復(fù)合選擇器 (+
, >
, ~
, ) 和否定偽類 (:not
) 在專用性中無(wú)影響。
下表顯示了幾個(gè)示例。試著通過(guò)這些,并確保你理解他們?yōu)槭裁淳哂形覀兘o予他們的專用性。
選擇器 | 千位 | 百位 | 十位 | 個(gè)位 | 合計(jì)值 |
---|---|---|---|---|---|
h1 |
0 | 0 | 0 | 1 | 0001 |
#important |
0 | 1 | 0 | 0 | 0100 |
h1 + p::first-letter |
0 | 0 | 0 | 3 | 0003 |
li > a[href*="zh-CN"] > .inline-warning |
0 | 0 | 2 | 2 | 0022 |
#important div > div > a:hover , 在一個(gè)元素的 屬性里 |
1 | 1 | 1 | 3 | 1113 |
在我們繼續(xù)之前,讓我們看看一個(gè)行動(dòng)中的例子。
這是我們將要使用的HTML:
下面是CSS的示例:
/* specificity: 0101 */
#outer a {
background-color: red;
}
/* specificity: 0201 */
#outer #inner a {
background-color: blue;
}
/* specificity: 0104 */
#outer div ul li a {
color: yellow;
}
/* specificity: 0113 */
#outer div ul .nav a {
color: white;
}
/* specificity: 0024 */
div div li:nth-child(2) a:hover {
border: 10px solid black;
}
/* specificity: 0023 */
div li:nth-child(2) a:hover {
border: 10px dashed black;
}
/* specificity: 0033 */
div div .nav:nth-child(2) a:hover {
border: 10px double black;
}
a {
display: inline-block;
line-height: 40px;
font-size: 20px;
text-decoration: none;
text-align: center;
width: 200px;
margin-bottom: 10px;
}
ul {
padding: 0;
}
li {
list-style-type: none;
}
我們從這個(gè)代碼中得到的結(jié)果如下:
這里發(fā)生了什么?首先,我們只對(duì)本例的前七個(gè)規(guī)則感興趣,正如您將注意到的,我們已經(jīng)在每個(gè)注釋中包含了它們的專用性值。
如上所述,如果多個(gè)相互競(jìng)爭(zhēng)的選擇器具有相同的重要性和專用性,那么第三個(gè)因素將幫助決定哪一個(gè)規(guī)則獲勝——后面的規(guī)則將戰(zhàn)勝先前的規(guī)則。例如:
p {
color: blue;
}
/* This rule will win over the first one */
p {
color: red;
}
而在這個(gè)例子中的第一個(gè)規(guī)則將獲勝,因?yàn)閷S眯愿哂谠创a順序:
/* This rule will win */
.footnote {
color: blue;
}
p {
color: red;
}
在考慮所有這些層疊理論和什么樣式優(yōu)先于其他樣式被應(yīng)用時(shí),你應(yīng)該記住的一件事是,所有這些都發(fā)生在屬性級(jí)別上——屬性覆蓋其他屬性,但你不會(huì)讓整個(gè)規(guī)則凌駕于其他規(guī)則之上。
當(dāng)多個(gè)CSS規(guī)則匹配相同的元素時(shí),它們都被應(yīng)用到該元素中。只有在這之后,任何相互沖突的屬性才會(huì)被評(píng)估,以確定哪種風(fēng)格會(huì)戰(zhàn)勝其他類型。
簡(jiǎn)記:只有相同的屬性應(yīng)用發(fā)生沖突后才會(huì)產(chǎn)生覆蓋
讓我們看一個(gè)例子。首先,一些HTML:
I"m important
現(xiàn)在一些CSS風(fēng)格與它:
/* specificity: 0002 */
p strong {
background-color: khaki;
color: green;
}
/* specificity: 0001 */
strong {
text-decoration: underline;
color: red;
}
Result:
在這個(gè)例子中,因?yàn)閷S眯缘年P(guān)系,第一條規(guī)則中的color
屬性覆蓋掉了第二條中的顏色值。但是,對(duì)于第一條中的 background-color
和第二條中的text-decoration
的屬性都在strong
元素之中得到了體現(xiàn)。你也注意到了這個(gè)元素之中的字體是加粗的:這是瀏覽器默認(rèn)的樣式規(guī)則。
CSS繼承是我們需要研究的最后一部分,以獲取所有信息并了解什么樣式應(yīng)用于元素。
其思想是,應(yīng)用于某個(gè)元素的一些屬性值將由該元素的子元素繼承,而有些則不會(huì)。
例如,對(duì) font-family
和 color
進(jìn)行繼承是有意義的,因?yàn)檫@使得您可以很容易地設(shè)置一個(gè)站點(diǎn)范圍的基本字體,方法是應(yīng)用一個(gè)字體到 元素;然后,您可以在需要的地方覆蓋單個(gè)元素的字體。如果要在每個(gè)元素上分別設(shè)置基本字體,那就太麻煩了。
再如,讓 margin
padding
,border
和 background-image
不被繼承是有意義的。想象一下,如果您將這些屬性設(shè)置在一個(gè)容器元素上,并將它們繼承到每個(gè)子元素,然后不得不將它們?nèi)糠旁诿總€(gè)多帶帶的元素上,那么將會(huì)出現(xiàn)的樣式/布局混亂。
哪些屬性默認(rèn)被繼承哪些不被繼承大部分符合常識(shí)。如果你想確定,你可以參考CSS參考資料—— 每個(gè)多帶帶的屬性頁(yè)都會(huì)從一個(gè)匯總表開(kāi)始,其中包含有關(guān)該元素的各種詳細(xì)信息,包括是否被繼承。
注:
font-family
允許您通過(guò)給定一個(gè)有先后順序的,由字體名或者字體族名組成的列表來(lái)為選定的元素設(shè)置字體。 屬性的值用逗號(hào)隔開(kāi)。瀏覽器會(huì)選擇列表中第一個(gè)該計(jì)算機(jī)上有安裝的字體,或者是通過(guò) ‘ @font-face
指定的可以直接下載的字體。
padding
屬性設(shè)置一個(gè)元素的內(nèi)邊距,padding 區(qū)域指一個(gè)元素的內(nèi)容和其邊界之間的空間,該屬性不能為負(fù)值。
background-image
屬性用于為一個(gè)元素設(shè)置一個(gè)或者多個(gè)背景圖像。圖像在繪制時(shí),以z方向堆疊的方式進(jìn)行。先指定的圖像會(huì)在之后指定的圖像上面繪制。因此指定的第一個(gè)圖像最接近用戶。
CSS為處理繼承提供了四種特殊的通用屬性值:
inherit
: 該值將應(yīng)用到選定元素的屬性值設(shè)置為與其父元素一樣。initial
:該值將應(yīng)用到選定元素的屬性值設(shè)置為與瀏覽器默認(rèn)樣式表中該元素設(shè)置的值一樣。如果瀏覽器默認(rèn)樣式表中沒(méi)有設(shè)置值,并且該屬性是自然繼承的,那么該屬性值就被設(shè)置為 inherit
。unset
:該值將屬性重置為其自然值,即如果屬性是自然繼承的,那么它就表現(xiàn)得像 inherit
,否則就是表現(xiàn)得像 initial
。revert
:如果當(dāng)前的節(jié)點(diǎn)沒(méi)有應(yīng)用任何樣式,則將該屬性恢復(fù)到它所擁有的值。換句話說(shuō),屬性值被設(shè)置成自定義樣式所定義的屬性(如果被設(shè)置), 否則屬性值被設(shè)置成用戶代理的默認(rèn)樣式。注意: initial
和 unset
不被IE支持。
initial
是將屬性的初始值( initial value)賦給元素 . initial 適用于所有的css 屬性(屬性的initial值可在屬性表中查到),包括css 簡(jiǎn)寫屬性(全局屬性)all.
inherit
值是最有趣的——它允許我們顯式地讓一個(gè)元素從其父類繼承一個(gè)屬性值。
讓我們看一個(gè)例子。首先有以下一段HTML:
現(xiàn)在用CSS給它添加樣式:
body {
color: green;
}
.inherit a {
color: inherit;
}
.initial a {
color: initial
}
.unset a {
color: unset;
}
Result:
讓我們解釋這里發(fā)生了什么:
的color
為綠色。color
屬性是自然繼承的,所有的body子元素都會(huì)有相同的綠色。需要注意的是默認(rèn)情況下瀏覽器設(shè)置鏈接的顏色為藍(lán)色,而不是自然繼承color屬性,因此在我們列表中的第一個(gè)鏈接是藍(lán)色的。inherit
的元素內(nèi)的鏈接,并從父類繼承它的顏色。在這種情況下, 意思是說(shuō)鏈接繼承了父元素
的顏色,默認(rèn)情況下
的顏色來(lái)自于它的父元素
, 最后
繼承自
元素,而
的color
根據(jù)第一條規(guī)則設(shè)置成了綠色。initial
的任意鏈接然后設(shè)置他們的顏色為 initial
。通常, initial
的值被瀏覽器設(shè)置成了黑色,因此該鏈接被設(shè)置成了黑色。unset
的所有鏈接然后設(shè)置它們的顏色為 unset
——即我們不設(shè)置值。因?yàn)閏olor屬性是一個(gè)自然繼承的屬性,它實(shí)際上就像把值設(shè)置成 inherit
一樣。結(jié)果是,該鏈接被設(shè)置成了與body一樣的顏色——綠色。CSS速寫屬性 all
能夠被應(yīng)用到每一個(gè)繼承屬性,一次性應(yīng)用所有的繼承屬性。這里的值可以是繼承屬性里的任何一個(gè) (inherit
, initial
, unset
, or revert
)。對(duì)于撤銷對(duì)樣式的修改,這是非常方便的一種方式。然后你就可以在開(kāi)始新的修改之前,返回到一個(gè)已知的開(kāi)始點(diǎn)。
全文摘要自MDN網(wǎng)絡(luò)開(kāi)發(fā)者網(wǎng)站
end
2018-5-31 周四
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/2195.html
摘要:為了解決沖突,確定哪條規(guī)則勝出并最終被應(yīng)用,提供了三種機(jī)制繼承層疊和特指。整個(gè)檢查更新過(guò)程結(jié)束后,再將每個(gè)標(biāo)簽以最終設(shè)定的樣式顯示出來(lái)。層疊規(guī)則四順序決定權(quán)重。規(guī)則三設(shè)定的樣式勝過(guò)繼承的樣式,此時(shí)不用考慮特指度即顯式設(shè)定優(yōu)先。 為了解決沖突,確定哪條規(guī)則勝出并最終被應(yīng)用,CSS提供了三種機(jī)制:繼承、層疊和特指。 1.繼承 CSS 中的祖先元素會(huì)向后代傳遞一樣?xùn)|西:CSS屬性...
摘要:計(jì)算屬性的計(jì)算值通常包括將相對(duì)值轉(zhuǎn)換成絕對(duì)值如單位或百分比。返回的解析值可能是計(jì)算值或應(yīng)用值。最后,計(jì)算布局尺寸比如或百分?jǐn)?shù)換算為像素值,結(jié)果即應(yīng)用值。繼承當(dāng)元素的一個(gè)繼承屬性沒(méi)有指定值時(shí),則取父元素的同屬性的計(jì)算值。 css屬性 我覺(jué)得大部分學(xué)習(xí)前端的人應(yīng)該都沒(méi)有按照教科書一般的來(lái)學(xué)習(xí)css,可能是類似搭積木一樣,需要什么拿什么,所以可能最對(duì)一些基本的概念沒(méi)有很好的理解,這里列出的是...
摘要:相反的,提供了全局作用域和局部作用域。組成界面的分子的樣式可以通過(guò)元素選擇器定位。元素選擇器的優(yōu)先級(jí)很低,因此他們不會(huì)覆蓋任何基于類選擇器的樣式。使用元素選擇器有以下優(yōu)點(diǎn)避免了的冗長(zhǎng)沒(méi)有冗余的類。 最近學(xué)習(xí)到CSS的繼承屬性,正好看到這篇文章,便將它翻譯出來(lái)。作者的思想,在平時(shí)的項(xiàng)目中或多或少都有用過(guò),但是從來(lái)沒(méi)有仔細(xì)去思考如何利用這些特性讓代碼更加優(yōu)雅。 我熱愛(ài)模塊化設(shè)計(jì)。長(zhǎng)期以來(lái),...
摘要:,高級(jí)選擇器后代選擇器空格表示后代選擇器就是的后代所有的。注意是后代,并不一定是兒子空格可以出現(xiàn)多次補(bǔ)充后代選擇器中出現(xiàn)的東西很靈活,可以是標(biāo)簽,可以是名,可以是名后代選擇器,就是一種平衡共性特性的平衡。 一,選擇器 1,基礎(chǔ)選擇器 1) 標(biāo)簽選擇器:div{ } ,選擇的所有,而不是一個(gè),用來(lái)描述共性。 2) 類選擇器:.class名{ } 多個(gè)元素可以同時(shí)屬...
摘要:我們知道字體屬性在任意時(shí)刻都只能應(yīng)用一種設(shè)定那此時(shí)該應(yīng)用哪種字體呢為解決類似的沖突確定哪條規(guī)則勝出并最終被應(yīng)用提供了三種機(jī)制繼承層疊和特指。層疊規(guī)則層疊規(guī)則一找到應(yīng)用給每個(gè)元素和屬性的所有聲明。層疊規(guī)則五設(shè)定的永遠(yuǎn)大于繼承的。 在一個(gè)較大的樣式表中,可能會(huì)有很多條規(guī)則都選擇同一個(gè)元素的同一個(gè)屬性。比 如,一個(gè)帶有類屬性的段落,可能會(huì)被一條以標(biāo)簽名作選擇符的規(guī)則選中并指定一 種字體,而另...
閱讀 768·2021-11-15 11:37
閱讀 3394·2021-10-27 14:14
閱讀 6438·2021-09-13 10:30
閱讀 3035·2021-09-04 16:48
閱讀 2030·2021-08-18 10:22
閱讀 2198·2019-08-30 14:19
閱讀 823·2019-08-30 10:54
閱讀 1806·2019-08-29 18:40