#html #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:
Я просто добавлю ссылку на саму спецификацию CSS 2.1 и на то, как браузеры должны вычислять спецификацию:
Специфичность селектора рассчитывается следующим образом:
- количество 1, если объявление от является атрибутом «стиль», а не правилом с селектором, 0 в противном случае (= a) (В HTML значения атрибута «стиль» элемента являются правилами таблицы стилей. В этих правилах нет селекторов, поэтому a=1, b=0, c=0 и d=0.)
- подсчитайте количество атрибутов идентификатора в селекторе (= b)
- подсчитайте количество других атрибутов и псевдоклассов в селекторе (= c)
- подсчитайте количество имен элементов и псевдоэлементов в селекторе (= d)
- Специфика основана только на форме селектора. В частности, селектор формы «[id=p33]» считается селектором атрибутов (a=0, b=0, c=1, d=0), даже если атрибут id определен как «идентификатор» в DTD исходного документа.
Объединение четырех чисел a-b-c-d (в системе счисления с большой базой) придает специфику.
Если характеристики равны, то в игру вступает раздел 6.4.1 CSS 2.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-это самая низкая специфичность, а 5-самая высокая. https://youtu.be/NqDb9GfMXuo будет показана подробная информация для демонстрации.
Ответ №3:
Что вас интересует, так это конкретика.
Firebug-отличный инструмент для проверки этого. Но другие браузеры также имеют встроенные инструменты для проверки применяемых правил CSS.
Комментарии:
1. Есть ли у Firebug специальные (без каламбура) инструменты для анализа специфичности? Больше, чем сквозной взгляд на отмененные правила?
2. @Пекка, нет, это не так. Тем не менее, это все еще отличный инструмент для подобных вещей.
3. @Pekka В правой части вкладки HTML на вкладке «Вычисленный» (?) (между стилем и внешним видом) есть еще одно сквозное представление переопределенных инструкций. Более полезен, чем тот, о стиле которого вы, вероятно, говорите, когда вас интересует только ОДНО свойство.
Ответ №4:
Вы можете ознакомиться с полным ответом здесь Документация Mozilla
Начните с самого конкретного: селекторы идентификаторов > селекторы классов >> селекторы типов(обычный тег h1, p и т. Д.). !важное всегда побеждает, но это считается плохой практикой.Смотрите ссылку выше.
Лучший способ-поэкспериментировать с этим:
<!-- 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;
}
Вот тестовый пример.