Я не могу предвидеть !important
препятствие производительности, по сути, по сути. Если, однако, ваш CSS пронизан !important
, это означает, что вы перевыполнили селекторы и слишком конкретны, и у вас закончились родители или квалификаторы, чтобы добавить специфичность. Следовательно, ваш CSS будет становиться раздутой (что будет препятствовать производительности) и трудно поддерживать.
Если вы хотите , чтобы написать эффективный CSS , то вы хотите быть только в качестве конкретного , как вы должны быть , и написать модульный CSS . Рекомендуется воздерживаться от использования идентификаторов (с хэшами), цепочек селекторов или квалифицированных селекторов.
Идентификаторы с префиксом #
в CSS очень специфичны, так что 255 классов не будут переопределять идентификатор (fiddle by: @Faust ). У ID тоже есть проблема с более глубокой маршрутизацией, они должны быть уникальными, это означает, что вы не можете повторно использовать их для дублирующих стилей, поэтому вы в конечном итоге пишете линейный CSS с повторяющимися стилями. Последствия этого будут варьироваться от проекта к проекту, в зависимости от масштаба, но ремонтопригодность сильно пострадает, а в крайних случаях - и производительность.
Как вы можете добавить специфичность без !important
, цепочки, квалификации или идентификаторов (а именно #
)
HTML
<div class="eg1-foo">
<p class="eg1-bar">foobar</p>
</div>
<div id="eg2-foo">
<p id="eg2-bar">foobar</p>
</div>
<div class="eg3-foo">
<p class="eg3-foo">foobar</p>
</div>
CSS
.eg1-foo {
color: blue;
}
.eg1-bar {
color: red;
}
[id='eg2-foo'] {
color: blue;
}
[id='eg2-bar'] {
color: red;
}
.eg3-foo {
color: blue;
}
.eg3-foo.eg3-foo {
color: red;
}
JSFiddle
Хорошо, так как это работает?
Первый и второй примеры работают одинаково, первый буквально является классом, а второй - селектором атрибутов. Селекторы классов и атрибутов имеют одинаковую специфику. .eg1/2-bar
не наследует свой цвет, .eg1/2-foo
потому что у него есть собственное правило.
Третий пример выглядит как квалификатор или цепочка селекторов, но это не так. Цепочка - это когда вы добавляете префиксы к родителям, предкам и т. Д .; это добавляет специфичности. Квалификация похожа, но вы определяете элемент, к которому применяется селектор. квалификация: ul.class
и цепочка:ul .class
Я не уверен, что вы бы назвали эту технику, но поведение является преднамеренным и задокументировано W3C
Повторные вхождения одного и того же простого селектора допускаются и повышают специфичность.
Что происходит, когда специфика между двумя правилами идентична?
Как указал @BoltClock , если существует несколько! Важных объявлений, то спецификация диктует, что наиболее конкретное должно иметь приоритет.
В приведенном ниже примере, как .foo
и .bar
имеют одинаковую специфичность, поэтому поведение fallsback к каскадным природе CSS, в результате чего последнее правило , объявленной в CSS претензий очередностью т.е. .foo
.
HTML
<div>
<p class="foo bar">foobar</p>
</div>
CSS
.bar {
color: blue !important;
}
.foo {
color: red !important;
}
JSFiddle