繼承──頁面重構中的子產品化設計(三)
由 Ghostzhang 發表于 2010-04-16 13:24
前面我們了解了 樣式的作用域的分類 和 欄目級作用域 。在權值中,還有一個很重要的因素,需要做下補充,起因是這樣的,有個同學在CSS森林群裡問了個問題:根據樣式權值兩個關鍵的因素
- 權值的大小跟選擇器的類型和數量有關
- 樣式的優先級跟樣式的定義順序有關
可以知道,如果10個标簽選擇器的權值應該比一個類選擇的權值高,像這樣:
div div div div div div div div div div div{color:blue;}
.c10{color:red;}
複制
<div class="c1">
<div class="c2">
<div class="c3">
<div class="c4">
<div class="c5">
<div class="c6">
<div class="c7">
<div class="c8">
<div class="c9">
<div class="c10">
<div>這段文字是什麼顔色?</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
複制
先别急着看 答案 ,分析下。意料之中?如果 這樣 呢?
div{color:blue;}
.c10{color:red;}
複制
是不是跟想的不太一樣?難道前面所說的權值是有問題的?前面講的權值并沒有問題,不過漏了一個重要的規則: 繼承的權值小于0,0,0,1 。
樣式的繼承指被包在内部的标簽将擁有外部标簽的樣式性質。
繼承最大的意義在于可以減少重複的定義,比如要定義整個頁面的文本顔色,隻需要定義body的color樣式,body裡的所有标簽都會繼承body的color定義。是不是很友善?友善是相對的,當你想要為body内部分标簽定義另一種文本顔色時,繼承也許會成為增加重複定義、降低性能的禍首。
并不是所有的樣式定義都具有繼承的性質,整理了一下常用有繼承性的定義1,這些定義在使用的時候要比較注意。
簡單分析下上面的例子,最後一部分的代碼:
<div class="c10">
<div>這段文字是什麼顔色?</div>
</div>
複制
當定義了c10後,根據權值,類定義的權值是0,0,1,0,應該是比div這個定義0,0,0,1要高的,但由于div是直接定義到标簽上的,比起從c10的定義中繼承來的定義權值更高。稍微改下就清楚了:
效果展示
從 修改後的例子 可以看到,p标簽繼承了c10的定義,顯示為紅色。是以,在使用标簽選擇器的時候,應特别注意它的作用域,個人的建議是,除了最基本的reset之外,在公共作用域中最好不要使用标簽選擇器,在欄目級作用域中也應盡可能的少用。
常用有繼承性的樣式定義:
- ext-indent
- ext-align
- ayout-flow
- writing-mode
- ine-break
- white-space
- word-wrap
- ist-style
- ist-style-image
- ist-style-position
- ist-style-type
- font
- font-style
- font-variant
- font-weight
- font-size
- ine-height
- font-family
- color
- ext-transform
- etter-spacing
- word-spacing