Nie mogę przewidzieć !important
utrudniania wydajności, zresztą i tak z natury. Jeśli jednak Twój CSS jest pełen zagadek !important
, oznacza to, że przekroczyłeś kwalifikujące się selektory i jesteś zbyt specyficzny oraz że zabrakło Ci rodziców lub kwalifikatorów, aby dodać specyfikę. W związku z tym Twój CSS będą stały nadęty (która będzie utrudniać wydajność) i trudne do utrzymania.
Jeśli chcesz napisać efektywne CSS następnie chcesz być tylko tak dokładnie, jak trzeba być i pisać modułową CSS . Wskazane jest, aby powstrzymać się od używania identyfikatorów (z skrótami), łączenia selektorów lub kwalifikujących selektorów.
Identyfikatory poprzedzone #
w CSS są złośliwie specyficzne, do tego stopnia, że 255 klas nie zastąpi identyfikatora (skrzypce: @Faust ). Identyfikatory mają również głębszy problem z routingiem, muszą być unikalne, co oznacza, że nie można ich ponownie użyć do powielonych stylów, więc w końcu piszesz liniowy css z powtarzającymi się stylami. Konsekwencje tego będą różne dla poszczególnych projektów, w zależności od skali, ale możliwość konserwacji będzie ogromnie ucierpiała, aw skrajnych przypadkach również wydajność.
Jak możesz dodać specyficzność bez !important
, łączenia, kwalifikacji lub dokumentów tożsamości (a mianowicie #
)
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
Okej, więc jak to działa?
Pierwszy i drugi przykład działają tak samo, pierwszy to dosłownie klasa, a drugi to selektor atrybutów. Klasy i selektory atrybutów mają identyczną specyficzność. .eg1/2-bar
nie dziedziczy koloru.eg1/2-foo
ponieważ ma swoją własną zasadę.
Trzeci przykład wygląda jak kwalifikujące się lub łączące selektory, ale tak nie jest. Tworzenie łańcuchów ma miejsce, gdy prefiksujesz selektory rodzicom, przodkom i tak dalej; to dodaje specyficzności. Kwalifikacja jest podobna, ale definiujesz element, do którego ma zastosowanie selektor. kwalifikacje: ul.class
i łączenie:ul .class
Nie jestem pewien, jak nazwałbyś tę technikę, ale zachowanie jest celowe i udokumentowane przez W3C
Powtarzane wystąpienia tego samego prostego selektora są dozwolone i zwiększają swoistość.
Co dzieje się, gdy specyfika między dwiema regułami jest identyczna?
Jak wskazał @BoltClock , jeśli istnieje wiele! Ważnych deklaracji, wówczas specyfikacja określa, że najbardziej konkretna powinna mieć pierwszeństwo.
W poniższym przykładzie, zarówno .foo
i .bar
mają identyczną specyficzność, więc fallsback zachowanie do kaskadowego rodzaju CSS, przy czym ostatnia reguła deklarowanej zastrzeżeń CSS pierwszeństwa tj .foo
.
HTML
<div>
<p class="foo bar">foobar</p>
</div>
CSS
.bar {
color: blue !important;
}
.foo {
color: red !important;
}
JSFiddle