Специфіка CSS та час використання важливої ​​теги CSS

Специфіка CSS - важлива тема, яку потрібно зрозуміти, якщо ви хочете покращити CSS. Саме набір правил, що застосовуються до селекторів CSS, визначає, який стиль застосовується до елемента.

Щоб краще це зрозуміти, важливо, щоб ми розуміли відповідну тему - каскадування в CSS.

Каскадна природа CSS

CSS означає каскадні таблиці стилів. "Каскадування" означає, що порядок застосування правил CSS до елемента насправді має значення .

В ідеалі, якщо до одного елемента застосовуються два правила, застосовуватиметься останнє. Давайте скористаємось прикладом, щоб зрозуміти це.

Ми застосуємо до класу два класи і дамо кожному по-різному background-color.

This is a test paragraph

Ось CSS:

.style2 { background-color: red; } .style1 { background-color: yellow; }

Ось результат:

Зверніть увагу, що те, style1що виходить останнім у таблиці стилів, застосовується до елемента. Тепер ви можете очікувати, що CSS завжди застосовує стилі до елементів, але це не завжди так.

Візьмемо цей наступний приклад.

This is a test paragraph

CSS виглядає так:

#paragraph { background-color: red; } .style1 { background-color: yellow; }

Який стиль ви плануєте застосувати до елемента? The #paragraphчи the .style1?

Ось результат:

Зверніть увагу, що застосовується перший. #paragraphЄ селектор ідентифікатора, в той час як style1це селектор класу. Це тому, що каскад працює зі специфічністю, щоб визначити, які значення застосовуються до елемента.

Отже, що таке специфіка CSS?

Пояснення специфіки CSS

Відповідно до MDN, специфічність - це спосіб, за допомогою якого браузери вирішують, які значення властивостей CSS є найбільш відповідними для елемента, і, отже, будуть застосовані.

Простіше кажучи, якщо два селектори CSS застосовуються до одного і того ж елементу, використовується той, що має більш високу специфічність.

Ось чому в нашому попередньому прикладі було застосовано значення властивості селектора id, оскільки воно має більш високе значення конкретності.

То як розраховуються особливості селекторів?

Ієрархія специфічності

Розрахувати значення специфічності селекторів досить складно. Одним із способів його обчислення є використання вагової системи для ранжирування різних селекторів для створення ієрархії.

Ми будемо призначати ваги кожному селектору, щоб ми краще розуміли, як класифікується кожен селектор. Почнемо з найменшого.

Елементи та псевдоелементи

Ми використовуємо елемент селектори , як a, pі divдо стилю обраного елемента, в той час як псевдо-елементи , такі як ::afterі ::beforeвикористовуються для стилю конкретних частин елементу.

 p { color: red; }  p::before { color: red; }

Селектори елементів та псевдоелементів мають найменшу специфічність. У специфічній ваговій системі вони мають значення 1.

Класи, атрибути та псевдокласи

Ось приклади класів, атрибутів та псевдокласів:

 .person { color: red; }  [type="radio"] { color: red; }  :focus { color: red; }

Вони мають вищу специфічність, ніж селектори елементів та псевдоелементів. У нашій специфічній ваговій системі вони мають значення 10.

Селектори ID

Селектори ID використовуються для націлювання на елемент за допомогою ідентифікатора елемента.

 #header { color: red; }

Селектори ID мають вищу специфічність, ніж класи та елементи. У нашій специфічній ваговій системі вони мають значення 100.

Вбудовані стилі

Вбудовані стилі застосовуються безпосередньо до елемента в документі HTML. Це приклад:

This is a paragraph

Вбудовані стилі мають найвищу специфіку. У нашій специфічній ваговій системі вони мають значення 1000.

Ось підсумок ваг:

Inline Styles - 1000 ID selectors - 100 Classes, Attributes and Pseudo-classes - 10 Elements and Pseudo-elements - 1 

Спробуємо це зрозуміти.

The property values of selectors with a higher weight will always be applied over a selector with a lower weight.

Inline styles have the highest weight and their property value overrides every other selector's value applied to an element.

For example, if we have an element and for the same property color, there's an inline style. If the class and id selectors also have values for the same property, the inline style wins.

This is a paragraph

The stylesheet:

#paragraph { color: green; } .yellow { color: yellow; }

This is the result:

The same thing happens when an ID selector and class selector have values for the same property. The property value of the ID selector will apply.

Note that the weights only apply when different selectors have values for the same property.

Multiple Element Selectors

There are times when more than one selector is used to target an element. For example, for a list like this:

  • First item
  • Second item
  • Third item

You may target the list items like this:

.list > li { color: green; }

or like this:

ul > li { color: red; }

In a case where both selectors are used on the same stylesheet, which style will be applied to the list items?

Let's go back to our weight system to calculate the specificity of both selectors.

For .list > li, the weight of one class selector is 10 and the weight of an element selector is 1. Combined their sum is 11.

For ul > li, the weight of one element selector is 1. There are two element selectors used, so their sum is 2.

Which of the color values do you will think will be applied?

If you said the color of the .list>li selector will be applied, you got it right. It has a higher specificity value than the other selector.

Let's try another example. Given this element:

This is a paragraph

and these styles

#div-1 > .second-block > .text { color: blue } .first-block > #div-2 > #paragraph { color: red }

Try to calculate the specificity and guess which color value will apply.

This is the result:

Let's use our weight system to understand why the color value of the second selector is applied.

For #div-1 > .second-block > .text, we have one ID selector and two class selectors. The sum of their weights is 100 + 10 + 10 = 120.

For .first-block > #div-2 > #paragraph, we have one class selector and two ID selectors. The sum of their weights is 10 + 100 + 100 = 210.

That's why the value of latter selector is used.

You can try this example on your own to be sure that you get the hang of it.

  • First item

Which color will be applied to the span if the following styles are in the stylesheet?

div#div1 > .first-list > #list-item > span { color: red; } #list > #list-item > #span { color: purple; } #div1 > #list > .first-list-item > .first-span { color: light-blue; }

Try to calculate the specificity and compare it with the result you get when you run the code.

Before we conclude this article, there are some important points to note.

Important Points about CSS Specificity

The weight assigned to a selector just gives us an idea of which rules get applied to an element. However, this does not always suffice.

For instance, you may assume that if you use more than 10 classes (weight >= 100) to target an element, the property values will override that of one ID selector. But this is not true. As long as the selector with more than 10 classes have no ID selector, the one ID selector will always take precedence over it.

Applying !important to the property value of any selector makes it the value that will be applied to the element. This happens regardless of the rank of the selector on the Specificity hierarchy.

Let's use an example to understand this.

This is a paragraph

If the following styles are applied

p { color: red !important; } .blue { color: blue; } #paragraph { color: purple; }

The value of the element selector p will be used because of the !important attached to the value.

However, if another selector has the !important tag attached to the same property, the value of the later selector is used.

That's why !important should be avoided because it makes it difficult override a style.

Generally, to style a specific element, it is more advisable to use a class. This makes it easier to override the styles if you ever need to do so.

Summary

From this article, we can see that CSS specificity is an important topic to understand because it can save you hours of debugging.

With this knowledge, you can easily find out why your styles are not being applied.

Here are the major points to take out of this article:

  • Due to the cascading nature of CSS, if two rules are applied to the same element, the one that comes last is the one that will be used.
  • CSS specificity is a set of rules that determine which style is applied to an element.
  • The weight system is one way of calculating the specificity of different selectors. Here's a summary of the weights:
Inline Styles - 1000 ID selectors - 100 Classes, Attributes and Pseudo-classes - 10 Elements and Pseudo-elements - 1 
  • !important overrides all other styles regardless of the specificity of the selector where it is used.

I hope you enjoyed reading this article.