Я не можу передбачити !important
перешкоджання продуктивності, як не властиво. Якщо, однак, ваш CSS пронизаний !important
, це вказує на те, що ви перевищили кваліфікаційних селекторів і занадто конкретні, і вам не вистачає батьків або кваліфікованих працівників, щоб додати конкретність. Отже, ваш CSS стане роздутим (що буде перешкоджати продуктивності) і його важко підтримувати.
Якщо ви хочете , щоб написати ефективний CSS , то ви хочете бути тільки в якості конкретного , як ви повинні бути , і написати модульний CSS . Доцільно утримуватися від використання ідентифікаторів (з хешами), ланцюжкових селекторів або кваліфікованих селекторів.
Ідентифікатори з префіксом #
у CSS є явно конкретними, до того моменту, коли 255 класи не замінять ідентифікатор (скрипка: @Faust ). У ідентифікаторів є проблема з більш глибокою маршрутизацією, вони повинні бути унікальними, це означає, що ви не можете повторно використовувати їх для дублювання стилів, тому ви в кінцевому підсумку пишете лінійний 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
мають однакову специфіку, тому поведінка відступає до каскадного характеру CSS, внаслідок чого останнє правило, заявлене в CSS, має перевагу, тобто .foo
.
HTML
<div>
<p class="foo bar">foobar</p>
</div>
CSS
.bar {
color: blue !important;
}
.foo {
color: red !important;
}
JSFiddle