css樣式在html中有三種存在形態:
內聯樣式:<div style="display: none"></div>
內部樣式: <style></style>
外聯樣式:<link href="" />
三者的優先級為:內聯樣式>內部樣式>外聯樣式。
你可能會對內部樣式和外聯樣式的優先級產生懷疑。反正我懷疑過,是不是兩者的先后順序不同會產生覆蓋?當然經過測試,完全沒有這種情況。~至於原理,我覺得是和渲染機制有關。
分割線~其實以上都是基礎知識,下面才是要講的重點。
我們知道,在js中修改節點的長、寬、背景色等等樣式屬性是很常見的操作。比如
var targetObj = document.getElementById("test"); targetObj.style.width = "100px";
如果targetObj本身就已經設定了寬度。在js中通過target.style.width去讀取那個既定寬度時,會出現:當寬度是在內聯中定義可以讀取到,如果寬度不是在內聯中定義,targetObj.style.width返回的就是一個空串。
總結:
targetObj.style.width去獲取的應該是在內聯中定義的寬度,如果寬度定義在非內聯中,永遠不會獲取到值,盡管你看到元素在瀏覽器中呈現得有長有高的;
通過js代碼動態添加targetObj.style.width的優先級是最高的,但是你可以理解為它是添加到內聯樣式中,而事實也確實是如此。其實對於這句話其實還可以再補充一點點。對於targetObj.className = "newStyle",設置類設置新樣式的手段,請務必保證添加的類的樣式有足夠高的優先級,否則將看不到任何效果。你可以在.newStyle的樣式屬性定義中增加!important,提高優先級,但是這樣在ie6中不奏效,反而需要用帶下划線的屬性另外定義(hack技術)。我采用的方法基本是通過給.newStyle增加id標簽來提高其優先級。比如(#name li.newStyle和.newStyle相比,優先級不知高了幾個檔次),而且所有瀏覽器都支持。
探索到這里,還可以繼續探索下去,對於樣式操作,有沒有更有效的方式?cssText,提供了批量處理功能,
詳見另一篇博文:http://www.cnblogs.com/Iwillknow/p/3691490.html