Est-ce important pour la performance?

192

Je les déteste, cela défie la nature en cascade du CSS, et si vous ne les utilisez pas avec précaution, vous vous retrouvez dans une boucle pour en ajouter plus !important.

Mais je veux savoir sont-ils mauvais pour la performance?

EDIT
D'après les réponses (rapides), je peux conclure que cela n'aura pas d'impact (significatif) sur les performances. Mais c'est agréable à savoir, même si c'est juste un argument supplémentaire pour décourager les autres;).

EDIT 2
BoltClock a souligné que s'il y a 2 !importantdéclarations, les spécifications indiquent qu'il choisira la plus spécifique.

janw
la source
7
par curiosité, comment évaluez-vous les performances de la feuille de style CSS? un meilleur rendu CSS plus rapide ou quelque chose?
xiaoyi
4
@Yoshi doit encore chercher d'autres !importantrègles.
John Dvorak
1
@janw: Je viens de préciser qu'il choisit le plus spécifique ... J'ai supprimé le commentaire trompeur.
BoltClock
15
pensée aléatoire: le titre serait beaucoup plus drôle s'il disait: "est! important important?"
Nik Bougalis
59
je lis toujours! important comme 'pas important'
oɔɯǝɹ

Réponses:

269

Cela ne devrait pas vraiment avoir d'effet sur les performances. Voir l'analyseur CSS de Firefox sur/source/layout/style/nsCSSDataBlock.cpp#572 et je pense que c'est la routine pertinente, gérer l' écrasement des règles CSS.

il semble que ce soit simplement une vérification de «important».

  if (aIsImportant) {
    if (!HasImportantBit(aPropID))
      changed = PR_TRUE;
    SetImportantBit(aPropID);
  } else {
    // ...

Aussi, les commentaires à source/layout/style/nsCSSDataBlock.h#219

    /**
     * Transfer the state for |aPropID| (which may be a shorthand)
     * from |aFromBlock| to this block.  The property being transferred
     * is !important if |aIsImportant| is true, and should replace an
     * existing !important property regardless of its own importance
     * if |aOverrideImportant| is true.
     * 
     * ...
     */

  1. Firefox utilise un analyseur descendant écrit manuellement. Dans les deux cas, chaque fichier CSS est analysé dans un objet StyleSheet, chaque objet contient des règles CSS.

  2. Firefox crée ensuite des arbres de contexte de style qui contiennent les valeurs finales (après avoir appliqué toutes les règles dans le bon ordre)

CSS Parser Firefox

De: http://taligarsiel.com/Projects/howbrowserswork1.htm#CSS_parsing

Maintenant, vous pouvez facilement voir, dans un cas comme avec le modèle d'objet décrit ci-dessus, l'analyseur peut marquer les règles affectées par le !importantfacilement, sans beaucoup de coût ultérieur. La dégradation des performances n'est pas un bon argument contre !important.

Cependant, la maintenabilité prend un coup (comme d'autres réponses mentionnées), ce qui pourrait être votre seul argument contre eux.

Anirudh Ramanathan
la source
87
J'aime que tu sois le seul à avoir pris la peine de vérifier au lieu de supposer. Excellent travail monsieur!
Moox
Ce modèle d'objet n'est pas le DOM, d'ailleurs ... c'est le CSSOM. Juste au cas où quelqu'un se demanderait.
BoltClock
5
Cela devrait être la réponse. J'ai honte que ma réponse ait le double des points que la vôtre. Oh cher oh cher. Quelqu'un attribue à cet homme le crédit qui lui revient!
Michael Giovanni Pumo
3
Ce message traite de l'analyse, et je m'attends à ce que l'impact sur les performances soit nul. Les analyseurs sont rapides. La question est, qu'en est-il pendant le rendu, lorsque le navigateur recherche des déclarations CSS correspondant à un élément particulier? Le cas courant où il n'y a pas de !importantrègles est-il spécialement optimisé? Je ne pense pas, mais il est difficile d'en être sûr; le répertoire layout / style dans Firefox est de 80 000 lignes de code.
Jason Orendorff
1
Vos efforts pour vérifier la source exacte et partager ce haut niveau de connaissances sont tout simplement extraordinaires et incroyables. Des gens comme vous sont ceux qui rendent StackOverflow si populaire et si fiable. Merci beaucoup d'avoir répondu et partagé cela.
Anmol Saraf
113

Je ne pense pas que ce !importantsoit intrinsèquement mauvais en termes de rapidité avec laquelle le navigateur correspond aux règles (il ne fait pas partie du sélecteur, seulement une partie de la déclaration)

Cependant, comme cela a déjà été indiqué, cela réduira la maintenabilité de votre code et entraînera donc probablement une croissance inutile de sa taille en raison de modifications futures. L'utilisation de !importantréduirait également probablement les performances des développeurs.

Si vous étiez vraiment difficile, vous pourriez également dire que cela !importantajoute 11 octets supplémentaires à votre fichier CSS, ce n'est pas vraiment beaucoup, mais je suppose que si vous avez un bon nombre de !importants dans votre feuille de style, cela pourrait s'additionner.

Juste mes pensées, malheureusement je n'ai pas pu trouver de repères sur la façon dont !importantpourrait affecter les performances.

Sean
la source
56
"11 octets supplémentaires" donne ou prend quelques octets pour l'espace blanc facultatif oh
mon
11
Je sais ... je me moque juste de la façon dont les gens sont extrêmement pointilleux en matière de performance, en faisant passer cette exigence au niveau supérieur.
BoltClock
11
si vous êtes très pointilleux, la spécificité supplémentaire nécessaire pour le faire correctement dépasse souvent de loin 11 octets.
BlakeGru
10
@DisgruntledGoat: Une personne équilibrée se rendrait compte que ce ne sont pas des octets qui sont gaspillés mais des secondes, des minutes, des heures, des jours et des neurones. (Pourquoi suis-je toujours là?)
BoltClock
59

!importanta sa place. Faites-moi confiance sur celui-là. Cela m'a sauvé plusieurs fois et est souvent plus utile comme solution à court terme, avant qu'une méthode plus longue et plus élégante à votre problème puisse être trouvée.

Cependant, comme la plupart des choses, il a été abusé, mais il n'y a pas lieu de s'inquiéter de la «performance». Je parie qu'un petit GIF 1x1 a plus de performances sur une page Web que!

Si vous souhaitez optimiser vos pages, il existe bien d'autres ! Itinéraires importants à prendre;);)

Michael Giovanni Pumo
la source
8
C'était juste une fin amusante, sourions tous et relaxons-nous!
Michael Giovanni Pumo
12
Quel âne? Je dois savoir!
Oscar Broman
1
@Oscar Broman Je pense qu'il veut dire que :) :) ressemble à une partie particulière de l'anatomie humaine qui partage un nom commun avec l'autre nom pour un âne en langue anglaise. "L'âne ou le cul", c'est le début de l'article de wikipedia sur le cul, le pardon, l'âne. Je suppose que M. Jan Dvorak et deux électeurs sont parmi le genre de personnes offensées par littéralement chaque mot (ou smiley) qui est même offensant à distance (ou dans ce cas imaginaire). Cependant, dire âne quand vous voulez dire cul est assez stupide et impoli, car peu de non-anglophones le comprendraient.
Dimitar Slavchev
7
@DimitarSlavchev Jan ne parlait pas du smiley. Voir la version initiale du message de Michael (révision 2).
andytuba
5
@andytuba tbh, cela invalide l'argument Dimitars, mais pas son point :) :)
Grimace of Despair
31

Ce qui se passe ici dans les coulisses, c'est que pendant que votre CSS est en cours de traitement, le navigateur le lit, rencontre un !importantattribut et le navigateur revient pour appliquer les styles définis par !important. Ce processus supplémentaire peut sembler être une petite étape supplémentaire, mais si vous traitez de nombreuses demandes, vous subirez un coup dans les performances. (La source)

L'utilisation de! Important dans votre CSS signifie généralement que le développeur est narcissique et égoïste ou paresseux. Respectez les développeurs à venir ...

La pensée d'un développeur lors de l'utilisation !important:

  1. Mon CSS à bascule ne fonctionne pas ... grrrr.
  2. Qu'est-ce que je devrais faire maintenant??
  3. Et puis !importantouais .... maintenant ça marche bien.

Cependant, ce n'est pas une bonne approche à utiliser !importantsimplement parce que nous n'avons pas bien géré le CSS. Il crée beaucoup de problèmes de conception - qui sont pires que les problèmes de performance - mais elle nous oblige aussi à utiliser de nombreuses lignes de code supplémentaires puisque nous prépondérants d' autres propriétés avec !importantet notre CSS devient encombré avec le code inutile. Ce que nous devons faire à la place, c'est d'abord gérer très bien le CSS, et ne pas laisser les propriétés se remplacer les unes les autres.

Nous pouvons utiliser !important. Mais utilisez-le avec parcimonie et uniquement lorsqu'il n'y a pas d'autre issue.

entrez la description de l'image ici

NullPoiиteя
la source
Quelle méthode est la meilleure? Spécificité dans css pour garantir que l'élément est appliqué, ce sont les styles appropriés (ce qui pourrait signifier une énorme instruction css; par exemple #news .article .article-title h3 a {}) ou simplement ajouter la balise importante?
Dennis Martinez
1
@DennisMartinez, il vaudrait mieux faire une classe pour le lien du titre et juste l'ajouter ..
NullPoiиteя
Non, juste paresseux. Obtenez bâton. Frappé.
Erik Reppen
1
Je ne pense pas que casperOne ait supprimé les images simplement parce qu'elles étaient lentes à charger ...
BoltClock
13

Je suis d'accord avec vous pour ne pas l'utiliser car c'est une mauvaise pratique, quelle que soit la performance. Pour ces seules raisons, j'éviterais d'utiliser !importantautant que possible.

Mais sur la question des performances: non, cela ne devrait pas être perceptible. Il pourrait avoir un certain effet, mais il devrait être si petit que vous ne devriez jamais remarquer, ni devrait vous inquiéter.

S'il est suffisamment important pour être visible, vous avez probablement plus de problèmes dans votre code que juste !important. La simple utilisation d'un élément de syntaxe normal des langages principaux que vous utilisez ne sera jamais un problème de performances.

Permettez-moi de répondre à votre question par une question rétorique en retour; un angle que vous n'avez probablement pas considéré: De quel navigateur parlez-vous?

Chaque navigateur a évidemment son propre moteur de rendu, avec ses propres optimisations. La question devient donc maintenant: quelles sont les implications en termes de performances dans chaque navigateur? Peut-être !importantfonctionne mal dans un navigateur mais vraiment bien dans un autre? Et peut-être que dans les prochaines versions, ce sera l'inverse?

Je suppose que mon point ici est que nous, en tant que développeurs Web, ne devrions pas penser (ou avoir besoin de réfléchir) aux implications de performances des constructions de syntaxe individuelles des langages que nous utilisons. Nous devons utiliser ces constructions de syntaxe car elles sont la bonne façon de réaliser ce que nous ne voulons pas en raison de leur performance.

Les questions de performances doivent être posées conjointement avec l'utilisation de profileurs pour analyser où se trouvent les points de pincement dans votre système. Réparez les choses qui vous ralentissent vraiment en premier. Il est presque certain que vous devrez résoudre des problèmes beaucoup plus importants avant de passer au niveau des constructions CSS individuelles.

SDC
la source
Joli raisonnement. Je sais que ça ne vaut pas la peine d'être optimisé, mais je suis juste curieux.
2012 à 13h21
7

Il n'affecte pas sensiblement les performances. Cependant, cela réduit la maintenabilité de votre code et risque donc de dégrader les performances à long terme.

Henrik
la source
2
@Jan Dvorak quel est votre problème?
Enve
@BoltClock Je me réfère à la première phrase.
John Dvorak
4
@Enve mon problème est que je voudrais voir une référence, pas des hypothèses a priori présentées comme des faits. Je ne sais pas lequel est celui-ci.
John Dvorak
Je dirais que le fait que cela rend votre code plus difficile à maintenir devrait être un argument suffisant pour ne pas l'utiliser. Je n'ai jamais connu de dégradation des performances, même par rapport à d'autres améliorations mineures des performances telles que l'utilisation de l'ID au lieu des sélecteurs CLASS.
Henrik
7

Ayant dû utiliser !importantplusieurs fois auparavant, je n'ai personnellement remarqué aucune performance démontrable atteinte lors de son utilisation.

En note, voir la réponse à cette question de pile pour une raison que vous pourriez vouloir utiliser !important.

Je mentionnerai également quelque chose que tout le monde n'a pas mentionné. !importantest le seul moyen de remplacer le CSS en ligne avant d'écrire une fonction javascript (ce qui affectera vos performances même si ce n'est qu'un petit peu). Cela pourrait donc vous faire gagner du temps en termes de performances si vous avez besoin de remplacer le CSS en ligne.

Ryan
la source
6

hmm ...! important ou !! important?

Passons en revue cette étape par étape:

  1. L'analyseur doit vérifier! Important pour chaque propriété, que vous l'utilisiez ou non - la différence de performances est donc de 0
  2. Lors de l'écrasement d'une propriété, l'analyseur doit vérifier si la propriété en cours d'écrasement est! Importante ou non - donc la différence de performance est de nouveau 0
  3. Si la propriété en cours d'écrasement est !! importante, elle doit remplacer la propriété - performance hit de -1 pour ne pas utiliser! Important
  4. Si la propriété en cours de réécriture est! Importante, elle ignore l'écrasement de la propriété - augmentation des performances de +1 pour l'utilisation de! Important
  5. Si la nouvelle propriété est! Importante, l'analyse doit l'écraser indépendamment de la propriété qui est remplacée est! Importante ou !! importante - différence de performance 0 à nouveau

Donc, je suppose que! Important a en fait de meilleures performances car il peut aider l'analyseur à ignorer de nombreuses propriétés qu'il ne sautera pas autrement.

et comme @ryan le mentionne ci-dessous, la seule façon de remplacer le CSS en ligne et d'éviter d'utiliser javascript ... donc une autre façon d'éviter un impact inutile sur les performances

hmm ... il s'avère que! important est important

et aussi,

  • l'utilisation de! important fait gagner beaucoup de temps au développeur
  • vous évite parfois de repenser l'ensemble du CSS
  • parfois html ou le fichier css parent n'est pas sous votre contrôle, donc il vous sauve la vie
  • évite évidemment que des éléments importants soient accidentellement remplacés par d'autres éléments importants!
  • et parfois les navigateurs ne choisissent tout simplement pas les bonnes propriétés, sans être trop spécifiques dans les sélecteurs, donc l'utilisation de! important devient vraiment importante et vous évite d'écrire des tonnes de sélecteurs css spécifiques dans votre css. donc je suppose que même si vous utilisez plus d'octets pour l'écriture! important, cela pourrait vous faire économiser des octets dans d'autres endroits. et nous le savons tous, les sélecteurs css peuvent devenir désordonnés.

Donc je suppose que l'utilisation de! Important peut rendre les développeurs heureux, et je pense que c'est très important : D

xtrahelp.com
la source
1
"Donc je suppose! Important a en fait de meilleures performances car il peut aider l'analyseur à ignorer de nombreuses propriétés qu'il ne sautera pas autrement." Cette instruction est immédiatement annulée une fois que vous avez plusieurs !importantdéclarations. Le navigateur devra tous les vérifier. C'est donc vraiment de retour à l'étape 1.
BoltClock
1
@BoltClock, l'analyseur doit vérifier la propriété quel que soit le nombre de fois que vous l'utilisez ... donc si vous avez 10 propriétés, l'analyseur doit effectuer cette vérification 10 fois, que ces propriétés soient! Importantes ou non. donc si vous avez 10! propriétés importantes, l'analyseur effectue le contrôle 10 fois, et si vous n'avez pas 10! propriétés importantes, l'analyseur effectue toujours le contrôle 10 fois ... est logique?
xtrahelp.com
Je ne sais toujours pas si! Important est une amélioration des performances ou non, vraiment ... mais j'apprécie pleinement tous les commentaires et discussions. Ma connaissance fait avancer ses prochaines étapes. StackOverflow est tout simplement incroyable: D
Anmol Saraf
4

Je ne peux pas prévoir d' !importantentraver les performances, pas intrinsèquement de toute façon. Si, cependant, votre CSS est criblé !important, cela indique que vous avez dépassé les sélecteurs de qualification et que vous êtes trop spécifique et que vous n'avez plus de parents ou de qualificatifs pour ajouter de la spécificité. Par conséquent, votre CSS sera gonflé (ce qui entravera les performances) et difficile à maintenir.

Mème de règle CSS important

Si vous voulez écrire CSS efficace alors vous voulez être seulement aussi précis que vous devez être et écrire CSS modulaire . Il est conseillé de s'abstenir d'utiliser des identifiants (avec des hachages), de chaîner des sélecteurs ou des sélecteurs éligibles.

Les identifiants préfixés #en CSS sont vicieusement spécifiques, au point que 255 classes ne remplaceront pas un identifiant (violon par: @Faust ). Les identifiants ont également un problème de routage plus profond, ils doivent être uniques, cela signifie que vous ne pouvez pas les réutiliser pour les styles en double, vous finissez donc par écrire des CSS linéaires avec des styles répétitifs. La répercussion de cette opération variera d'un projet à l'autre, selon l'échelle, mais la maintenabilité en souffrira énormément et, dans les cas extrêmes, les performances aussi.

Comment pouvez-vous ajouter de la spécificité sans !important, chaîner, qualifier ou ID (à savoir #)

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

D'accord, alors comment ça marche?

Les premier et deuxième exemples fonctionnent de la même manière, le premier est littéralement une classe et le second est le sélecteur d'attributs. Les sélecteurs de classes et d'attributs ont une spécificité identique. .eg1/2-barn'hérite pas de sa couleur .eg1/2-foocar il a sa propre règle.

Le troisième exemple ressemble à des sélecteurs de qualification ou de chaînage, mais ce n'est ni l'un ni l'autre. Le chaînage consiste à préfixer des sélecteurs avec des parents, des ancêtres, etc. cela ajoute de la spécificité. La qualification est similaire, mais vous définissez l'élément auquel le sélecteur s'applique. qualification: ul.classet enchaînement:ul .class

Je ne sais pas ce que vous appelleriez cette technique, mais le comportement est intentionnel et est documenté par le W3C

Les occurrences répétées du même sélecteur simple sont autorisées et augmentent la spécificité.

Que se passe-t-il lorsque la spécificité entre deux règles est identique?

Comme l'a souligné @BoltClock , s'il y a plusieurs déclarations! Importantes, les spécifications dictent que la plus spécifique doit avoir la priorité.

Dans l'exemple ci - dessous, à la fois .fooet .baravoir une spécificité identique, de sorte que le fallsback comportement à la nature en cascade des CSS, dans lequel la dernière règle déclarée dans les revendications CSS priorité à savoir .foo.

HTML

<div>
    <p class="foo bar">foobar</p>
</div>

CSS

.bar {
    color: blue !important;
}
.foo {
    color: red !important;
}

JSFiddle

Jack Tuck
la source