Pourquoi les navigateurs match CSS sélecteurs de droite à gauche?

Sélecteurs CSS sont appariés par les moteurs de navigateur de droite à gauche. Afin qu'ils trouvent d'abord les enfants, puis vérifier leurs parents pour voir s'ils correspondent au reste des pièces de la règle.

  1. Pourquoi est-ce?
  2. Est-ce juste parce que la spec dit?
  3. - T-il sur l'éventuelle mise en page si elle a été évaluée à partir de la gauche vers la droite?

Pour moi la façon la plus simple serait d'utiliser les sélecteurs avec le moins d'éléments. Si Id de en premier (comme ils devraient le retour 1 élément). Alors peut-être que les classes ou un élément qui a le plus petit nombre de nœuds (par exemple, il peut y avoir seulement une travée sur la page pour aller directement à ce nœud avec une règle qui fait référence à une duré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 porterait que sur un nœud par niveau plutôt que de multiples dans la RTL de correspondance. Est-il plus facile/rapide à évaluer les sélecteurs CSS LTR ou RTL?

  • 3. No - No importe comment vous le lire, le sélecteur correspond toujours au même ensemble d'éléments.
  • L'analyse de sorte que vous suggérez ne serait pas vraiment effectuer car il nécessite d'avoir accès à la DOM beaucoup. J'avais l'analyser à partir de la gauche vers la droite, et, sans doute, de sélecteurs comme jQuery d'analyser, de gauche à droite.
  • Vidas - Alors pourquoi est-il fait de droite à gauche?
  • Mais pourquoi ne pas les moteurs de navigateur?
  • J'ai pensé à du jQuery grésillement moteur traversé droit->gauche et utilisés intégré dans les optimisations (comme lorsque le sélecteur commence avec une pièce d'identité)
  • Pour ce que ça vaut, un navigateur ne peut pas supposer que votre Id sont uniques. Vous pourriez rester le même id="foo" tous les dessus de votre DOM, et un #foo sélecteur aurait besoin pour correspondre à tous les nœuds. jQuery a le choix de dire que $("#foo") renverra toujours juste l'un des éléments, parce qu'ils sont la définition de leurs propres API avec ses propres règles. Mais les navigateurs ont besoin pour mettre en œuvre CSS, CSS et dit pour correspondre à tout le document avec l'ID donné.
  • La question semble être le sélecteur correspondant et non pas sur le sélecteur de l'analyse.
  • Zbarsky — à la Fois le HTML et le CSS spécifications dire que l'Id doit être unique. Correspondance tout est une décision fait en sorte que l'erreur de récupération peut être effectuée sur la mauvaise documents, non pas parce que la spec dit.
  • Le CSS3 spec sur sélecteurs d'ID, dit un sélecteur d'ID correspond à "aucun élément" ID plutôt que de "l'élément" avec elle.
  • il dit aussi: "Ce qui rend les attributs de type ID de spécial, c'est que le pas de deux de ces attributs peuvent avoir la même valeur dans un document conforme"
  • Dans un "nonconformant" (HTML) Id de document qui peut être non-unique, et, dans ces documents, CSS nécessite correspondant à tous les éléments avec cet IDENTIFIANT. CSS lui-même n'attache pas d'exigences normatives sur les numéros étant unique; le texte que vous citez est instructif.
  • Zbarsky Ce que jQuery ne dépend sur le chemin de code à l'intérieur de jQuery. Dans certains cas, jQuery utilise le NodeSelector API native ( querySelectorAll ). Dans d'autres cas, le Grésillement est utilisé. Grésillement ne correspond pas à de multiples Identifiants mais QSA n' (AYK). Le chemin d'accès dépend du sélecteur, le contexte, et le navigateur et sa version. jQuery Requête API utilise ce que j'ai appelé "Natif d'Abord, la Double Approche". J'ai écrit un article sur ça, mais c'est vers le bas. Bien que vous pouvez trouver ici: fortybelow.ca/hosted/dhtmlkitchen/JavaScript-Query-Engines.html
  • À aucun moment dans l'ensemble de la spec -- dans la version de la spécification -- ne mentionne pas le résultat de la tentative d'appliquer le style CSS à un document non valide. (En fait, l'un de l'errata est une remarque pour résoudre certains mal formé HTML, plutôt que de prendre de l'occasion pour ajouter une note que les styles doivent toujours être appliqués.) Pour ce qui est peu sur les Id d'être unique? Qui est normatif, comme tous les autres bits de texte dans la spec, sauf indication contraire.
  • Il n'y a pas une telle chose comme non valide "document" dans la mesure du CSS est concerné. CSS fonctionne sur un élément abstrait arbre. Le langage HTML définit de la façon dont cet arbre est construit, et il définit la façon de faire de même pour les documents qui ne répondent pas à la création de la conformité des critères. De sorte que le résultat de l'application de CSS à un document ayant les mêmes Id est en fait complètement défini par la combinaison des deux spécifications. Pour ce qui est normatif, c'est sûr qu'il est: comme une exigence de création. Dupliqué id ne validez pas, mais qui n'affecte pas le Samu sont censés traiter.
  • Voici un exemple d'utilisation du DOM (qui travaille également sur un élément de l'arbre) au lieu de CSS. Jetez un oeil à dom.spec.whatwg.org/#dom-document-getelementbyid et notez l'utilisation de "le premier élément dans l'arbre de commande". Pourquoi pensez-vous qu'il dit ça, exactement? Parce que les id peuvent en fait être dupliqué si l'auteur n'est pas l'auteur d'une validation d'un document, et le DOM est pour ça.
  • Les DOM n'. CSS ne fonctionne pas. Il serait tout aussi correct d'appliquer #whatever's styles exactement à l'un des éléments retournés par document.getElementById('whatever'). Il est indiqué explicitement dans le CSS que les Id sont uniques. Vous de briser cette règle, il n'y a pas de règle sur la façon dont la mise en œuvre doit se comporter.
  • Parce que le DOM est d'être capable de gérer des documents non valides, et il est de spécifier comment gérer une situation qui ne devrait pas exister sans exploser?
  • Bien sûr, mais les mêmes considérations s'appliquent à la CSS.
  • La chose est, le CSS membres du groupe de travail ne sont pas d'accord avec vous, le navigateur, les implémentations ne sont pas d'accord avec vous, et les sites web dépendent du comportement du navigateur implémentations ont: c'est en fait commune pour les sites ont répété Id et dépendent de style de l'id de style de tous les éléments. Alors que d'autres théorique de la pureté, quel est l'avantage de votre argument, si je peux demander?
  • Vous avez fait quelques points décents, cependant, je ne vois pas comment vous pensez que le CSS membres du groupe de travail de voir les choses à votre façon, quand les seules choses que j'ai vu dans la spec dire le contraire. Certains navigateur implémentations peut/va le style de plusieurs éléments avec la même valeur d'ID le même (pas tous, mais tous de le top 4 au moins), et il n'est vraiment pas commun pour les sites ont répété Id et en dépendent. Il est assez rare d'en voir une, et je ne pense pas que j'ai jamais vu un en dépendent. Pouvez-vous citer 3? Je peux vous dire le plus couramment utilisé bibliothèque javascript n'est PAS d'accord avec vous.
  • Désolé, je dois dire que 2 des plus couramment utilisé des librairies javascript (jQuery et prototype.js), vous obtiendrez uniquement un élément lors de invité à sélectionner par id. Prototype: jsfiddle.net/CTZT6 jQuery: jsfiddle.net/CTZT6/1
  • MooTools aussi ne renvoie qu'un seul élément donné un sélecteur d'id: jsfiddle.net/CTZT6/2
  • L'avantage est de ne pas avoir à vous soucier de comportement qui n'a pas été spécifié nulle part. Le CSS groupe de travail ne semble pas d'accord avec l'un de nous, en considérant qu'ils n'ont pas fait une seule déclaration officielle de toute façon-sauf pour la déclaration officielle dans les specs que les Id sont uniques, bien sûr, qui donne plus de poids à mon argument que la vôtre. 😛 Pas de navigateur sur la Terre est nécessaire pour agir de la manière qu'il le fait, aussi loin que CSS est concerné, et en s'appuyant sur un comportement non spécifié est tout simplement mauvais codage.
  • L'avantage est en faveur de la promotion de la garantie comportement cohérent entre le CSS et le JS. Si vos Identifiants ne sont pas uniques, vous n'avez absolument aucune garantie de toute façon sur ce qui va arriver, sauf si vous voulez lancer une "ce site fonctionne en..." avertissement sur votre page.
  • Je pense qu'ils voient les choses à ma manière, parce que j'ai parlé à eux. Qui vous peut trop: juste envoyer un mail à [email protected]. Et comme pour les sites, il y a beaucoup de templating des choses que d'utiliser des id pour le style, alors qu'ils devraient être à l'aide de classes.... et non, jQuery ne le fait pas lorsque vous utilisez son sélecteur de choses, mais cela ne signifie pas que les sites ne dépendent pas le moteur CSS de le faire.
  • Ne pas se soucier de comportement "n'est pas spécifié nulle part" est inutile si c'est standard de facto. Bien sûr, ce comportement est spécifié: CSS dit match des choses qui ont un ID donné et que la langue du document définit ce que signifie avoir un ID. HTML qui définit les choses ont qui IDs. Le résultat est que plusieurs éléments peuvent avoir le même IDENTIFIANT. Vous devez vraiment essayer de tordre les specs autour et maigre dur sur la non-normatif de pièces à venir à une autre conclusion.
  • Il ne faut rien de plus qu'une lecture littérale de toutes les normatives de la documentation. Pas de torsion nécessaire. Il prend plus de, comme une dépendance sur un comportement qui n'est pas documenté n'importe où, pour arriver à la conclusion que le comportement indéfini est en quelque sorte défini.
  • Oh, je vois le problème principal. Il n'y a pas une telle chose comme "un comportement indéfini" dans les specs (pas les bonnes, au moins). Nous avons essayé; c'était une épouvantable échec. Spécifications maintenant définir le comportement dans toutes les situations. Si vous voyez un comportement indéfini, soit c'est un spec bug ou il vous manque quelque chose.
  • Montrez-moi la spécification qui définit comment le CSS doit se comporter lorsque l'UC est présenté avec une défaillance de document. Le CSS n'est certainement pas, et en fait il sort de sa façon de ne pas.
  • En fait, je vais régler pour les normes de facto dans ce cas. Montrez-moi où les éditeurs de navigateurs ont documenté leurs respectifs Samu comportement dans un tel cas.
  • d'où vient le CSS dire quoi que ce soit de la sorte? Il n'a même pas la notion de "document non valide" dans le texte normatif. En outre, notez que dev.w3.org/csswg/selectors4/#id-selectors explicitement dit que "C'est possible à la non-conformité des documents de plusieurs éléments correspondre à un seul sélecteur d'ID."
  • Voir, maintenant, le texte qui ressemble quelque peu à celle qui est nécessaire pour être dans un fini spec avant que vous pouvez dire "CSS exige" quoi que ce soit. Il doit être plus explicitement formulée avant ça compte comme une exigence, bien que; quelque chose comme, "Dans un non-conforme du document, un sélecteur d'ID doit correspondre à tous les éléments dont l'attribut ID est le même que l'identifiant dans le sélecteur." "Possible" est plus un "peut être" qu'un "must", et il est assez facile d'imaginer un UA abandon illégal attributs ID du document, sauf si cela est explicitement tenus de les conserver pour une raison quelconque.
  • Le texte que je cite est instructif, tout comme le reste de ce texte. Il n'y a pas de changement en ce que la spécification exige, juste une explication plus claire pour les personnes qui semblait être confus au sujet de ce qu'elle exige. C'est pourquoi il ne dit pas "doit": c'est un non-sens pour le texte informatif.
  • Alors, il n'y a pas encore de texte normatif décrivant une exigence pour tout comportement particulier dans ce cas.
  • Bien sûr, il est. Vous êtes juste délibérément ignorer.
  • Puis montrez-moi. Assurez-il assez évident que même je ne peux pas le nier. Qu'il suffirait d'un lien de texte normatif indiquant clairement l'exigence. J'ai demandé à une demi-douzaine de fois de voir un tel texte, et vous avez encore à produire un lien. J'ai regardé les specs d'un certain nombre de fois moi-même, et ne peut pas trouver les mots d'orthographe à une telle exigence-et le seul texte que j'ai vu encore visiblement évite de dire un ou déclare explicitement que les Id doit être unique. Généralement, les deux.
  • Il n'y a aucun texte normatif à le dire explicitement, tout comme il n'existe aucun texte normatif qui dit explicitement que les deux éléments de la même catégorie sont compensées par un sélecteur de classe et aucun texte normatif disant que le navigateur ne doit pas se bloquer lors de l'analyse des CSS. Le normatifs pertinents bits sont w3.org/TR/css3-selectors/#id-selectors qui dit " Un sélecteur d'ID représente un élément de l'instance qui a un identifiant qui correspond à l'identifiant dans le sélecteur d'ID." Il ne définit pas comment dire ce que l'identificateur de l'élément a; c'est la langue du document, donc HTML.
  • Et la langue du document spec a "L'id de l'attribut spécifie son élément d'identifiant unique (ID). [DOM]" c'est tout. C'est la pleine mesure de le texte normatif sur la question pour l'agriculture urbaine des réalisateurs. Si vous venez de mettre en œuvre sans essayer de lire entre les lignes, vous pouvez obtenir le comportement que chaque navigateur.
  • Et si vous n'lire "entre les lignes", il est tout à fait possible d'écrire un UA qui suit la spécification de la lettre et de ne pas faire ce que tu demande (sans preuve) que la spec "exige". Puisque, par définition, un double de l'identifiant unique ne peut pas exister, il n'y a pas de texte en disant que le navigateur a à faire avec les documents qui en ont. Il pourrait tomber à tout, mais la première en double, par exemple, et être à 100% HTML5 - et-CSS3-conforme. Elle pourrait continuer à le premier, ou le dernier, ou un hasard un des dupes et être compatible avec HTML4 -- et, de nouveau, avec CSS3.
  • Un navigateur qui ne soit une de ces choses ne seraient pas en mesure de style plus qu'un #whatever, cause il ne pourrait jamais être plus qu'un #whatever. Et comme tous les spec que j'ai jamais vu, que le navigateur est encore 100% compatible avec tous les d'entre eux.
  • Lire entre les lignes avec des spécifications va vous causer des ennuis. En particulier, vous ne serez pas en fait être conformes aux spécifications dans ce cas, parce que la spécification auteurs supposent que vous ne lisez PAS entre les lignes. S'ils avaient eu à assumer ce que vous faites et couvrent toutes les entre-ligne-lecture dans les spécifications les spécifications voudrais obtenir ridiculement difficile à manier.
  • Dans tous les cas, si vous pensez que les spécifications ont besoin d'amélioration, n'hésitez pas à soumettre vos commentaires. [email protected] pour le CSS, [email protected] pour HTML.
  • Je considère que c'est une partie de mon travail à lire entre les lignes -- pour vérifier mes hypothèses et de différencier entre ce qui est réellement nécessaire et ce qui est le plus souvent mise en œuvre du mécanisme d'aujourd'hui. Oui, entièrement d'erreur spécifiant le comportement conduit par un très profond trou de lapin, et aller tout le chemin du fait de la spec lourd...mais tout comportement non spécifié est par définition non précisée, et est donc ouverte à l'interprétation. OMI HTML5 ne doit jamais descendu dans le trou en premier lieu, c'est précisément pour cette raison. (Bien, et qui va tout le chemin serait de faire un code HTML valide hors de propos.)
  • Votre idée de comment web specs de travail n'est pas la façon dont ils travaillent, parce que faire de cette façon conduit à d'énormes problèmes d'interopérabilité. C'est pourquoi web moderne spécifications visent à spécifier entièrement tout le comportement. Si vous voyez un cas où le problème semble être spécifiée, alors la spécification est buggy ou vous êtes en train de lire ce mal (et il peut encore être buggé car il peut être mal lu).
  • Le point essentiel de la définition de la syntaxe et de la conformité des critères est-à-dire "Si ton truc ressemble à ça, les implémentations de la comprendre. Si ça ne marche pas, nous ne pouvons pas garantir les résultats escomptés." La deuxième phrase est ce qui fait que la première phrase vaut la peine de dire à tous. Un langage de spécification peut pas mandat de comportement (autres que "considérer le contenu de $LANGUAGE") pour chaque non-conformité de cas. C'est à présent hors de sa portée, et en essayant de le faire le transforme en un UA spec -- et en HTML, devrait faire l'valididty de la langue elle-même totalement hors de propos.
  • Le "formidable interop questions" en raison de code HTML non valide ont été/sont parce que le document n'est pas conforme aux règles de la langue qu'il prétend être en utilisant. Garbage in, Garbage out. Les règles ne sont pas secrètes; les plus importants ne sont même pas compliqué. Il n'y a aucune excuse pour les casser, et la dernière chose vaut la peine d'langage de spécification doit être fait est de soutenir, a déclaré la rupture.
  • Non, tout le point de la définition de web des specs, c'est pour assurer l'interopérabilité. La définition de la syntaxe est en grande partie là de sorte que vous pouvez définir clairement les points d'extensibilité. CSS spécifications visent à mandat de comportement pour tous les non-conforme, le contenu, tout comme le HTML, et ce depuis des années. Et le "interop" problèmes " dont je parle n'ont pas été en raison de code HTML non valide, mais plutôt à la CSS de problèmes soit avec de la Samu à défaut de mettre en œuvre la spécification des exigences correctement parce qu'ils ont lu entre les lignes ou les spec explicitement appeler les choses indéfini, puis être forcé de spec non-sens de la Samu mis en œuvre et les sites assumé.
  • en tout cas, l'autre confusion ici, c'est que le but principal de la CSS des specs, c'est, en fait, être un UA spec, pas un langage de spécification. L'autre a été essayé et a échoué.
  • Le fait que l'on peut même lire entre les lignes signifie que les spécifications ne couvre pas tous les cas. La spec auteurs ont délibérément évité de le faire ou a échoué lamentablement. (Je suis en supposant que la première, la cause (1) tous les éléments de preuve disponibles points dans cette direction, malgré votre ascriptions à l'intention des auteurs, et (2) ce ne sont pas des idiots. :P) de toute façon, un littéral de lire les spécifications des feuilles non négligeables partie de l'erreur de comportement non spécifié. Et une lecture littérale est la seule option quand vous êtes à essayer de comprendre ce qui est réellement nécessaire dans ces cas.
  • Comme pour la définition de la syntaxe, de la sémantique, etc, si vous êtes à droite, puis c'est tout à fait discutable. Je peux écrire la soupe de tags et de le faire travailler comme fiable par tous les temps. Pourquoi des soins, si le HTML fait conforme à tous?
  • Pourquoi les soins à tous? Si tout ce qui vous intéresse est à quoi il ressemble dans visual Samu, il n'y a pas de raison; c'est pourquoi presque personne ne s'en soucie dans la pratique. Si vous voulez que votre code HTML pour être plus facile à gérer et plus sémantiquement significatifs, et peut-être plus rapide à calculer, il peut y avoir des raisons de soins.
  • Je ne suis même pas sûr que personne d'autre que vous deux pouvez comprendre ce qu'il se passe avec cette longue conversation. Nous n'avons chat pour ces longues discussions. Tout ce que vous voulez vraiment garder autour de doit être mis en question ou une réponse, surtout si elle est de clarifier l'information. Un Débordement de pile ne gère pas la discussion dans les commentaires bien.
  • Je peux, et je peux dire que la plupart de tout ce qui était discuté appartient pas TELLEMENT, mais dans une liste de diffusion.
  • Je devrais peut-être commenté ici plus tôt, mais c'est très simple: soit les règles du jeu, ou des risques de la croix-navigateur incohérences. C'est tout là est à lui. Si vous avez raison "je n'ai pas de soins pour les règles, parce qu'il regarde la façon dont je le veux dans le navigateur", alors vous n'avez pas testé assez de navigateurs. Si vous avez des Id en double dans votre code HTML, les différents navigateurs sera de retour à des résultats différents. Regardez ce document avec IE, Edge, Chrome, Firefox. Je repose mon cas.

InformationsquelleAutor tgandrews | 2011-04-26