CSS가 요소가 가진 자식 수를 감지 할 수 있습니까?


304

아마 내 자신의 질문에 대답하고 있지만 매우 궁금합니다.

CSS는 부모의 개별 자식을 선택할 수 있지만 부모에 일정량의 자식이있는 경우 컨테이너의 자식 스타일을 지정할 수 있다는 것을 알고 있습니다.

예를 들어

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

나는 그것이 이상하게 들린다는 것을 알고있다. 그러나 나의 매니저는 그것을 조사해달라고 요청했다.


2
수량 쿼리 SCSS 믹스 인
Jakob E

답변:


695

설명:

원래 질문에 대한 이전 문구 때문에 일부 소수의 시민들은이 답변이 오도 될 수 있다는 우려를 제기했습니다. CSS3에서 스타일 은 자식 수에 따라 부모 노드에 적용 할 수 없습니다 . 그러나 스타일 은 형제 수에 따라 자식 노드에 적용 할 수 있습니다 .


원래 답변 :

놀랍게도 이제는 순전히 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%;
}

트릭은 첫 번째 자식도 마지막 자식 일 때 선택하는 것입니다. 형제 수에 따라 효과적으로 선택합니다.

이 기술에 대한 크레딧은 André Luís (발견) 및 Lea Verou (정제)에게 전달됩니다.

CSS3을 좋아하지 않습니까? 😄

코드 펜 예 :

출처 :


7
매우 편리합니다. 이 기술을 사용하는 SASS 믹스 인을 작성했습니다 : codepen.io/anon/pen/pJeLdE?editors=110
SimpleJ

1
@IanSteffy 방금 Chrome 45.0.2454.85 (64 비트)에서 이것을 테스트했는데 정상적으로 작동합니다 ...?
Matthemattics

2
그것이 코드 펜에서 작동하지만 내 프로젝트에서는 작동하지 않으면 가장 확실하게 내 잘못입니다. 내 잘못이야. 이 답변은 맞습니다! 맞습니다.
Ian S

3
여러 의사 선택기에 익숙하지 않은 사람들을 위해 왜 이것이 효과가 있는지 추가하는 것이 좋을 수도 있습니다 (지금까지와 같이;). 여기서 일어나는 것은 시작 / 상단에서 자식 x와 끝에서 자식 y와 동시에 자식을 선택한다는 것입니다. 그리고 이것은 정확히 x + y 자녀가있는 경우에만 무언가를 선택합니다.
Legolas

7
대신 :first-child:nth-last-child(1)을 사용할 수도 있습니다 :only-child.
Adam Reis

40

아뇨 다소 가까이 갈 수있는 몇 가지 선택기가 있지만 아마도 귀하의 예제에서는 작동하지 않으며 최상의 브라우저 호환성이 없습니다.

:only-child

:only-child요소의 부모 중 한 자녀가있는 경우는 적용에만 있다는 의미에서 몇 가지 사실 계수 선택기 중 하나입니다. 이상적인 예를 사용하면 children(1)아마도 그럴 것입니다.

:nth-child

:nth-child당신이 정말하고 무엇을 찾고 있는지에 따라 가고 싶은 곳 선택은 실제로 당신을 얻을 수 있습니다. 8 명의 자녀가있는 경우 모든 요소의 스타일을 지정하려면 운이 나빠집니다. 그러나 8 번째 이후 요소에 스타일을 적용하려면 다음을 시도하십시오.

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

불행히도, 이들은 아마도 당신이 찾고있는 솔루션이 아닙니다. 결국, 수에 따라 스타일을 적용하려면 Javascript 마법사를 사용해야 할 것입니다.이 중 하나를 사용하더라도 순수한 브라우저를 사용하기 전에 브라우저 호환성을 면밀히 검토해야합니다. CSS 솔루션.

의사 클래스의 W3 CSS3 사양

편집 귀하의 질문을 조금 다르게 읽습니다 . 자녀가 아닌 부모 를 스타일링하는 몇 가지 다른 방법 이 있습니다. 몇 가지 다른 선택기를 던져 보겠습니다.

:empty:not

자식이없는 요소의 스타일을 지정합니다. 그 자체로는 유용하지는 않지만 :not선택기 와 쌍을 이루면 자식이있는 요소 만 스타일을 지정할 수 있습니다.

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

여기서 순수 CSS를 사용하는 어린이 수는 계산할 수 없지만 멋진 작업을 수행 할 수있는 또 다른 흥미로운 선택기입니다.


원래의 질문이 편집되었다는 점에 주목할 가치가있다. 초기 "아니오"를 약간 오도하게한다 (단지 fyi 😛)
Matthemattics

18

참고 :이 솔루션은 요청한 부모 요소가 아닌 특정 길이의 하위 세트를 반환합니다. 다행히도 여전히 유용합니다.

안드레 루이스는 방법을 함께했다 : http://lea.verou.me/2011/01/styling-children-based-on-their-number-with-css3/는 불행하게도, 그것은 단지 IE9과 이상 작동합니다.

기본적으로 : nth-child ()를 요소의 위치를 ​​처리하는 다른 의사 클래스와 결합합니다. 이 방법을 사용하면 특정 길이의 요소 집합에서 요소 를 지정할 수 있습니다 .

예를 들어 :nth-child(1):nth-last-child(3), 세트의 첫 번째 요소는 세트의 끝에서 세 번째 요소 인 반면 일치합니다. 이것은 두 가지 일을합니다. 세트에는 세 개의 요소 만 있고 세 요소 중 첫 번째 요소가 있다는 것을 보장합니다. 세 요소 집합의 두 번째 요소를 지정하려면을 사용합니다 :nth-child(2):nth-last-child(2).


예 1-세트에 세 개의 요소가있는 경우 모든 목록 요소를 선택하십시오.

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

Lea Verou의 예 1 대안 :

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


예 2-세 개의 목록 요소가있는 set의 마지막 요소를 대상으로합니다.

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

예 2 대안 :

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


예 3-네 개의 목록 요소가있는 set의 두 번째 요소를 대상으로합니다.

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

1
다시, 이것은 아이들이 아닌 형제 자매입니다
TMS

@TMS 님이 수락 한 답변의 수정 사항 확인-OP의 질문이 어색하게 표시되었습니다.
ifugu

이 방법은 각 요소의 요구는 다르게도 원형 변환을 얻을 예를 들어 목록에서의 위치를 기반으로 스타일을 지정할 때 적합합니다 : li:nth-child(3):nth-last-child(1) { transform: rotate(120deg); } li:nth-child(2):nth-last-child(2) { transform: rotate(240deg); }등등 ...
그렉 스미스

11

Matt의 솔루션에서 다음과 같은 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);
    }
  }

이를 통해 항목 수를 빠르게 확장 할 수 있습니다.


4
대신이의 당신은 쉽게 ... 인 flexbox 사용할 수 있습니다
마이클 Miszczyszyn

6

예, nth-child를 사용하여 이렇게 할 수 있습니다.

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

이렇게하면 8 번째 div 자식이 빨간색이됩니다. 도움이 되었기를 바랍니다...

또한 누군가가 "이봐, CSS를 사용하여 스타일을 적용 할 수 없다면 JS를 사용하십시오!"라고 말합니다. 즉시 의심하십시오. CSS는 오늘날 매우 유연합니다

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

이 예에서 처음 7 명의 어린이는 파란색이고, 8 명의 어린이는 빨간색입니다.


1
아마도 불행한 지원 부족에 대한 메모를 추가 할 수 있습니까?
benesch

2
나는 이것이 Brodie가 요구하는 것과 정확히 일치한다고 생각하지 않습니다. 이것은 주어진 양 후에 아이들 을 스타일링 할 것이지만, 그 자식 수에 따라 조상 / 포함 요소를 선택할 수는 없습니다.
벤 헐

이것은 사실 꽤 좋은 정보입니다.하지만 alan 덕분에 꿀벌은 옳습니다. "요소 에이 많은 아이들이 우리 에게이 스타일이 있다면"라고 말하려고했습니다. 처음 7은 외롭고 알몸이었습니다.
Brodie

@primatology-n 번째 자식을 지원하지 않는 유일한 브라우저는 IE <9입니다. 다른 모든 사람들은 두 가지 이상의 버전을 지원하고 있습니다.
Rob

-1 이것은 div 자식을 빨강으로 만들지 않습니다. 이것은 형제 내의 숫자를 기반으로 div를 빨강으로 만듭니다 ! 어떤 식 으로든 div의 자녀와 관련이 없습니다!
TMS

5

순수한 CSS에서 (scss를 사용하여) 할 예정이지만 동일한 부모 클래스 내에 다른 요소 / 클래스가있는 경우이 버전을 사용할 수 있습니다!

  &: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});
    }
  }

-1

아니요, CSS에는 이와 같은 것이 없습니다. 그러나 JavaScript를 사용하여 자식 수를 계산하고 스타일을 적용 할 수 있습니다.


1
@ Lübnah 왜 사실이 아닌지 설명 할 수 있습니까?
가브리엘 산토스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.