Este es un problema muy común que surge debido a una mala comprensión de cómo :nth-child()
y :nth-of-type()
funcionan. Desafortunadamente, actualmente no existe una solución basada en selectores porque Selectors no proporciona una forma de hacer coincidir el enésimo hijo que coincide con un selector arbitrario basado en un patrón como número impar, número par o cualquier an+b
lugar a != 1
y b != 0
. Esto se extiende más allá de los selectores de clases, a los selectores de atributos, negaciones y combinaciones más complejas de selectores simples.
La :nth-child()
pseudoclase cuenta elementos entre todos sus hermanos bajo el mismo padre. No cuenta solo los hermanos que coinciden con el resto del selector. De manera similar, la :nth-of-type()
pseudoclase cuenta a los hermanos que comparten el mismo tipo de elemento, que se refiere al nombre de la etiqueta en HTML, y no al resto del selector.
Esto también significa que si todos los hijos del mismo padre son del mismo tipo de elemento, por ejemplo, en el caso de un cuerpo de tabla cuyos únicos hijos son tr
elementos o un elemento de lista cuyos únicos hijos son li
elementos, entonces :nth-child()
y :nth-of-type()
se comportará de manera idéntica, es decir para cada valor de an+b
, :nth-child(an+b)
y :nth-of-type(an+b)
coincidirá con el mismo conjunto de elementos.
De hecho, todos los selectores simples en un selector compuesto dado, incluidas las pseudoclases como :nth-child()
y :not()
, funcionan de forma independiente entre sí, en lugar de mirar el subconjunto de elementos que coinciden con el resto del selector.
Esto también implica que no existe una noción de orden entre selectores simples dentro de cada selector compuesto individual 1 , lo que significa, por ejemplo, que los dos selectores siguientes son equivalentes:
table.myClass tr.row:nth-child(odd)
table.myClass tr:nth-child(odd).row
Traducido al inglés, ambos significan:
Seleccione cualquier tr
elemento que cumpla con todas las siguientes condiciones independientes:
- es un hijo impar de su padre;
- tiene la clase "fila"; y
- es un descendiente de un
table
elemento que tiene la clase "myClass".
(notará mi uso de una lista desordenada aquí, solo para llevar el punto a casa)
Debido a que actualmente no existe una solución CSS pura, tendrá que usar un script para filtrar elementos y aplicar estilos o nombres de clases adicionales en consecuencia. Por ejemplo, la siguiente es una solución alternativa común con jQuery (asumiendo que solo hay un grupo de filas poblado con tr
elementos dentro de la tabla):
$('table.myClass').each(function() {
// Note that, confusingly, jQuery's filter pseudos are 0-indexed
// while CSS :nth-child() is 1-indexed
$('tr.row:even').addClass('odd');
});
Con el CSS correspondiente:
table.myClass tr.row.odd {
...
}
Si está utilizando herramientas de prueba automatizadas como Selenium o procesando HTML con herramientas como lxml, muchas de estas herramientas permiten XPath como alternativa:
//table[contains(concat(' ', @class, ' '), ' myClass ')]//tr[contains(concat(' ', @class, ' '), ' row ')][position() mod 2)=1]
Otras soluciones que utilizan diferentes tecnologías se dejan como ejercicio para el lector; este es solo un ejemplo breve y artificial a modo de ilustración.
Por lo que vale, existe una propuesta para agregar una extensión a la :nth-child()
notación al nivel 4 de Selectores con el propósito específico de seleccionar cada enésimo hijo que coincida con un selector dado. 2
El selector por el cual filtrar coincidencias se proporciona como un argumento :nth-child()
, nuevamente debido a cómo los selectores operan de forma independiente entre sí en una secuencia según lo dicta la sintaxis del selector existente. Entonces, en su caso, se vería así:
table.myClass tr:nth-child(odd of .row)
(Un lector astuto notará de inmediato que esto debería ser así :nth-child(odd of tr.row)
, ya que los selectores simples tr
y también :nth-child()
operan independientemente unos de otros. Este es uno de los problemas con las pseudoclases funcionales que aceptan selectores, una lata de gusanos que prefiero no abrir en el medio de esta respuesta. En su lugar, voy a asumir que la mayoría de los sitios no tendrán ningún otro elemento que no sean tr
elementos como hermanos entre sí en el cuerpo de una tabla, lo que haría que cualquiera de las opciones sea funcionalmente equivalente).
Por supuesto, al ser una propuesta completamente nueva con una especificación completamente nueva, esto probablemente no verá implementación hasta dentro de unos años. Mientras tanto, tendrá que seguir usando un script, como se indicó anteriormente.
1 Si especifica un tipo o selector universal, debe ir primero. Sin embargo, esto no cambia el funcionamiento fundamental de los selectores; no es más que un capricho sintáctico.
2 Esto se propuso originalmente porque :nth-match()
, sin embargo, debido a que todavía cuenta un elemento en relación solo con sus hermanos, y no con todos los demás elementos que coinciden con el selector dado, desde 2014 se ha reutilizado como una extensión del existente :nth-child()
.
Realmente no..
cita de los documentos
Es un selector propio y no se combina con clases. En su regla, solo tiene que satisfacer ambos selectores al mismo tiempo, por lo que mostrará las
:nth-child(even)
filas de la tabla si también tienen el.row
clase.fuente
nth-of-type
funciona de acuerdo con el índice del mismo tipo de elemento, peronth-child
funciona solo de acuerdo con el índice, sin importar qué tipo de elementos hermanos sean.Por ejemplo
Supongamos que en el html anterior queremos ocultar todos los elementos que tienen la clase de descanso.
En este caso
nth-child
, ynth-of-type
funcionará exactamente igual que todos los elementos son del mismo tipo que es<div>
por lo que debe ser cssO
Ahora debes preguntarte cuál es la diferencia entre
nth-child
ynth-of-type
entonces esta es la diferenciaSuponga que el html es
En el html anterior el tipo de
.rest
elemento es diferente a otros.rest
son párrafos y otros son div así que en este caso si lo usasnth-child
tienes que escribir asípero si usa nth-of-type css puede ser esto
fuente
<tr>
etiquetas?Es posible que pueda hacer eso con xpath. algo como
//tr[contains(@class, 'row') and position() mod 2 = 0]
podría funcionar. Hay otras preguntas de SO que amplían los detalles sobre cómo hacer coincidir las clases con mayor precisión.fuente
Aqui esta tu respuesta
fuente
Todas las preguntas sobre el uso de nth-child y omitir etiquetas ocultas parecen estar redirigiendo como engaños de esta, así que dejaré esto aquí. Encontré este blog https://blog.blackbam.at/2015/04/09/css-nth-child-selector-ignore-hidden-element/ que usa un enfoque inteligente de CSS para hacer que nth-child ignore los elementos ocultos, como sigue:
El siguiente CSS agrega un margen derecho a cada segundo elemento visible sin importar qué elemento tenga la clase cpw.
¡Espero que ayude a alguien que está siguiendo el rastro de los incautos para ignorar las preguntas de elementos ocultos!
fuente
SI tiene la misma clase principal para todos los selectores, entonces usa esa clase
document.querySelector("main .box-value:nth-child(3) select.priorityOption");
porque en ese casodocument.querySelector("main .box-value select.priorityOption:nth-child(3)");
no funciona. Graciasfuente