¿Por qué los navegadores coinciden con los selectores CSS de derecha a izquierda?


Los selectores CSS son emparejados por los motores del navegador de derecha a izquierda. Así que primero encuentran a los niños y luego comprueban a sus padres para ver si coinciden con el resto de las partes de la regla.

  1. ¿Por qué es esto?
  2. ¿Es solo porque la especificación dice?
  3. ¿Afecta el diseño eventual 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. Así que IDs primero (como solo deberían devuelve 1 elemento). Entonces tal vez clases o un elemento que tiene el menor número de nodos - por ejemplo, puede que solo haya un span en la página, así que vaya directamente a ese nodo con cualquier regla que haga referencia a un span.

Aquí hay algunos enlaces que respaldan mis afirmaciones

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

Suena como que se hace de esta manera para evitar tener mirar a todos los hijos de los padres (que podrían ser muchos) en lugar de todos los padres de un niño que debe ser uno. Incluso si el DOM es profundo, solo miraría un nodo por nivel en lugar de varios en la coincidencia RTL. ¿Es más fácil/más rápido evaluar los selectores CSS LTR o RTL?

Author: Community, 2011-04-27

3 answers

Tenga en cuenta que cuando un navegador está haciendo coincidir el selector, tiene un elemento (el que está tratando de determinar el estilo) y todas sus reglas y sus selectores, y necesita encontrar qué reglas coinciden con el elemento. Esto es diferente de lo habitual de jQuery, por ejemplo, donde solo tienes un selector y necesitas encontrar todos los elementos que coincidan con ese selector.

Si solo tiene un selector y solo un elemento para comparar con ese selector, entonces de izquierda a derecha hace más sentido en algunos casos. Pero eso es decididamente no la situación del navegador. El navegador está tratando de representar Gmail o lo que sea y tiene la <span> que está tratando de estilo y las 10,000+ reglas Gmail pone en su hoja de estilo (no estoy inventando ese número).

En particular, en la situación en la que el navegador está mirando la mayoría de los selectores que está considerando no coinciden con el elemento en cuestión. Así que el problema se convierte en uno de decidir que un selector no coincide tan rápido como es posible; si requiere un poco de trabajo extra en los casos en que coinciden ganar debido a todo el trabajo que salvo en los casos que no coinciden.

Si empiezas haciendo coincidir la parte más a la derecha del selector con tu elemento, entonces es probable que no coincida y ya está. Si coincide, tienes que hacer más trabajo, pero solo proporcional a la profundidad de tu árbol, que no es tan grande en la mayoría de los casos.

Por otro lado, si usted comienza por hacer coincidir la parte más a la izquierda de la selector... ¿contra qué lo comparas? Tienes que empezar a caminar por el DOM, buscando nodos que puedan coincidir con él. Sólo descubrir que no hay nada que coincida con la parte más a la izquierda podría tomar un tiempo.

Así que los navegadores coinciden desde la derecha; da un punto de partida obvio y le permite deshacerse de la mayoría de los selectores candidatos muy rápidamente. Puedes ver algunos datos en http://groups.google.com/group/mozilla.dev.tech.layout/browse_thread/thread/b185e455a0b3562a/7db34de545c17665 (aunque la notación es confusa), pero el resultado es que para Gmail, en particular, hace dos años, para el 70% de los pares (regla, elemento), podría decidir que la regla no coincide después de examinar las partes de etiqueta/clase/id del selector más a la derecha de la regla. El número correspondiente para el conjunto de pruebas de rendimiento de carga de páginas de Mozilla fue del 72%. Así que vale la pena intentarlo para deshacerse de esos 2/3 de todas las reglas lo más rápido que pueda y luego solo preocuparse por hacer coincidir el 1/3 restante.

Tenga en cuenta también que hay otras optimizaciones que los navegadores ya hacen para evitar incluso tratar de coincidir con reglas que definitivamente no coincidirán. Por ejemplo, si el selector de la derecha tiene un id y ese id no coincide con el id del elemento, entonces no habrá ningún intento de emparejar ese selector con ese elemento en absoluto en Gecko: el conjunto de "selectores con ID" que se intentan proviene de una búsqueda de hashtable en el ID del elemento. Así que este es el 70% de las reglas que tienen una muy buena probabilidad de coincidir que todavía no coinciden después de considerar solo la etiqueta/clase/id del selector de la derecha.

 773
Author: Boris Zbarsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-07 12:20:56

El análisis de derecha a izquierda, también llamado el análisis de abajo hacia arriba es realmente eficiente para el navegador.

Considere lo siguiente:

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

El navegador comprueba primero a, entonces li, entonces ul, y, a continuación,#menu.

Esto se debe a que mientras el navegador está escaneando la página, solo necesita mirar el elemento/nodo actual y todos los nodos/elementos anteriores que ha escaneado.

Lo que hay que tener en cuenta es que el navegador comienza a procesar en el momento en que obtiene una etiqueta/nodo completo y no necesita esperar toda la página excepto cuando encuentra un script, en cuyo caso se detiene temporalmente y completa la ejecución del script y luego continúa.

Si lo hace al revés, será ineficiente porque el navegador encontró el elemento que estaba escaneando en la primera comprobación, pero luego se vio obligado a seguir buscando en el documento todos los selectores adicionales. Para ello el navegador necesita tener todo el html y puede necesitar escanear toda la página antes de que comience la pintura css.

Esto es contrario a cómo la mayoría de las libs analizan dom. Allí se construye el dom y no necesita escanear toda la página, solo encuentra el primer elemento y luego sigue haciendo coincidir otros dentro de él .

 23
Author: aWebDeveloper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-14 07:51:30

Permite la cascada de lo más específico a lo menos específico. También permite un cortocircuito en la aplicación. Si la regla más específica se aplica en todos los aspectos a los que se aplica la regla principal, se ignoran todas las reglas principales. Si hay otros bits en el padre, se aplican.

Si fuera al revés, formatearía de acuerdo con el padre y luego sobrescribiría cada vez que el hijo tenga algo diferente. A largo plazo, esto es mucho más trabajo que ignorar elementos en las reglas que ya están atendidos.

 19
Author: Gregory A Beamer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-26 22:13:01