Понимание приоритета / специфичности селектора CSS

#html #css

#HTML #css #css-селекторы

Вопрос:

Я хотел бы понять, как селекторы CSS работают с конфликтами свойств. Как одно свойство выбирается поверх другого?

 div {
  background-color: red;
}

div.my_class {
  background-color: black;
}

div#my_id {
  background-color: blue;
}

body div {
  background-color: green;
}

body>div {
  background-color: orange;
}

body>div#my_id {
  background-color: pink;
}  
 <div id="my_id" class="my_class">hello</div>  

Как работает приоритет селектора?

Комментарии:

1. w3.org/TR/CSS2/cascade.html#specificity

Ответ №1:

Я просто добавлю ссылку на саму спецификацию CSS 2.1 и на то, как браузеры должны вычислять специфичность:

CSS 2.1 Раздел 6.4.3:

Специфичность селектора вычисляется следующим образом:

  • подсчитайте 1, если объявление from является атрибутом ‘style’, а не правилом с селектором, 0 в противном случае (= a) (В HTML значения атрибута «style» элемента являются правилами таблицы стилей. В этих правилах нет селекторов, поэтому a = 1, b = 0, c = 0 и d = 0.)
  • подсчитайте количество атрибутов идентификатора в селекторе (= b)
  • подсчитайте количество других атрибутов и псевдоклассов в селекторе (= c)
  • подсчитайте количество имен элементов и псевдоэлементов в селекторе (= d)
  • Специфичность основана только на форме селектора. В частности, селектор вида «[id=p33]» считается селектором атрибута (a= 0, b= 0, c = 1, d = 0), даже если атрибут id определен как «ID» в DTD исходного документа.

Объединение четырех чисел a-b-c-d (в системе счисления с большой базой) придает специфичность.

Если характеристики равны, то в игру вступает раздел 6.4.1CSS 2.1:

  1. Наконец, сортировка по указанному порядку: если два объявления имеют одинаковый вес, происхождение и специфичность, последнее указанное выигрывает. Объявления в импортированных таблицах стилей считаются предшествующими любым объявлениям в самой таблице стилей.

Обратите внимание, что речь идет о том, когда стиль определен, а не когда он используется. Если классы .a и .b имеют одинаковую специфичность, выигрывает тот, который определен последним в таблицах стилей. <p class="a b">...</p> и <p class="b a">...</p> будут иметь одинаковый стиль, основанный на порядке определения .a и .b .

Комментарии:

1. Лучшее объяснение на данный момент: ссылка Это начинает становиться удивительно интересным, когда вы прокручиваете вниз до части «Вычисление значения специфичности CSS».

2. Но что происходит, когда оба значения специфичности одинаковы? Идет ли речь о том, какое правило было определено первым?

3. Это описано w3.org/TR/CSS2/cascade.html#cascading-order , в частности, правило 4, которое применяется после специфичности. Я отредактирую ответ, чтобы включить разрыв связей.

4. @Boom : Если существует несколько одинаковых правил специфичности, то применяется последнее правило, встречающееся в таблице стилей. Надеюсь, это поможет.

Ответ №2:

  1. Элемент
  2. Селекторы классов
  3. Селекторы идентификаторов
  4. Встроенные стили
  5. !важно

По порядку 1 — это наименьшая специфичность, а 5 — самая высокая. https://youtu.be/NqDb9GfMXuo будут показаны подробности, чтобы продемонстрировать это.

Ответ №3:

Что вас интересует, так это специфичность.

Firebug — отличный инструмент, помогающий проверить это. Но другие браузеры также имеют встроенные инструменты для проверки применяемых правил CSS.

Комментарии:

1. Есть ли у Firebug специальные (без каламбура) инструменты для анализа специфичности? Больше, чем сквозное представление переопределенных правил?

2. @Pekka, нет, это не так. Тем не менее, это все еще отличный инструмент для таких вещей.

3. @Pekka В правой части вкладки HTML вкладка Вычисляемый (?) (между стилем и внешним видом) имеет еще одно сквозное представление переопределенных инструкций. Более полезный, чем в стиле, на который вы, вероятно, ссылаетесь, когда вас интересует только одно свойство.

Ответ №4:

Вы можете ознакомиться с полным ответом здесь Документация Mozilla

Начните с самого конкретного: селекторы идентификаторов > селекторы классов> селекторы типов (обычный тег h1, p и так далее ..) !important всегда выигрывает, но это считается плохой практикой.Смотрите ссылку выше.

Лучший способ — поэкспериментировать с ним:

   <!-- start class vs id -->
  <p class="class1" id="id1">.class vs #id: The winner is #id</p>

  <!-- upper vs bottom -->
  <p id="id2">the very bottom is the winner</p>

  <!--most specific is the winner -->
  <p id="id3">the most specific</p>

  <!--pseudo and target selector -->
  <h3>pseudo vs type selector</h3>

  <!-- !important is more important! -->
  <h1 id="very-specific">HI! I am very important!</h1>
  </body>
  

CSS:

 #id1{
    color: blue;
}

.class1{
    color: red;
}

#id2{
    color: yellow;
}

#id2{
    color : green;
}

body p#id3{
    color :orange;
}

body p{
    color : purple;
}

body{
    color : black;
}

h3::first-letter {
    color: #ff0000;

}

h3{
    color: CornflowerBlue ; 
}

h1{
    color: gray !important;
}

body h1#very-specific{
    color: red;
}
  

Вот тестовый пример.