一、繼承
某些元素會自動繼承其父元素的計算值
舉例:
<p>
This is a <em>test</em> of <strong>inherit</strong>.
</p>
<style>
p { color: #666; }
</style>
複製程式碼
上述程式碼,em
標籤裡的color
就會繼承父元素的color
,為color: #666
。
顯示繼承
* {
/* 給box-sizing設定顯示繼承 */
box-sizing: inherit;
}
html {
box-sizing: border-box;
}
.some-widget {
box-sizing: content-box;
}
複製程式碼
html根元素下所有元素(除獨自設定:如.some-widget
)的box-sizing
都是border-box
。
二、初始值
當向上繼承到頂點還是沒找到值的話,就需要初始值了。
- CSS 中,每個屬性都有一個初始值
background-color
的初始值為transparent
透明margin-left
的初始值為 0- 可以顯式重置為初始值,比如
background-color: initial
三、CSS求值過程
- filtering:通過樣式規則為dom樹種的各個元素進行選擇器匹配,匹配有效的屬性值,匹配當前媒體查詢
media
等等,比如當使用者列印時,載入media是列印樣式的css樣式,生成的宣告值可能會有一個或多個,比如一個p標籤匹配到了兩個選擇器p{ font-size: 16px }
,p.text{ font-size: 1.2em }
- cascading:用過對比選擇器的特異性,選出優先順序最高的一個選擇器,生成層疊值,比如1.2em
- defaulting:判斷層疊值是否為空,如果為空,使用繼承或者初始值,生成指定值,保證指定值一定不為空。
- resolving:將相對值計算成絕對值,比如em轉化成px,相對路徑轉化成絕對路徑等,生成計算值( computed value :在瀏覽器不進行實際佈局時,得到的具體的值)
- formatting: 有些值不能靜態計算出來的,比如有些值需要渲染之後才能獲得,如vh,vw,百分比這種,得到使用值
- 將小數畫素值轉為整數,比如
width:400.2px
,轉化成width: 400px
,生成實際值,css求值完畢
3.1 舉個栗子?
求strong標籤裡的font-size值?
<article>
<p>卡爾斯巴德洞窟(Carlsbad Caverns)是美國的一座國家公園,
位於新墨西哥州東南部。遊客可以通過天然入口徒步進入,也可以
通過電梯直接到達<strong>230米</strong>的洞穴深處。</p>
</article>
<style>
body {
margin: 0;
}
article {
font-size: 14px;
line-height: 1.6;
}
p {
font-size: 1.1em;
}
</style>
複製程式碼
匹配strong標籤的選擇器,沒有,則使用繼承值或者初始值,strong標籤的父級是p標籤,相對值為font-size: 1.1em
,因為font-size: 1.1em
是相對值,不能直接渲染到頁面裡,找到p的父級article
的font-size: 14px
,然後將相對值轉化為絕對值font-size:15.4px
,在將絕對值轉化成整數值font-size:15px
,求出strong標籤裡font-size: 15px
。
3.2 再來一個栗子?
下面這坨程式碼有沒有什麼問題?
<article>
<h1>卡爾斯巴德洞窟</h1>
<p>卡爾斯巴德洞窟(Carlsbad Caverns)是美國的一座國家公園,
位於新墨西哥州東南部。遊客可以通過天然入口徒步進入,也可以
通過電梯直接到達230米的洞穴深處。</p>
</article>
<style>
body {
margin: 0;
}
article {
line-height: 150%;
}
h1 {
font-size: 40px;
}
p {
font-size: 14px;
}
</style>
複製程式碼
演示:
bug:h1中的文字會重疊
由於h1中沒有line-height
這個屬性,他會繼承向上找父級<article>
的line-height:150%
,是個相對值,所以要乘<article>
的line-height
計算值,在向上繼承<html>
的line-height:16px
(瀏覽器預設),所以最後的實際值是24px,本身字型是40px,所以折行時會重疊。
如何解決這個問題呢?
把150%改成1.5
對於百分數,會在resolving中轉換,把150%轉化成24px,但是設定行高為1.5,他會在resloing找到article的line-height
為1.5,然後在formatting中將1.5乘以自己ling-height得到60px。