¿Puede CSS detectar la cantidad de hijos que tiene un elemento?

Probablemente responda mi propia pregunta, pero soy extremadamente curioso.

Sé que CSS puede seleccionar hijos individuales de un padre, pero ¿hay compatibilidad para darles estilo a los hijos de un contenedor, si el padre tiene una cierta cantidad de hijos?

por ejemplo

container:children(8) .child { //style the children this way if there are 8 children } 

Sé que suena raro, pero mi gerente me pidió que lo revisara, no había encontrado nada por mi cuenta, así que decidí recurrir a SO antes de finalizar la búsqueda.

Aclaración:

Debido a una frase anterior en la pregunta original, algunos ciudadanos de SO han expresado su preocupación de que esta respuesta podría ser engañosa. Tenga en cuenta que, en CSS3, los estilos no se pueden aplicar a un nodo primario en función de la cantidad de hijos que tenga. Sin embargo, los estilos se pueden aplicar a los nodos hijos según la cantidad de hermanos que tengan.


Respuesta original:

Increíblemente, esto ahora es posible solo en CSS3.

 /* one item */ li:first-child:nth-last-child(1) { /* -or- li:only-child { */ width: 100%; } /* two items */ li:first-child:nth-last-child(2), li:first-child:nth-last-child(2) ~ li { width: 50%; } /* three items */ li:first-child:nth-last-child(3), li:first-child:nth-last-child(3) ~ li { width: 33.3333%; } /* four items */ li:first-child:nth-last-child(4), li:first-child:nth-last-child(4) ~ li { width: 25%; } 

El truco es seleccionar el primer hijo cuando también es el n-ésimo-último-hijo. Esto selecciona efectivamente en función del número de hermanos.

El crédito por esta técnica es para André Luís (descubierto) y Lea Verou (refinado).

¿No te encanta CSS3? 😄

Ejemplo de CodePen:

Fuentes:

No. Bueno, en realidad no. Hay un par de selectores que pueden acercarte un poco, pero probablemente no funcionen en tu ejemplo y no tengan la mejor compatibilidad con el navegador.

:only-child

El :only-child es uno de los pocos selectores de conteo verdadero en el sentido de que solo se aplica cuando hay un elemento secundario del elemento primario. Usando tu ejemplo idealizado, actúa como los children(1) probablemente lo harían.

:nth-child

El selector :nth-child en realidad puede llevarlo a donde quiere ir dependiendo de lo que realmente desea hacer. Si quieres peinar todos los elementos si hay 8 niños, no tienes suerte. Sin embargo, si desea aplicar estilos al 8º y posteriores elementos, intente esto:

 p:nth-child( n + 8 ){ /* add styles to make it pretty */ } 

Desafortunadamente, estas probablemente no son las soluciones que estás buscando. Al final, es probable que necesite utilizar alguna magia de Javascript para aplicar los estilos en función del recuento, incluso si tuviera que usar uno de estos, necesitaría examinar detenidamente la compatibilidad del navegador antes de utilizar un sistema puro. Solución CSS

W3 CSS3 Spec en pseudo-clases

EDITAR Leí su pregunta de forma un poco diferente: hay otras dos maneras de darle estilo al padre , no a los niños. Déjame lanzar algunos otros selectores a tu manera:

:empty y :not

Este estilos elementos que no tienen hijos. No es tan útil por sí solo, pero cuando se combina con el selector :not , solo puede diseñar los elementos que tienen hijos:

 div:not(:empty) { /* We know it has stuff in it! */ } 

No puede contar cuántos hijos hay disponibles con CSS puro aquí, pero es otro selector interesante que le permite hacer cosas geniales.

NOTA: Esta solución devolverá los elementos secundarios de conjuntos de ciertas longitudes, no el elemento principal como lo ha pedido. Con suerte, sigue siendo útil.

A Andre Luis se le ocurrió un método: http://lea.verou.me/2011/01/styling-children-based-on-their-number-with-css3/ Lamentablemente, solo funciona en IE9 y superior.

Esencialmente, combina: nth-child () con otras pseudo clases que se ocupan de la posición de un elemento. Este enfoque le permite especificar elementos de conjuntos de elementos con longitudes específicas .

Por ejemplo :nth-child(1):nth-last-child(3) coincide con el primer elemento de un conjunto y también es el tercer elemento desde el final del conjunto. Esto hace dos cosas: garantiza que el conjunto solo tiene tres elementos y que tenemos el primero de los tres. Para especificar el segundo elemento del conjunto de tres elementos, usaríamos :nth-child(2):nth-last-child(2) .

Ejemplo 1 – Seleccione todos los elementos de la lista si el conjunto tiene tres elementos:

 li:nth-child(1):nth-last-child(3), li:nth-child(2):nth-last-child(2), li:nth-child(3):nth-last-child(1) { width: 33.3333%; } 

Ejemplo 1 alternativo de Lea Verou:

 li:first-child:nth-last-child(3), li:first-child:nth-last-child(3) ~ li { width: 33.3333%; } 

Ejemplo 2 – objective último elemento del conjunto con tres elementos de lista:

 li:nth-child(3):last-child { /* I'm the last of three */ } 

Ejemplo 2 alternativo:

 li:nth-child(3):nth-last-child(1) { /* I'm the last of three */ } 

Ejemplo 3: objective del segundo elemento del conjunto con cuatro elementos de lista:

 li:nth-child(2):nth-last-child(3) { /* I'm the second of four */ } 

Trabajando con la solución de Matt, utilicé la siguiente implementación de Compass / SCSS.

 @for $i from 1 through 20 { li:first-child:nth-last-child( #{$i} ), li:first-child:nth-last-child( #{$i} ) ~ li { width: calc(100% / #{$i} - 10px); } } 

Esto le permite expandir rápidamente la cantidad de elementos.

sí, podemos hacer esto usando nth-child como tal

 div:nth-child(n + 8) { background: red; } 

Esto hará que el 8vo div niño en adelante se vuelva rojo. Espero que esto ayude…

Además, si alguien alguna vez dice “hey, no se puede hacer con estilo usando css, ¡use JS!” duda de ellos de inmediato. CSS es extremadamente flexible hoy en día

Ejemplo :: http://jsfiddle.net/uWrLE/1/

En el ejemplo, los primeros 7 niños son azules, luego 8 en adelante son rojos …

Si va a hacerlo en CSS puro (usando scss) pero tiene diferentes elementos / clases dentro de la misma clase para padres, puede usar esta versión.

  &:first-of-type:nth-last-of-type(1) { max-width: 100%; } @for $i from 2 through 10 { &:first-of-type:nth-last-of-type(#{$i}), &:first-of-type:nth-last-of-type(#{$i}) ~ & { max-width: (100% / #{$i}); } } 

No, no hay nada como esto en CSS. Sin embargo, puede usar JavaScript para calcular el número de hijos y aplicar estilos.