Search code examples
htmlcsscss-specificity

Overriding CSS properties for a specific html element


I have the following:

<section class="main_section">
    <article>
    ...
    </article>
</section>

In my stylesheet I have:

.main_section article {
    background-color:#fff;
    /* ... */
}

The article is styled, and I am happy about it. Now, for a single instance of article, I want to do the following:

<section class="main_section">
    <article class="special-bg">
    ...
    </article>
</section>

Which I have defined:

.special-bg {
    background-color: #276a7f;
}

But the class is not setting the background-color. It seems that the styling of the html tag article takes precedence, no matter the order of the CSS rules in my stylesheet.

How can I overwrite a CSS property of an styled html tag by using a styling class? Is this at all possible? Any alternative?


Solution

  • That's a CSS specificity issue.

    .main_section article has a higher specificity value than .special-bg selector.

    In terms of value: Inline Style > IDs > Classes, Attributes, and Pseudo-classes > Element Types and Pseudo-elements, So the calculation of Specificity of these two CSS selectors would be:

    .special-bg

    Inline Style    ID   (Pseudo-)Class    (Pseudo-)Element
    0               0    1                 0
    

    .main_section article

    Inline Style    ID   (Pseudo-)Class    (Pseudo-)Element
    0               0    1                 1
    

    11 > 10 => .main_section article selector wins!

    You could use the following:

    .main_section .special-bg {
      /* Styles goes here... */
    }
    

    Further reading:

    And a great tool to calculate the specificity value: