Czy CSS może wykryć liczbę dzieci elementu?

Prawdopodobnie odpowiadam na własne pytanie, ale jestem bardzo ciekawa.

Wiem, że CSS może wybrać poszczególne dzieci rodzica, ale czy istnieje wsparcie dla stylu dzieci kontenera, jeśli jego rodzic ma określoną liczbę dzieci.

Na przykład

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

Wiem, że to brzmi dziwnie, ale mój menedżer poprosił mnie, żebym to sprawdził, nie znalazłem nic na własną rękę, więc postanowiłem się do tego zwrócić przed zakończeniem poszukiwań.

Author: BoltClock, 2012-01-04

7 answers

Wyjaśnienie:

[1]}ze względu na wcześniejsze sformułowanie w pierwotnym pytaniu, kilku obywateli so zgłosiło obawy, że ta odpowiedź może wprowadzać w błąd. Zauważ, że w CSS3 style nie mogą być stosowane do węzła nadrzędnego na podstawie liczby dzieci, które posiada. Jednak Style mogą być stosowane do węzłów dziecięcych na podstawie liczbyrodzeństwa , które mają.

Oryginalna odpowiedź:

Niewiarygodnie, teraz jest to możliwe wyłącznie w 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%;
}

sztuczka polega na wybraniu pierwszego dziecka, gdy jest ono również N-tym-od-ostatniego dziecka. To skutecznie wybiera na podstawie liczby rodzeństwa.

[[1]}uznanie za tę technikę należy do André Luís (odkryte) i Lea Verou (udoskonalone). Nie kochasz CSS3?

CodePen Przykład:

Źródła:

 547
Author: Matthematics,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-06 20:24:32

Nie. Nie bardzo. Istnieje kilka selektorów, które mogą Cię nieco zbliżyć, ale prawdopodobnie nie będą działać w twoim przykładzie i nie mają najlepszej zgodności z przeglądarką.

:only-child

:only-child jest jednym z niewielu prawdziwych selektorów liczenia w tym sensie, że jest stosowany tylko wtedy, gdy istnieje jedno dziecko rodzica elementu. Używając wyidealizowanego przykładu, to działa jak children(1) prawdopodobnie.

:nth-child

Selektor :nth-child może rzeczywiście doprowadzić cię tam, gdzie chcesz iść w zależności od tego, co naprawdę chcesz zrobić. Jeśli chcesz wystylizować wszystkie elementy, jeśli jest 8 dzieci, masz pecha. Jeśli jednak chcesz zastosować style do 8. i późniejszych elementów, spróbuj tego:

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

Niestety, prawdopodobnie nie są to rozwiązania, których szukasz. W końcu prawdopodobnie będziesz musiał użyć jakiegoś kreatora Javascript, aby zastosować style na podstawie liczby-nawet jeśli chcesz użyć jednego z nich, musisz się dokładnie przyjrzeć zgodność przeglądarki przed przystąpieniem do czystego rozwiązania CSS.

W3 CSS3 Spec na pseudoklasach

EDIT czytam twoje pytanie trochę inaczej - jest kilka innych sposobów stylizacji rodzica , a nie Dzieci. Pozwolę sobie wrzucić kilka innych selektorów po swojemu:

:empty i :not

To stylizuje elementy, które nie mają dzieci. Sam w sobie nie jest zbyt przydatny, ale po sparowaniu z selektorem :not można stylizować tylko elementy, które mają dzieci:

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

Nie możesz policzyć, ile dzieci jest dostępnych z czystym CSS tutaj, ale jest to kolejny ciekawy selektor, który pozwala robić fajne rzeczy.

 34
Author: derekerdmann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-04 02:02:21

UWAGA: To rozwiązanie zwróci dzieci zestawów o określonych długościach, a nie Element nadrzędny, o który prosiłeś. Mam nadzieję, że nadal się przyda.

Andre Luis wymyślił metodę: http://lea.verou.me/2011/01/styling-children-based-on-their-number-with-css3 / niestety, działa tylko w IE9 i wyżej.

Zasadniczo, łączysz :NTH-child() z innymi pseudo klasami, które zajmują się pozycją elementu. Takie podejście pozwala na określenie elementów z zestawów elementów o określonych długościach.

Na przykład :nth-child(1):nth-last-child(3) dopasowuje pierwszy element w zbiorze, będąc jednocześnie trzecim elementem od końca zbioru. Robi to dwie rzeczy: gwarantuje, że zestaw ma tylko trzy elementy i że mamy pierwszy z trzech. Aby określić drugi element zestawu trzech elementów, użyjemy :nth-child(2):nth-last-child(2).


Przykład 1-Zaznacz wszystkie elementy listy, jeśli zestaw ma trzy elementy:

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%;
}

Przykład 1 alternatywa Z Lea Verou:

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


Przykład 2-docelowy ostatni element zestawu z trzema elementami listy:

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

Przykład 2 alternatywa:

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


Przykład 3-cel drugi element zbioru z czterema elementami listy:

li:nth-child(2):nth-last-child(3) {
    /* I'm the second of four */
}
 13
Author: ifugu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-11 20:40:43

Pracując nad rozwiązaniem Matta, użyłem następującej implementacji 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);
    }
  }

Pozwala to szybko rozszerzyć liczbę elementów.

 8
Author: mwtidd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-10 14:57:59

Tak możemy to zrobić używając NTH-child w ten sposób

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

To sprawi, że ósme dziecko div będzie czerwone. Mam nadzieję, że to pomoże...

Ponadto, jeśli ktoś kiedyś powie " hej, nie można zrobić ze stylami za pomocą css, użyj JS!!!"zwątpcie w nie natychmiast. CSS jest obecnie niezwykle elastyczny

Przykład:: http://jsfiddle.net/uWrLE/1/

W przykładzie pierwsze 7 dzieci jest niebieskich, następnie 8 jest czerwonych...

 6
Author: AlanFoster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-04 01:44:17

Jeśli zamierzasz to zrobić w czystym CSS (używając scss), ale masz różne elementy / klasy wewnątrz tej samej klasy nadrzędnej, możesz użyć tej wersji!!

  &: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});
    }
  }
 4
Author: Juan Sebastian Contreras Aceve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-12 17:39:22

Nie, Nie ma czegoś takiego w CSS. Możesz jednak użyć JavaScript, aby obliczyć liczbę dzieci i zastosować style.

 0
Author: Niet the Dark Absol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-04 01:21:37