Специфичность селектора

В реальных проектах CSS состоит из десятков каскадов и зачастую один элемент имеет несколько конфликтующих блоков правил. Например, как в следующем коде:

a{
    color: red;
}

.link{
    color: #000;
}

В данном пример браузер применит 2 раза свойство color, но каким же в итоге будет цвет ссылки? Как он сможет разрешить этот конфликт? Для решения этой проблемы существует специфичность селектора.

Специфичность селектора — это коэффициент, согласному которому браузер определяет приоритет селектора.

Данное число состоит из 4 цифр, как представлено на следующем изображении:

Каждое число определяет какое количество раз встречается определенные простой селектор. Например, селектор "a" состоит из одного селектора типа "а", поэтому его специфичность будет 0001. А селектор ".link" состоит из одного селектора класса "link", и поэтому специфичность равняется 0010.

После того как браузер посчитает специфичность, он сравнивает полученные результаты и распределяет приоритет. В нашем примере, 0010 больше 0001, поэтому он применит значение из селектора ".link".

А сейчас мы усложним пример и добавим к ссылке еще один класс.

<div class="welcome">
    <a href="http://yandex.ru" id="link" class="link any-link">Перейти на страницу Яндекса</a>
</div>
a{
    color: red;
}

.link{
    color: #000;
}

.any-link{
    color: pink;
}

Как думаешь какого цвета будет ссылка? А теперь посмотри на следующее изображение:

Она будет розовой, потому что ".link" и ".any-link" имею одинаковую специфичность, но ".any-link" находится после ".link".

А теперь добавим селектор идентификатор как показано в следующем коде:

a{
    color: red;
}

.link{
    color: #000;
}

#link{
    color: green;
}

.any-link{
    color: pink;
}

Из-за того, что идентификатор имеет специфичность 0100, ссылка будет зеленной.

А теперь самое интересное. Для того, чтобы переопределить цвет ссылки, нужно использовать еще один идентификатор. И так до бесконечности. Такое дублирование кода в итоге приведет к очень плохому коду, который будет невозможно поддерживать.

Но, кроме селекторов CSS есть еще один способ переопределить правила. Это использовать !important. При добавлении его к свойству, браузер применит именно это значение без учета специфичности селектора. Для примера я изменю код следующим образом:

a{
    color: red !important;
}

.link{
    color: #000;
}

#link{
    color: green;
}

.any-link{
    color: pink;
}

И ссылка будет красной.

Это можно изменить если добавить еще один !important. Это напоминает идентификатор, поэтому лучше, не используй !important.

results matching ""

    No results matching ""