Understanding CSS selector specificity is crucial for writing efficient and effective CSS code.
CSS selectors can be as simple as a single element, like `h1`, or as complex as a combination of multiple elements, like `h1 > .container > .title`.
In CSS, specificity is calculated based on the number of elements and the type of selectors used.
The more complex the selector, the higher its specificity.
What Is?
CSS specificity is the concept used to determine which CSS rules apply to a specific HTML element whenever there are conflicting styles.
It's based on a hierarchy: IDs override classes and element selectors, which, in turn, override basic element styles.
Inline styles hold the highest precedence.
CSS specificity is the set of rules applied to the CSS selectors to determine which styles are applied to an element.
Every selector has a specificity value.
The more specific a CSS selector is, the larger its specificity value, hence it will be applied to an element.
If two rules are applied to the same element, then CSS specificity comes into picture to identify which rule should be applied to the element according to its specificity value.
If the specificity value of a selector between multiple rules is the same, the rule that is defined at the last is applied to that element.
Types of Selectors
There are several types of selectors in CSS, each with its own specificity value. The universal selector has a specificity value of 0, making it the least specific.
Inline styles have the highest specificity value, at 1000. This is because they are applied directly to an element using the style attribute.
Element and pseudo-element selectors have a specificity value of 1, making them the least specific of the element-based selectors.
Here's a comparison of the specificity values for different types of selectors:
ID selectors have a specificity value of 100, which is higher than class, pseudo-class, or attribute selectors.
Universal
The universal selector is a wild card in the world of CSS selectors. It's denoted by an asterisk (*) and has no specificity, earning it a whopping 0 points.
This means that any rule with 1 or more points will override it.
Element
Element selectors are used to style a selected element, and they're a great way to start with CSS.
Element selectors, such as a, p, and div, have the lowest specificity in the specificity weight system, with a value of 1.
Pseudo-elements like ::after and ::before are used to style specific parts of an element, and they also have a specificity value of 1.
Using element selectors is a good starting point for styling, but keep in mind that they have a specificity value of 1, so they won't override other styles with a higher specificity.
ID
ID selectors are a powerful way to target specific elements on a webpage. They get a specificity score of 100 points, making them more specific than classes and elements.
The specificity score of an ID selector is determined by the use of the # symbol, as seen in #myID. Using an attribute selector like [id="myID"] will not give you the same level of specificity.
Here's a list of the specificity scores for different types of selectors:
As you can see, ID selectors have a much higher specificity score than other types of selectors, making them a great choice when you need to target a specific element on a webpage.
Classes, Attributes, Pseudo-classes
Classes, Attributes, and Pseudo-classes are a powerful combination in CSS selectors. They have a higher specificity than element and pseudo-element selectors, which means they can override other styles.
With a specificity value of 10, these selectors can target specific elements or attributes on a webpage. This is particularly useful when you need to apply styles to a specific class or attribute.
In our specificity weight system, classes, attributes, and pseudo-classes all have the same value of 10. This means that if you have a class selector and an attribute selector, they will have the same level of specificity.
Here's a quick rundown of the specificity values for different types of selectors:
This table shows the specificity values for different types of selectors. Keep in mind that the specificity value is not the same as the importance of the selector, but rather a measure of how specific it is.
By using classes, attributes, and pseudo-classes, you can create more targeted and effective CSS styles.
Navigation Bar
A navigation bar is a simple element that can be styled differently using CSS specificity.
You can see this in action when creating a navigation bar with buttons and links that need to be styled uniquely.
For example, if you have a navigation bar with six links, one of which you want to convert to a button, you can use the class name upgrade-btn for CSS specificity.
The HTML of the design consists of six navigation links, one of which will be converted to a button.
In the CSS, you can target the nav link with the exact class of upgrade-btn to style it differently.
nav.upgrade-btn{background:linear-gradient(90deg,#3532ec, #800080);color:white;border:none;border-radius:5px;padding:10px20px;}
This is an example of using CSS specificity to target a specific element and style it uniquely.
Here's a breakdown of the CSS specificity:
- nav.upgrade-btn targets the nav link with the class upgrade-btn
- background, color, border, border-radius, and padding are styled differently for the upgrade button
By using CSS specificity, you can style the upgrade button differently from the other nav links, even though they share the same parent element.
Selector Specificity Rules
Each selector gets points according to their groups, and the selector with the highest value wins. The inline style receives the highest priority, equivalent to 1000 points, which automatically wins.
Here's a breakdown of the points for each group:
- Inline style: 1000 points
- ID selector: 100 points
- Class, attribute, or pseudo-class selector: 10 points
- Element or pseudo-element selector: 1 point
This means that if you have multiple selectors targeting the same element, the one with the highest total points will be applied.
How Works?
An !important rule gets a specificity score of 10,000 points, making it the highest specificity that one individual item can get.
Each selector gets points according to their groups, and the selector with the highest value wins. Inline styling is equivalent to 1000 points and automatically wins.
ID selectors receive 100 points/value, while class, attribute, or pseudo-class selectors get 10 points each. Element/pseudo-elements instances get 1 point each.
The inline style receives the highest priority, while the element selector has the lowest priority. This is why it's crucial to understand the importance of CSS specificity in web development.
Here's a breakdown of the specificity points for different types of selectors:
This table illustrates how different types of selectors contribute to the overall specificity score. Understanding these points can help you write more efficient and maintainable CSS code.
The browser calculates the specificity value of all the selectors, and then it checks which selector has the highest value, and the rule which has higher specificity value wins. This means that even if a lower-specificity rule comes later in the stylesheet, the higher-specificity rule will win.
An !important declaration gives that particular declaration the highest level of specificity, effectively overriding any conflicting styles, regardless of their specificity values. This can be good when used judiciously, but it can also lead to maintainability and debugging challenges if overused.
The Hierarchy
CSS specificity hierarchy is a ranking system that determines which styles take precedence when multiple selectors target the same HTML element. This hierarchy is used by the browser to decide which rule should be applied first.
The W3C introduced the specificity hierarchy, which groups selectors into four categories. Each category has a special rank that determines its value.
The four categories are: Inline Style, ID attributes, class, pseudo-class, attributes, and elements, pseudo-elements. Each selector belongs to only one group, and the group with the highest rank has the highest value.
Here's a breakdown of the four categories:
- Inline Style: This category has the highest specificity value and is applied first. Inline styles are applied directly to an element using a style attribute.
- ID attributes: This category has a higher specificity value than class selectors. ID attributes are applied to an element with a given id.
- Class, pseudo-class, attributes: This category includes styles that apply to all elements with a given class value, pseudo-classes, and additional element attributes.
- Elements, pseudo-elements: This category has the lowest specificity value and is applied last. These selectors are typically used for a webpage's baseline styling.
In summary, the hierarchy of specificity values determines which styles are applied first. Understanding this hierarchy helps developers write cleaner and more maintainable code by reducing the need for overly specific selectors and convoluted workarounds.
Selector Combinations
Selector combinations can be incredibly powerful, allowing you to target specific elements in complex layouts. You can combine multiple selectors and combinator operators to create complex selector combinations.
Descendant selectors, child selectors, adjacent sibling selectors, and general sibling selectors are just a few of the combinator operators available in CSS. For example, using a descendant selector, you can select all li elements that are descendants of ul elements with the selector ul li.
The cumulative specificity of constituent parts determines the specificity of a selector combination. This means that the specificity of a selector like div .class > p is influenced by the specificities of div, .class, and p. The order of selectors can also affect specificity, as seen in the example p.class, where the class selector has a higher specificity than the type selector p.
Here's a brief summary of the combinator operators and their effects:
- Descendant selector ( ): selects an element that is a descendant of another element.
- Child selector (>): selects an element that is a direct child of another element.
- Adjacent sibling selector (+): selects an element that is immediately preceded by a specified element.
- General sibling selector (~): selects elements that are siblings of a specified element.
Newest Instance Wins
You might be surprised to learn that the newest instance of a CSS rule can actually win over an older one, but only under certain conditions. This is because of the way CSS specificity scores work.
In cases where two selectors have an identical specificity score, the newest instance will take priority. This is what happened in our example where the button had a grey background because both selectors had the same specificity score of 0-1-0.
If you switch the rules in the source order, the button would then be blue, demonstrating how the newer CSS rule can win out.
Combinators
Combinators are a powerful tool in CSS, allowing you to select elements based on their relationship to other elements in the document tree.
You can use different types of combinator operators to achieve this, including the Descendant Selector ( ), Child Selector ( > ), Adjacent Sibling Selector (+), and General Sibling Selector (~).
For example, the Descendant Selector ( ) selects all li elements that are descendants of ul elements, while the Child Selector ( > ) selects all li elements that are immediate children of ul elements. The Adjacent Sibling Selector (+) selects all p elements that directly follow an h2 element, and the General Sibling Selector (~) selects all p elements that are siblings of an h2 element.
To create complex selector combinations, you can combine multiple selectors and combinator operators. For instance, div .class > p selects all p elements that are direct children of elements with class class, which themselves are descendants of div elements.
The order of selectors can also affect specificity. In p.class, the class selector has a higher specificity than the type selector p.
Here are the four types of combinator operators in CSS, summarized in a table:
Remember, combining selectors can be powerful, but it's crucial to use them judiciously to avoid unnecessarily high specificity, leading to unintended styling conflicts and making your code more challenging to maintain.
Frequently Asked Questions
Which CSS selector has the lowest specificity?
The universal selector (*) has the lowest CSS specificity, making it the least prioritized in styling conflicts. This is a good starting point for understanding CSS specificity, which can be complex but is crucial for effective styling.
Featured Images: pexels.com