比如我有如下CSS代码:
.red {
background-color: red;
}
table {
background-color: yellow;
}
<table>
<tr>
<td>123</td>
<td>123</td>
</tr>
<tr>
<td>123</td>
<td class="red">123</td>
</tr>
</table>
解析CSS的时候先找到class="red"
,把那个td
设置成红色,然后找到table
,把table
设置成黄色,同时他又能分辨出class="red"
那个td
,并且不会覆盖它,这是怎么做到的?是不是每个规则都会去看之前解析的规则是否匹配了。
比如有n个dom,m个规则,每个dom都要去从这m个规则中找是否匹配,这个匹配的算法是什么样的呢?会把所有的css规则生成一棵树然后每个dom在树上查找,还是会用其他查找算法呢?这篇文章讲了一些,求高人解惑:http://calendar.perfplanet.com/2011/css-selector-performance-has-changed-for-the-better/
Actually, it’s not as complicated as you said. It’s just a matter of priority and inheritance
Inheritance: If a style that can be used for inheritance is set on the parent element, but the same style is not defined on the child element, it will be directly inherited from the parent element, such as
font-size
,background
, etc.; some styles It cannot be inherited, such asborder
,padding
, etc.;Priority: If multiple selectors are set for the same element in the style sheet to operate it, then in the case of the same priority, the last one set will overwrite all the previous settings, and the element itself sets Style priority will also be higher than inherited styles;
Tell me about the rules of priority:
id
The selected priority is 0 1 0 0class
The selected priority is 0 0 1 0ele
The selected priority is 0 0 0 1Here I just mentioned three common priorities. For more priority rules, LZ can check out
css权威指南(第二版)
;Back to your question, if
table
sets the background color, the sub-elementtd
will inherit it directly. However, atd
is set for a certainclass="red"
, according to the above priority Level rules, othertd
have no priority, they just inherit the style oftable
, and the priority of thisclass="red
oftd
is0010
, has the highest priority, so apply it;One last thing to add: Even if the sum of priorities is greater than 10, it will not move forward, just like:
0 0 1 0
is greater than0 0 0 15
The easiest way is to find an open source code and take a look, such as webkit.
1. HTML
2. CSS
The blogs I recommended above are all series. If you are interested, you can read other articles by the way.
Hope it helps.
The w3c standard will only tell you what algorithm to use to achieve this and leave it to the browser, such as the v8 engine