總結了部分所學、所聽、所看、所問的一些CSS寫作經驗,書寫高效的CSS - 漫談CSS的渲染效率,它們與渲染效率及所佔用消耗的資源有一定的關聯。部分為自己理解所寫,不排除會有錯漏,歡迎提供更好的意見。
1、十六進位的顏色值對位數與大小寫
編寫十六進位顏色值時你可能會用小寫字母或省略成3位數,關於這寫法沒找到確實的數據證明對瀏覽器的渲染效率是否有影響,但十六進制的顏色值默認標準是大寫及6位數標註。在未知情況下不希望冒險而降低了渲染的效率。
* 不贊成- color:#f3a;
* 建議用- color:#FF33AA;
2、display與visibility的差異
他們用於設定或檢索是否顯示物件。 display隱藏物件不保留實體空間,visibility為隱藏物件保留佔據的實體空間。當瀏覽器渲染被佔據的實體空間時,就會有所消耗資源。
* 不贊成- visibility:hidden;
* 建議用- display:none;
3、border:none;與border:0;的差別
和display與visibility的關係類似,分別不保留與保留空間。更多的是border:0;儘管可以隱藏掉邊框,但它會為你保留border-color/border-style的使用權。
* 不贊成- border:0;
* 建議用- border:none;
4.不宜過小的背景圖片平鋪
一張寬高1px的背景圖片,雖然檔案體積非常之小,但渲染寬高500px的板塊需要重複平鋪2500次。提高背景圖片渲染效率跟圖片尺寸及體積有關,最大的圖片檔案體積保持約70KB。
* 不贊成- 寬高8px以下的平鋪背景圖片
* 建議用- 衡量適中體積及尺寸的背景圖片
5、IE的濾鏡
IE的濾鏡除了比較消耗資源外也有相容性問題。當中有令PNG透明的濾鏡,可採用GIF或JPG似透非透的辦法來避免使用此濾鏡。建議只在IE6應用GIF透明,因為IE7以上已經支援了PNG透明。
* 不贊成,濫用IE濾鏡因為消耗資源外也有相容性問題。
* 建議用,最好選擇其它方法能避免使用濾鏡。
6、*{ margin:0; padding:0;}避免瀏覽器樣式差異
*號通配符把所有標籤都初始化一遍,瀏覽器的渲染消耗一定的資源。有部分在標籤在不同瀏覽器上幾乎無差異,或是某些已經不建議使用的標籤(因為你不會去用它),它們不需通配符要重新初始化一遍這樣做能節省一點資源。
* 不贊成,使用*號通配符
* 不贊成,div span button b table等標籤納入通配符控制內外填滿樣式
* 建議用,選擇性地使用通配符控制內外填充樣式。
7.不要增加額外的標籤來描述class或id
如果你有一個選擇器是以id作為關鍵選擇符,請不要添加多餘標籤名稱上去。因為ID是唯一的,你不要為了一個不存在的理由而降低了配對的效率。
* 不贊成- button#backButton { }
* 不贊成- .menu-left #newMenuIcon { }
* 建議用- #backButton { }
* 建議用- #newMenuIcon { }
8.盡量選擇最特殊的類別來存放選擇器
降低系統效率的一個最大原因是我們在標籤類別中使用了過多的選擇符。透過加入class 到元素,我們可以將類別進行再細分為class 類,這樣就不用為了一個標籤浪費時間去匹配過多的選擇符了。
* 不贊成- treeitem[mailfolder="true"] > treerow > treecell { }
* 建議用- .treecell-mailfolder { }
9.避免子孫選擇符
子孫選擇符是CSS中最耗資源的選擇符。他真的是非常的耗資源,尤其是在選擇器使用標籤類別或通用類別的時候。很多情況中,我們真正想要的是子選擇符。除非有明確說明,在UI CSS 中是嚴禁使用子孫選擇符的。
* 不贊成- treehead treerow treecell { }
* 好一點,但還是不行(參考下一條) - treehead > treerow > treecell { }
10.標籤類別中不要包含子選擇符
不要在標籤類別中使用子選擇符。否則,每次元素的出現,都會額外增加匹配時間。 (特別是當選擇器似乎多半會被匹配的情況下)
* 不贊成- treehead > treerow > treecell { }
* 建議用- .treecell-header { }
11.留意所有子選擇符的使用
小心地使用子選擇符。如果你能想出一個的不使用他的方法,那就不要使用。特別是在RDF 樹和選單會頻繁地使用子選擇符,像這樣。
* 不贊成- treeitem[IsImapServer="true"] > treerow > .tree-folderpane-icon { }
請記住RDF 的屬性是可以在模板中被複製的!利用這一點,我們可以複製那些想要基於該屬性改變的子XUL 元素上的RDF 屬性。
* 建議用- .tree-folderpane-icon[IsImapServer="true"] { }