Pourquoi les navigateurs correspondent-ils aux sélecteurs CSS de droite à gauche?

Les sélecteurs CSS

sont appariés par les moteurs de navigation de droite à gauche. Donc ils trouvent d'abord les enfants et vérifient ensuite si leurs parents correspondent au reste des parties de la règle.

  1. pourquoi?
  2. est-ce parce que le cahier des charges le dit?
  3. est-ce que cela a une incidence sur la disposition éventuelle si elle a été évaluée de gauche à droite?

Pour moi, la façon la plus simple serait d'utiliser le sélecteurs avec le moins d'éléments. Donc L'IDs d'abord (comme ils ne doivent retourner qu'un élément). Puis peut - être classes ou un élément qui a le moins de noeuds-par exemple, il peut n'y avoir qu'une portée sur la page, alors allez directement à ce noeud avec n'importe quelle règle qui fait référence à une portée.

Voici quelques liens de sauvegarder mes revendications

  1. http://code.google.com/speed/page-speed/docs/rendering.html
  2. https://developer.mozilla.org/en/Writing_Efficient_CSS

Il semble qu'il est fait de cette façon pour éviter d'avoir à regarder tous les enfants de parent (qui pourrait être beaucoup) plutôt que tous les parents d'un enfant qui doit l'être. Même si le DOM est profond, il ne considérerait qu'un seul noeud par niveau plutôt que plusieurs dans la correspondance RTL. est-il plus facile/plus rapide d'évaluer CSS sélecteurs LTR ou RTL?

508
demandé sur Community 2011-04-27 02:03:36

3 réponses

gardez à l'esprit que lorsqu'un navigateur fait la correspondance avec un sélecteur, il a un élément (celui pour lequel il essaie de déterminer le style) et toutes vos règles et leurs sélecteurs et il a besoin de trouver quelles règles correspondent à l'élément. C'est différent de l'habituel jQuery chose, disons, où vous avez seulement un sélecteur et vous devez trouver tous les éléments qui correspondent au sélecteur.

Si vous n'aviez qu'un sélecteur et un seul élément à comparer à qui sélecteur, puis de gauche à droite fait plus de sens dans certains cas. Mais c'est décidément pas la situation du navigateur. Le navigateur essaie de rendre Gmail ou quoi que ce soit et a celui <span> il essaie de style et les 10.000+ règles Gmail met dans sa feuille de style (Je ne fais pas ce nombre vers le haut).

en particulier, dans la situation où le navigateur regarde la plupart des sélecteurs, il considère ne correspondre à l'élément en question. Le problème est donc de décider qu'un sélecteur ne correspond pas aussi vite que possible; si cela nécessite un peu de travail supplémentaire dans les cas qui correspondent, vous gagnez quand même en raison de tout le travail que vous enregistrez dans les cas qui ne correspondent pas.

si vous commencez par faire correspondre la partie la plus à droite du sélecteur avec votre élément, alors il y a des chances qu'il ne corresponde pas et vous avez terminé. Si elle correspond, vous avez à faire plus de travail, mais seulement proportionnelle à votre profondeur de l'arbre, qui n'est pas de gros dans la plupart des cas.

par contre, si vous commencez par faire correspondre la partie la plus à gauche du sélecteur... que pensez-vous du match contre? Vous devez commencer à marcher sur le DOM, à la recherche de nœuds qui pourraient correspondre. Je découvre qu'il n'y a rien qui corresponde à la partie la plus à gauche qui pourrait prendre un moment.

si les navigateurs match à partir de la droite; il donne un point de départ évident et vous permet de se débarrasser de la plupart des candidats sélecteurs très rapidement. Vous pouvez voir quelques données à http://groups.google.com/group/mozilla.dev.tech.layout/browse_thread/thread/b185e455a0b3562a/7db34de545c17665 (bien que la notation soit confuse), mais le résultat est que pour Gmail en particulier il y a deux ans, pour 70% des paires (rule, element) vous pourriez décider que la règle ne correspond pas après avoir simplement examiné les parties tag/class/id du sélecteur le plus à droite pour la règle. Le nombre correspondant pour la suite de tests de performances pageload de Mozilla était de 72%. Donc, il est vraiment intéressant d'essayer de se débarrasser de ces 2/3 de toutes les règles aussi vite que vous le pouvez et puis ne vous souciez de faire correspondre le tiers restant.

Notez aussi qu'il existe d'autres optimisations que les navigateurs font déjà pour éviter même d'essayer de faire correspondre des règles qui ne correspondront certainement pas. Par exemple, si le sélecteur le plus à droite a un id et que cet id ne correspond pas à l'id de l'élément, alors il n'y aura aucune tentative de faire correspondre ce sélecteur à cet élément dans Gecko: l'ensemble de "sélecteurs avec les Identifiants qui sont tenté vient d'une table de hachage de recherche sur l'identification de l'élément. Donc c'est 70% des règles qui ont une assez bonne chance de correspondre que encore ne correspondent pas après avoir considéré juste l'étiquette/classe/id du sélecteur le plus à droite.

773
répondu Boris Zbarsky 2011-09-07 12:20:56

parsing de droite à gauche, également appelé parsing Ascendant est en fait efficace pour le navigateur.

Considérer ce qui suit:

#menu ul li a { color: #00f; }

Le navigateur vérifie d'abord pour a , alors li , alors ul , et puis #menu .

c'est parce que comme le le navigateur scanne la page il suffit de regarder l'élément/noeud courant et tous les noeuds/éléments précédents qu'il a scanné.

la chose à noter est que le navigateur commence le moment du traitement il obtient une étiquette complète/noeud et n'a pas besoin d'attendre pour la page entière sauf quand il trouve un script, dans ce cas il s'arrête temporairement et achève l'exécution du script et puis va de l'avant.

S'il fait le dans l'autre sens, il sera inefficace parce que le navigateur a trouvé l'élément qu'il numérisait lors de la première vérification, mais il a ensuite été forcé de continuer à chercher dans le document tous les sélecteurs supplémentaires. Pour cela le navigateur doit avoir le html entier et peut avoir besoin de balayer la page entière avant qu'il ne commence la peinture css.

c'est contraire à la façon dont la plupart des libs parlent dom. Là le dom est construit et il n'a pas besoin de scanner la page entière juste trouver le premier élément et puis continuer à faire correspondre les autres à l'intérieur .

23
répondu aWebDeveloper 2018-03-14 07:51:30

il permet de passer de la plus spécifique à la moins spécifique. Il permet également un court-circuit en application. Si la règle plus spécifique s'applique à tous les aspects auxquels la règle parentale s'applique, toutes les règles parentales sont ignorées. S'il y a d'autres bits dans le parent, ils sont appliqués.

si vous allez dans l'autre sens, vous formatez selon le parent et puis écraser chaque fois que l'enfant a quelque chose de différent. Dans le long terme, c'est beaucoup plus travailler que d'ignorer les éléments dans les règles qui sont déjà prises en charge.

19
répondu Gregory A Beamer 2011-04-26 22:13:01