Table of contents
Introduction to CSS specificity
CSS ( cascading style sheets) is the backbone of web design, allowing developers to define how HTML elements should appear on a web page. However, when multiple CSS rules target the same elements, how does the browser decide which style to apply? The answer lies in CSS specificity —a fundamental concept that ensures a predictable and logical application of styles.
Specificity can be thought of as a scoring system that determines the “weight” or importance of a CSS rule. it is used by browsers to resolve conflicts between competing styles. This mechanism is crucial for maintaining control over your design, especially in large projects where multiple stylesheets or frameworks are involved.
For example, you might encounter a situation where one rule sets the color of a <p>
tag to blue, while another rule changes it to green. Why does the browser apply one rule over the other? This hierarchy is established by the specificity algorithm.
Understanding CSS specificity is essential for :
Avoiding unexpected behavior in your design.
Writing clean and maintainable styles.
Debugging issues efficiently when styles don’t appear as intended.
Let’s consider a simple example:
<p id="intro" class="highlighted">Hello, World!</p>
Here are the possible CSS rules targeting this paragraph :
p {
color: blue;
} /* Element selector */
.highlighted {
color: green;
} /* Class selector */
#intro {
color: red;
} /* ID selector */
The browser will apply the red color because the #intro
selector has a higher specificity than the .highlighted
class or the <p>
element selector. This prioritization allows developers to finetune the styling of individual elements without conflicts.
How the Specificity Algorithm works
In simple terms , css specificity is a set of rules that determines which css style tales precedences when multip;e rles target the same html element. It acts like a scoring system where each rule gets a “specificity score,” and the rule with the highest score is applied.
The CSS specificity algorithm calculates a score for each selector to determine which style gets applied when multiple selectors target the same element, where selectors with higher specificity override those with lower specificity.
The Point System
Specificity is calculated by assigning values based on the types of selectors used:
Inline styles": 1000 points
- Example:
style="color: red;"
directly within an HTML element.
- Example:
ID Selectors:
100
points per ID- Example:
#header
- Example:
Class Selectors, Attributes, and Pseudo-classes:
10
points per selector- Examples:
.button
,[type="text"]
,:hover
- Examples:
Element Selectors and Pseudo-elements:
1
point per selector- Examples:
div
,h1
,::after
- Examples:
Example Specificity Calculation
Consider the following CSS:
h1 { color: blue; } /* Specificity: 0,0,0,1 */
.highlight { color: green; } /* Specificity: 0,0,1,0 */
#main { color: red; } /* Specificity: 0,1,0,0 */
For the HTML:
<h1 id="main" class="highlight">Hello!</h1>
h1
(specificity0,0,0,1
) applies blue..highlight
(specificity0,0,1,0
) overrides with green.#main
(specificity0,1,0,0
) has the highest specificity and applies red.So, here
.highlight
overridesh1
and #main overrides bothh1
and.highlight
.
More Examples
Example 1: Combining Selectors
<div id="main" class="box">
<p class="highlight">Welcome!</p>
</div>
p { color: blue; } /* Specificity: 0,0,0,1 */
.box .highlight { color: green; } /* Specificity: 0,0,2,0 */
#main .box .highlight { color: red; } /* Specificity: 0,1,2,0 */
Specificity Scores:
p
: 0,0,0,1.box .highlight
: 0,0,2,0#main .box .highlight
: 0,1,2,0
Result:
The selector #main .box .highlight
has the highest specificity, so the <p>
text will be red.
Example 3: Inline Styles vs. External CSS
<div class="container">
<p id="text" style="color: purple;">Inline Style Example</p>
</div>
p { color: blue; } /* Specificity: 0,0,0,1 */
.container p { color: green; } /* Specificity: 0,0,1,1 */
#text { color: red; } /* Specificity: 0,1,0,0 */
Specificity Scores:
Inline style: 1,0,0,0
#text
: 0,1,0,0.container p
: 0,0,1,1p
: 0,0,0,1
Result:
The inline style has the highest specificity and overrides all external CSS. The <p>
text will be purple.
Example 3: Specificity Tiebreaker (detailed explanation what’s happening behind the scenes )
we have two CSS selectors targeting the same element, and their specificity scores are close. Here's what's happening behind the scenes:
<p class="highlight">Tiebreaker Example</p>
p.highlight { color: blue; } /* Specificity: 0,0,1,1 */
.highlight { color: green; } /* Specificity: 0,0,1,0 */
Selector Specificity Calculation
p.highlight
:1 element selector (
p
): +1 point.1 class selector (
.highlight
): +10 points.Total Specificity: 0,0,1,1.
.highlight
:1 class selector (
.highlight
): +10 points.Total Specificity: 0,0,1,0.
Clearly,
p.highlight
has a higher specificity (0,0,1,1) than.highlight
(0,0,1,0).
How Specificity Works Internally
The browser assigns scores for all selectors targeting the
<p>
element.Selectors with higher specificity take priority.
Since
p.highlight
has a slightly higher specificity score (due to thep
element selector), it overrides.highlight
.
Cascading and Final Rule Application
In CSS, when two rules target the same element:The browser compares their specificity.
If one has a higher specificity, it wins.
If they have equal specificity, the last defined rule in the stylesheet takes precedence.
Here,
p.highlight
is more specific, so its styles apply, and the text becomes blue.
Why Does the
p
Element Add Weight?The selector
p.highlight
is considered more specific because it not only matches elements with thehighlight
class but also limits the scope to<p>
tags. This additional condition (thep
element) adds weight to its specificity score, making it more "specific" than just.highlight
.This ensures that styles are applied more precisely when multiple rules target an element, preventing unnecessary conflicts.