Наверно у многих, кто занимается (занимался) версткой и в плотную сталкивался с таблицами стилей, наступали моменты когда !important на !important'e сидел, css превращался в вереницу длинных цепочек, но все равно кто-то, где-то, кого-то перебивал (или наоборот). И не совсем ясно, почему так происходит.

Давайте раз и навсегда разберемся с каскадированием стилей и специфичностью селекторов.

Специфичность селекторов определяет их приоритетность в таблице стилей. Чем специфичнее селектор, тем выше его приоритет.
Подсчитать приоритет селектора очень просто.

  • inline-стили имеют специфичность 1000
  • за каждый идентификатор (#) 0100
  • за каждый класс (.) и псевдо-класс (::, []) 0010
  • за каждый тег и псевдо-элемент 0001
  • * и стили браузера 0000

* {box-sizing: border-box} /* специфичность 0000 */
li {color:red} /* специфичность 0001*/
ul li {color:red} /* специфичность 0002*/
.list li {color:red} /* специфичность 0011*/
#list li {color:red} /* специфичность 0101*/
a[href^="http://"] {text-decoration: underline} /* специфичность 0011 */

При добавлении !important приоритет становится главенствующим. Если !important несколько стоит задуматься о смене профессии они начинают подчиняться тем же правилам.

li {color:red !imporatnt} /* специфичность 0001 - win*/
ul li {color:red} /* специфичность 0002*/

li {color:red !imporatnt} /* специфичность 0001*/
ul li {color:red !imporatnt} /* специфичность 0002 - win*/


После всех манипуляций специфичность совпала — выигрывает последнее (то что ниже) правило.

Ну и конечно же CSS-анимации, имеющие приоритет выше, даже чем !important в inline-стилях.

UPD Почему 11 классов не имеют большего приоритета над идентификатором читать здесь

Комментарии (14)


  1. gwer
    03.03.2016 15:05
    +3

    Из вашего представления можно сделать вывод, что 11 классов в селекторе специфичнее одного идентификатора.

    Ну и да, с этим уже раз и навсегда разбирались огромное количество раз, даже на хабре.


    1. artemmalko
      04.03.2016 10:06

      Надо просто пробел между разрядами написать и все становится на свои места. Хотя это уже не разряды будут даже, но понятнее точно станет.


  1. vintage
    03.03.2016 15:15

    Что мешает добавить 5 и 6 разряды для !important и анимаций?


    1. gwer
      03.03.2016 15:34

      Для !important добавляется 5, 6, 7 и 8 «разряды».


      1. vintage
        03.03.2016 17:19

        Зачем? У нас же тут не единичная система счисления, а бесконечнная ;-)


        1. gwer
          03.03.2016 17:29

          Ну как же? По одному для каждого !important-тега/класса/идентификатора/инлайна. В первом комментарии ссылочка, там всё расписано детально (=


          1. vintage
            03.03.2016 17:48

            !important независимый модификатор. С чего бы ему порождать более одного разряда?


            1. gwer
              03.03.2016 18:03

              А отличать !important'ы в разных селекторах как? Специфичность селекторов при двух !important'ах никуда не денется.


              1. vintage
                03.03.2016 22:47

                А как вы отличаете числа 123 и 176? У них ведь одна и та же цифра в старшем разряде.


      1. Bellicus
        03.03.2016 17:45

        Так уж 9 "разряд" для анимаций не забудьте


  1. ilinsky
    03.03.2016 16:24
    +2

    Руки отбивать тем кто использует !important


    1. artemmalko
      03.03.2016 19:05
      +2

      Иногда он необходим. Все хорошо, когда в нужном месте и в меру!


  1. gatilin222
    04.03.2016 09:38

    А еще можно писать дублирование одного и того же класса .some_class.some_class {}. Но лучше не стоит)


  1. artemmalko
    04.03.2016 10:08

    Вот еще интересная статья на эту тему. https://css-tricks.com/a-specificity-battle/