← 🔷 SVG × CSS:一块能被 CSS 管的画布 / presentation attribute 优先级 待审核 3 / 9
attr ↔ CSS · 枢纽 ★

presentation attribute 优先级

SVG 里写的 fill="red" 看似是 HTML 属性,其实是一个 presentation attribute——它等价于一条特指度为 0 的样式,位于整条优先级链的最底层。所以任何一条普通 CSS 规则都能覆盖它。这正是「CSS × SVG」的核心:上色 / 描边属性几乎都同时是 XML 属性和 CSS 属性,优先级由 cascade 决定。

1 · 四层优先级阶梯

同一颗心,从底层往上逐个打开开关。当前生效层会高亮,颜色由 getComputedStyle 实测得出,而非预先写定:

来源 写法 特指度 / 优先级
presentation attribute <path fill="red"> 最低 (相当于默认值)
外部 / 内部 CSS 规则 .icon { fill: blue } 按选择器特指度
inline style 属性 style="fill: green" 高于普通规则
!important .icon { fill: orange !important } 最高 (压过 inline)

2 · geometry property:连 cx / r / d 都成了 CSS 属性

历史上 cx/cy/r/x/y/width/d 这些几何属性只能写成 XML attribute、CSS 够不着。现代浏览器把它们升级成了真正的 CSS property——于是能 transition、能媒体查询、能 :hover 改。下面这个圆的 rcx 完全由 CSS 过渡:

3 · currentColorvar():主题化图标的两个关键工具

currentColor 是 custom property 出现之前就存在的「CSS 变量」:fill="currentColor" 会取宿主的 color。而 CSS var(--brand) 不仅能进入 SVG,还能穿透 <use> 的 shadow boundary——同一个 sprite 被 <use> 克隆多次,每个实例给不同的 --brand / color,即可得到不同主题。改下面的颜色试试:

实践要点: 图标换色不必为每种颜色导出一份 SVG。一份 sprite + fill="currentColor"(跟随文字色)或 fill="var(--brand)"(跟随主题变量),<use> 处处克隆,颜色全部交给 cascade——这就是现代图标系统的常规做法。