That is determined by specificity. In this case, since they are both equally specific, the declaration that comes last in the file, wins.
Specificity Calculation
Specificity is calculated by ranking the different parts of the selector.
Ranked from most specific to least:
- Style attribute - If the rule is found in a style attribute, this rank gets 1.
- ID - For each ID found in the selector, this rank gets an additional 1.
- Classes, Pseudo-Classes, Attribute selectors - For each one found in the selector, this rank gets an additional 1.
- Elements - For each element found in the selector, this rank gets an additional 1.
Where rank n > rank n+1
, regardless of how many points each rank has.
Example
ul#nav li.active a
The points are:
- 0 - Not a style attribute.
- 1 - 1 ID found.
- 1 - 1 Classname found.
- 3 - 3 Elements found.
Therefore, each property in that selector has a specificity value of [0,0,1,1,3]
(We'll get to that extra zero in a minute). That value is more specific than any selector, as long as it might be, without an ID, for example.
Comparison algorithm:
- Go from left to right on the ranks.
- Compare the ranks on both selectors.
- The rank with the higher amount of point, wins.
- If the ranks are equal, continue right to the next (less specific) rank.
- If all ranks are equal, the one which comes later in the CSS document, wins.
More important notes:
- The universal selector
(*)
has no specificity value (0,0,0,0) Pseudo-elements (e.g. :first-line
) get 0,0,0,1
unlike their
pseudo-class brethren which get 0,0,1,0
- The pseudo-class
:not()
adds no specificity by itself, only what's inside it's parentheses.
- The
!important
directive can be applied on a single declaration, and adds a point to a "0th" rank, which is more specific than anything
else. So in the example above, adding !important
on any rule will
bump the specificity value for that rule only to [1,0,1,1,2]
,
granting it an instant win over any other rules without !important
.
Extra Reference
See this great article on the subject
How to determine which styles go to what element
The way the browser does it, is to go over the selector from right to left, and filtering elements out of the DOM as they go.
Going back to the previous example:
ul#nav li.active a
The browser does the following:
- Take an
a
element.
- Now check if it has an ancestor that is a
li
element with an .active
class (this is through the descendant combinator: ancestor descendant
).
- Now check if it has a higher ancestor that is a
ul
with an ID of #nav
(again, the descendant combinator is used).
If all these conditions are met for a certain element, then the styles are applied to it.
You can read it:
Select any a
element
with an ancestor with a class of .active
, which is also a li
,
which in turn has an ancestor with an ID of #nav
, which is also a ul
.
You'll need to have a fully function and complete DOM tree to be able to successfully determine which element has what CSS styles.