Los selectores de CSS coinciden con los motores del navegador de derecha a izquierda. Entonces, primero encuentran a los niños y luego verifican a sus padres para ver si coinciden con el resto de las partes de la regla.
- ¿Por qué es esto?
- ¿Es solo porque la especificación dice?
- ¿Afecta el diseño final si se evaluó de izquierda a derecha?
Para mí, la forma más sencilla de hacerlo sería utilizar los selectores con el menor número de elementos. Entonces, los ID primero (ya que solo deberían devolver 1 elemento). Entonces, tal vez clases o un elemento que tenga el menor número de nodos, por ejemplo, puede haber solo un intervalo en la página, así que vaya directamente a ese nodo con cualquier regla que haga referencia a un intervalo.
Aquí hay algunos enlaces que respaldan mis afirmaciones
- http://code.google.com/speed/page-speed/docs/rendering.html
- https://developer.mozilla.org/en/Writing_Efficient_CSS
Parece que se hace de esta manera para evitar tener que mirar a todos los hijos de los padres (que podrían ser muchos) en lugar de a todos los padres de un niño que debe ser uno. Incluso si el DOM es profundo, solo vería un nodo por nivel en lugar de múltiples en la coincidencia RTL. ¿Es más fácil / rápido evaluar los selectores CSS LTR o RTL?
#foo
selector necesitaría coincidir con todos esos nodos. jQuery tiene la opción de decir que $ ("# foo") siempre devolverá solo un elemento, porque están definiendo su propia API con sus propias reglas. Pero los navegadores necesitan implementar CSS, y CSS dice que haga coincidir todo en el documento con la ID dada.
querySelectorAll
). En otros casos, se usa Sizzle. Sizzle no coincide con múltiples ID pero QSA sí (AYK). La ruta tomada depende del selector, el contexto y el navegador y su versión. La API de consulta de jQuery utiliza lo que he denominado "Native First, Dual Approach". Escribí un artículo sobre eso, pero está abajo. Aunque puede encontrar aquí: fortybelow.ca/hosted/dhtmlkitchen/JavaScript-Query-Engines.html