CSS (Cascading Style Sheets) 規則結構:
selector { property: value; property2: value2; }
範例:body { color: blue; } → 選擇器 body,聲明 color: blue。
#id)
#red { color: red; }
#green { color: green; }
HTML:<p id="red">紅字</p> <p id="green">綠字</p>
常用於建立派生選擇器:#sidebar p { font-style: italic; }
.class)
.center { text-align: center; }
.fancy td { color: #f60; background: #666; } /* 後代選擇器 */
td.fancy { color: #f60; background: #666; } /* 元素+類別 */
#id (100) > .class (10) > tag (1) — 權重計算基礎.a .b .c (30) > .b .c (20) > .c (10)span#id (101) > #id (100);span.class (11) > .class (10)來源優先序 (同權重時):行內樣式 > 內部樣式表 (<style>) > 外部樣式表 > 瀏覽器預設。
CSS 文字/檔案
↓
[詞法分析器] → Token 流 (SELECTOR, LBRACE, PROPERTY, COLON, VALUE, RBRACE, ...)
↓
[語法分析器] → CSSRule 物件樹 (Selector + DeclarationList)
↓
[選擇器解析器] → Selector 物件 (支援簡單選擇器、後代、子代、群組)
↓
[樣式引擎] → 對 DOM 節點計算最終樣式 (Cascade + Inheritance + Specificity)
↓
[佈局/渲染引擎] → 視覺呈現
// 輕量級 Token
class CSSToken {
int type; // SELECTOR, PROPERTY, VALUE, ...
String text;
int line, col;
}
// 選擇器 (簡化版,支援基本組合)
class CSSSelector {
String tagName; // null = 通用 *
String id; // #id
Vector classes; // .class1 .class2
CSSSelector parent; // 後代關係
CSSSelector child; // 直接子代關係 (可選)
int specificity; // 權重分數 (預計算)
boolean matches(Element elem) { ... } // 判斷元素是否匹配
}
// 規則
class CSSRule {
CSSSelector selector;
Hashtable declarations; // property → value (String)
int sourceOrder; // 來源順序 (用於同權重仲裁)
}
// 樣式表
class StyleSheet {
Vector rules; // CSSRule 列表,已按 specificity+sourceOrder 排序
Hashtable computeStyle(Element elem) {
Hashtable style = new Hashtable();
// 1. 瀏覽器預設樣式 (UA stylesheet)
// 2. 遍歷 rules,match 者合併 declarations
// 3. 處理繼承屬性 (color, font-size 等)
return style;
}
}
String.intern() 或整數常數映射specificity、編譯匹配邏輯為位元組碼或決策樹@import、動態插入 <style> 時局部更新| 類別 | 屬性 (支援優先級) |
|---|---|
| 顏色/背景 | color, background-color, background-image (HTTP 載入) |
| 字體/文字 | font-family (映射系統字體), font-size (pt/px/em/% → 像素), font-weight, font-style, text-align, text-decoration, line-height |
| 盒模型 | width, height, margin, padding, border (width/style/color), display (block/inline/none) |
| 定位 | position (static/absolute/relative), top/right/bottom/left, z-index, float, clear |
| 視覺格式 | overflow (visible/hidden/scroll), clip, visibility |
| 難點 | 對策 |
|---|---|
| CSS 語法錯誤容錯 | 採用「寬容解析」:跳過無效聲明、不匹配大括號自動修正、未知屬性/值忽略 |
| 相對單位換算 (em, %, pt) | 建立 StyleContext 提供父元素 font-size、容器寬高、裝置 DPI 基準 |
| 繼承與預設值計算 | 分兩階段:1. 級聯合併 (Cascade) 2. 遞歸繼承補全 (Inheritance) + 初始值填充 |
| 背景圖片非同步載入 | 解析階段記錄 URL,渲染階段啟動背景下載,完成後觸發局部重繪 |
| 效能:大量元素樣式計算 | 快取匹配結果 (Selector → ElementSet);脏標記機制僅重算變更子樹 |