閱讀429 返回首頁    go 阿裏雲 go 技術社區[雲棲]


w3c係列之CSS(三):CSS屬性是如何被應用到元素上的

w3c上第五章是講CSS選擇器的,可以去看精通CSS係列之選擇器。本文講的是第六章(Assigning property values, Cascading, and Inheritance)

當瀏覽器為獲取到的網頁文檔生成了document tree時,接下來要做的就是為每一個元素應用樣式了

瀏覽器在計算樣式值的時候一般會經過以下四步計算:

STEP1.優先使用指定屬性值(the "specified value")

首先使用指定的值(the "specified value"),比如下麵這段文檔中p的font-size為例:

<body>
    <p>hello</p>
</body>
使用指定值時瀏覽器會遵循以下機製:

1.如果能通過層疊規則得到font-size的值,就直接用該值。顯然上麵沒有任何CSS代碼,所以無法利用cascade層疊規則;

2.如果沒有指定,而且該屬性可以繼承,並且該元素不是文檔樹的根元素,那麼就使用從父元素那邊繼承下來的值(這時候的值不叫"specified value"了,而是"computed value")。顯然,font-size屬性可以繼承,並且p元素也不是文檔樹的根元素,但是p的父元素也沒有指定值啊!這沒法計算啊!

3.如果上麵的條件都不滿足,就使用屬性的初始值。屬性的初始值在屬性定義的時候就給出了。font-size的默認值為medium,所以這裏的hello字體大小應該為medium。不過這個medium到底是多大啊?個人認為應該就是UA設置的默認字體大小。理由:chrome中默認字體16px,而font-size:medium和font-size:16px效果完全相同。

STEP2.使用計算值 (the "computed value")

每個元素都應該有確定的屬性,如果沒有指定屬性值,那麼就隻有按照一定的規則來計算出來值了。這種規則就是基於繼承的規則。比如設置body{font-size:0.104in;},那麼p的font-size經過計算也是0.104in。所以隻要不是直接指定元素的屬性值,都會使用到計算值。

這裏就有個疑問了:上麵的font-size:medium其實也沒有具體的,最終結果呈現為font-size:16px是不是也是經過計算的呢?個人認為這應該算是瀏覽器內部設置的默認樣式,並不算是一種計算值。

STEP3.得到使用值(the "used value")

由於使用媒體的不同,計算後的值通常要轉成適用於目標媒體的“絕對值”,使之能用確實地在目標媒體上使用,我們稱之為“used value”。比如要在屏幕上顯示0.104in,因為現在的電腦屏幕都是按像素尺寸算的,所以需要將in轉化為px才能顯示(由於不同屏幕的ppi不同, 所以最終看到的長度有可能不一樣)。

0.104in大概等於10px,所以得到的使用值為10px。

使用值就是完成計算值以及確定相關依賴之後得到的適用於目標媒體的值。完成計算值不用說了,那什麼叫做確定相關依賴呢?比如你設置一個box的高度為50%,那麼這個值隻有在其父元素的高度確定之後才能計算,這就是相關依賴。

STEP4.根據實際環境應用實際值(the "actual value")

搞了這麼久,終於要應用到生產了,這裏還有一個環境限製。我們之前得到的font-size使用值為10px,是不是意味著最終就能讓p標簽的文字以10px大小顯示呢?當然不是,chrome所能設置的最小字體為12px,所以最終我們看到的並不是font-size:10px效果,而是font-size:12px,這就是環境限製。


上麵4步隻是應用屬性值得一個大概步驟,其實在得到指定值時需要考慮許多因素,比如UA,用戶,以及作者樣式間關係,以及各選擇器優先級之間的關係。有關優先級的問題在精通css(3)-優先級那些事兒裏已經寫的很清楚了,這裏就不贅述了。
看完這章總體上對CSS屬性值的設定流程有了大致的了解,更加深入的內容後續滿滿呈上。



最後更新:2017-04-03 05:40:06

  上一篇:go winhex中判斷+MBR+DBR+EBR方法
  下一篇:go 點滴的積累---J2SE學習小結