Nienawidzę ich, to przeciwstawia się kaskadowej naturze CSS, a jeśli nie użyjesz ich ostrożnie, skończysz w pętli dodawania kolejnych !important
.
Ale chcę wiedzieć, czy mają zły wpływ na wydajność?
EDYCJA
Na podstawie (szybkich) odpowiedzi mogę stwierdzić, że nie będzie to miało (znaczącego) wpływu na wydajność. Ale miło jest wiedzieć, nawet jeśli jest to dodatkowy argument zniechęcający innych;).
EDIT 2
BoltClock wskazał, że jeśli są 2 !important
deklaracje, specyfikacja mówi, że wybierze najbardziej konkretną.
css
performance
janw
źródło
źródło
!important
zasad.Odpowiedzi:
To nie powinno mieć żadnego wpływu na wydajność. Widząc Firefoksa CSS parser na
/source/layout/style/nsCSSDataBlock.cpp#572
i myślę, że jest istotne rutyna, obsługa nadpisywania reguł CSS.wydaje się to po prostu sprawdzeniem „ważnego”.
Również komentarze na
source/layout/style/nsCSSDataBlock.h#219
Od: http://taligarsiel.com/Projects/howbrowserswork1.htm#CSS_parsing
Teraz możesz łatwo zobaczyć, na przykład w przypadku opisanego powyżej modelu obiektowego, analizator składni może łatwo oznaczyć reguły, na które ma wpływ
!important
, bez większych kosztów. Spadek wydajności nie jest dobrym argumentem przeciwko!important
.Jednak łatwość konserwacji wymaga trafienia (jak wspomniano w innych odpowiedziach), co może być twoim jedynym argumentem przeciwko nim.
źródło
!important
specjalnie zoptymalizowanych reguł? Nie sądzę, ale trudno być pewnym; katalog layout / style w Firefoksie zawiera 80 000 linii kodu.Nie sądzę, aby było
!important
to z natury złe z punktu widzenia szybkości, z jaką przeglądarka dopasowuje reguły (nie stanowi części selektora, tylko część deklaracji)Jednak, jak już wspomniano, zmniejszy to łatwość konserwacji twojego kodu, a zatem prawdopodobnie spowoduje, że jego rozmiar będzie niepotrzebnie powiększał się z powodu przyszłych zmian. Zastosowanie
!important
prawdopodobnie obniżyłoby również wydajność programistów.Jeśli jesteś naprawdę wybredny, możesz także powiedzieć, że
!important
dodaje 11 dodatkowych bajtów do pliku CSS, to nie jest tak naprawdę dużo, ale myślę, że jeśli masz sporo!important
s w swoim arkuszu stylów, może to dodać.Tylko moje przemyślenia, niestety nie mogłem znaleźć żadnych testów porównawczych, które
!important
mogłyby wpłynąć na wydajność.źródło
!important
ma swoje miejsce. Zaufaj mi co do tego. Oszczędzało mi to wiele razy i często jest bardziej przydatne jako rozwiązanie krótkoterminowe, zanim można będzie znaleźć dłuższą i bardziej elegancką metodę rozwiązania problemu.Jednak, jak większość rzeczy, był nadużywany, ale nie trzeba się martwić o „wydajność”. Założę się, że jeden mały 1x1 GIF ma więcej wyników na stronie internetowej niż to!
Jeśli chcesz zoptymalizować swoje strony, jest wiele innych ! Ważnych dróg do pokonania;);)
źródło
Za kulisami dzieje się to, że gdy twój CSS jest przetwarzany, przeglądarka go odczytuje, napotyka
!important
atrybut, a przeglądarka wraca, aby zastosować style określone przez!important
. Ten dodatkowy proces może wydawać się małym dodatkowym krokiem, ale jeśli obsłużysz wiele żądań, to poprawisz wydajność. (Źródło)Myślenie programisty przy użyciu
!important
:!important
tak ... teraz działa dobrze.Jednak nie jest to dobre podejście do korzystania
!important
tylko dlatego, że nie zarządzaliśmy dobrze CSS. Powoduje to wiele problemów projektowych - gorszych niż problemy z wydajnością - ale zmusza nas również do korzystania z wielu dodatkowych wierszy kodu, ponieważ zastępujemy inne właściwości,!important
a nasz CSS jest zaśmiecony niepotrzebnym kodem. Zamiast tego powinniśmy najpierw bardzo dobrze zarządzać CSS i nie dopuścić, aby właściwości się przesłoniły.My może używać
!important
. Ale używaj go oszczędnie i tylko wtedy, gdy nie ma innego wyjścia.źródło
Zgadzam się z tobą, że go nie używasz, ponieważ jest to zła praktyka, niezależnie od wydajności. Z tych samych powodów unikałbym używania
!important
to możliwe.Ale w kwestii wydajności: nie, nie powinno być zauważalne. Może to mieć jakiś wpływ, ale powinno być tak małe, że nigdy nie powinieneś tego zauważyć, ani nie powinieneś martwić się o niego.
Jeśli jest to wystarczająco znaczące, aby być zauważalnym, prawdopodobnie masz większe problemy w kodzie niż tylko
!important
. Proste użycie normalnego elementu składni podstawowych języków, których używasz, nigdy nie będzie stanowić problemu z wydajnością.Pozwól, że odpowiem na twoje pytanie w odpowiedzi na pytanie retoryczne; kąt, którego prawdopodobnie nie wziąłeś pod uwagę: o jaką przeglądarkę masz na myśli?
Każda przeglądarka ma oczywiście własny silnik renderowania z własnymi optymalizacjami. Pojawia się więc pytanie: jakie są konsekwencje wydajności w każdej przeglądarce? Być może
!important
działa źle w jednej przeglądarce, ale naprawdę dobrze w innej? A może w następnych wersjach będzie odwrotnie?Chyba tutaj mam na myśli to, że my, programiści stron internetowych, nie powinniśmy myśleć (lub trzeba myśleć o) skutkach poszczególnych konstrukcji składni używanych przez nas języków. Powinniśmy używać tych konstrukcji składniowych, ponieważ są one właściwym sposobem na osiągnięcie tego, czego nie chcemy, ze względu na ich wydajność.
Pytania dotyczące wydajności należy zadawać w połączeniu z wykorzystaniem profilerów do analizy, gdzie znajdują się punkty ściskania w twoim systemie. Najpierw napraw rzeczy, które naprawdę Cię spowalniają. Prawie na pewno będą o wiele większe problemy do rozwiązania, zanim przejdziesz do poziomu poszczególnych konstrukcji CSS.
źródło
Nie wpływa to zauważalnie na wydajność. Zmniejsza to jednak łatwość utrzymania kodu i dlatego może obniżyć wydajność na dłuższą metę.
źródło
Musiałem użyć
!important
kilka razy wcześniej, ale osobiście nie zauważyłem żadnego widocznego spadku wydajności podczas jego używania.Jako notatkę patrz z odpowiedzią na to pytanie stosu z powodu, którego możesz chcieć użyć
!important
.Wspomnę też o czymś, o czym nie wspomnieli inni.
!important
jest jedynym sposobem na zastąpienie wbudowanego css bez pisania funkcji javascript (co wpłynie na twoją wydajność, nawet jeśli tylko trochę). Więc może faktycznie zaoszczędzić trochę czasu na wydajność, jeśli musisz zastąpić wbudowany css.źródło
hmm ...! ważne czy !! ważne?
Przejdźmy przez ten krok po kroku:
Sądzę więc, że ważne ma lepszą wydajność, ponieważ może pomóc parserowi pominąć wiele właściwości, których inaczej nie pominąłby.
i jak wspomniano poniżej @ryan, jedynym sposobem na zastąpienie wbudowanego css i uniknięcie używania javascript ... więc inny sposób na uniknięcie niepotrzebnego spadku wydajności
hmm ... okazuje się, że! ważne jest ważne
i również,
Wydaje mi się, że użycie! Ważne może uszczęśliwić programistów i myślę, że to bardzo ważne : D
źródło
!important
deklaracji. Przeglądarka będzie musiała sprawdzić je wszystkie. Tak naprawdę to wraca do kroku 1.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
CSS
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
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
CSS
JSFiddle
źródło