CSS 중첩

이제 우리가 즐겨 사용하는 CSS 전처리기 기능 중 하나인 중첩 스타일 규칙이 이 언어에 내장되어 있습니다.

Adam Argyle
Adam Argyle

중첩하기 전에 모든 선택자가 있습니다. 이로 인해 반복이 발생하고, 스타일시트가 대량으로 작성되고, 작성이 분산됩니다. 경험해 볼 수 있습니다

이전
.nesting {
  color: hotpink;
}

.nesting > .is {
  color: rebeccapurple;
}

.nesting > .is > .awesome {
  color: deeppink;
}

중첩 후에 선택기는 연속 및 관련 스타일 규칙을 그룹화할 수 있습니다.

이후
.nesting {
  color: hotpink;

  > .is {
    color: rebeccapurple;

    > .awesome {
      color: deeppink;
    }
  }
}

브라우저에서 시도해 보세요.

중첩은 선택기를 반복할 필요성을 줄이는 동시에 스타일 규칙을 공동으로 배치하는 것이 좋습니다. 또한 타겟팅하는 HTML입니다. 이전 예의 .nesting 구성요소가 해당 프로젝트에서 삭제하는 경우 검색하지 않고 전체 그룹을 삭제할 수 있습니다. 관련 선택기 인스턴스용 파일입니다.

수습 기간은 다음과 같은 경우에 도움이 됩니다. - 조직 - 파일 크기 줄이기 - 리팩터링

중첩은 Chrome 112부터 사용할 수 있으며 Safari Technical Preview 162에서 사용할 수도 있습니다.

CSS 중첩 시작하기

이 글의 나머지 부분에서는,다음의 데모 샌드박스가 선택 항목을 시각화합니다. 이 기본 상태에서는 아무것도 선택되지 않으며 볼 수 있습니다. 다양한 모양과 크기를 선택하여 문법을 연습하고 실제로 작동하는 모습을 확인하세요.

작은 원과 큰 원, 삼각형, 정사각형으로 이루어진 다채로운 그리드입니다.

샌드박스 안에는 원, 삼각형, 사각형이 있습니다. 일부 객실은 작고 중간 정도임 확장할 수 있습니다 다른 색상은 파란색, 분홍색 또는 보라색입니다. 모두 .demo 안에 있습니다. 요소가 포함됩니다. 다음은 여러분이 사용할 HTML 요소의 미리보기입니다. 있습니다.

<div class="demo">
  <div class="sm triangle pink"></div>
  <div class="sm triangle blue"></div>
  <div class="square blue"></div>
  <div class="sm square pink"></div>
  <div class="sm square blue"></div>
  <div class="circle pink"></div>
  …
</div>

중첩 예

CSS 중첩을 사용하면 다른 선택기가 있습니다.

.parent {
  color: blue;

  .child {
    color: red;
  }
}

이 예에서 .child 클래스 선택기.parent 클래스 선택기입니다. 즉, 중첩된 .child 선택기가 .parent 클래스가 있는 요소의 하위 요소에만 적용됩니다.

또는 & 기호를 사용하여 이 예를 작성할 수도 있습니다. 상위 클래스가 배치되어야 하는 위치를 나타냅니다.

.parent {
  color: blue;

  & .child {
    color: red;
  }
}

이 두 예시는 기능적으로 동일합니다. 그리고 옵션이 있는 이유는 이 도움말에서 고급 예를 살펴보면서 보다 명확해 질 것입니다.

원 선택

이 첫 번째 예에서는 특정 부분만 페이드 아웃하고 흐리게 처리하도록 스타일을 확인할 수 있습니다.

현재 CSS는 중첩을 사용하지 않는 경우:

.demo .circle {
  opacity: .25;
  filter: blur(25px);
}

중첩을 사용하는 경우 다음과 같은 두 가지 유효한 방법이 있습니다.

/* & is explicitly placed in front of .circle */
.demo {
  & .circle {
    opacity: .25;
    filter: blur(25px);
  }
}

또는

/* & + " " space is added for you */
.demo {
  .circle {
    opacity: .25;
    filter: blur(25px);
  }
}

결과: .circle 클래스를 사용하는 .demo 내부의 모든 요소는 다음과 같습니다. 흐리게 처리되어 거의 보이지 않습니다.

<ph type="x-smartling-placeholder">
</ph> 도형의 다채로운 그리드에는 더 이상 원이 없으며
    배경에 아주 희미합니다. <ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder"></ph> 데모 사용해 보기

삼각형과 사각형 선택

이 작업에서는 여러 개의 중첩된 요소(그룹 선택기라고도 함)를 선택해야 합니다.

현재 CSS를 중첩을 사용하지 않는 경우 다음 두 가지 방법이 있습니다.

.demo .triangle,
.demo .square {
  opacity: .25;
  filter: blur(25px);
}

또는 :is() 사용

/* grouped with :is() */
.demo :is(.triangle, .square) {
  opacity: .25;
  filter: blur(25px);
}

중첩을 사용하는 경우 다음과 같은 두 가지 유효한 방법이 있습니다.

.demo {
  & .triangle,
  & .square {
    opacity: .25;
    filter: blur(25px);
  }
}

또는

.demo {
  .triangle, .square {
    opacity: .25;
    filter: blur(25px);
  }
}

결과, .circle 요소만 .demo 내부에 남게 됩니다.

<ph type="x-smartling-placeholder">
</ph> 다채로운 도형 그리드에 원만 남아 있고,
    다른 모든 모양은 거의 보이지 않습니다. <ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder"></ph> 데모 사용해 보기

큰 삼각형 및 원 선택

이 작업에는 복합 선택기가 필요합니다. 2개의 클래스가 모두 있는 경우에만 요소를 선택할 수 있습니다.

현재 CSS는 중첩을 사용하지 않는 경우:

.demo .lg.triangle,
.demo .lg.square {
  opacity: .25;
  filter: blur(25px);
}

또는

.demo .lg:is(.triangle, .circle) {
  opacity: .25;
  filter: blur(25px);
}

중첩을 사용하는 경우 다음과 같은 두 가지 유효한 방법이 있습니다.

.demo {
  .lg.triangle,
  .lg.circle {
    opacity: .25;
    filter: blur(25px);
  }
}

또는

.demo {
  .lg {
    &.triangle,
    &.circle {
      opacity: .25;
      filter: blur(25px);
    }
  }
}

결과: 큰 삼각형과 원이 모두 .demo 내부에 숨겨집니다.

<ph type="x-smartling-placeholder">
</ph> 다채로운 그리드에는 작고 중간 크기의 도형만 표시됩니다. <ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder"></ph> 데모 사용해 보기
복합 선택기 및 중첩이 포함된 전문가 팁

& 기호는 중첩에 접하는 방법을 명시적으로 보여주므로 여기에서 친구입니다. 선택기 등이 있습니다. 다음 예를 참고하세요.

.demo {
  .lg {
    .triangle,
    .circle {
      opacity: .25;
      filter: blur(25px);
    }
  }
}

유효한 중첩 방법이지만 결과는 예상 요소와 일치하지는 않습니다. 그 이유는 .lg.triangle, .lg.circle의 원하는 결과를 복합적으로 지정하여 &를 지정하지 않으면 실제 결과는 .lg .triangle, .lg .circle가 되기 때문입니다. 하위 선택기를 사용합니다.

분홍색을 제외한 모든 도형 선택

이 작업에는 요소가 있으면 안 되는 부정 함수 의사 클래스가 필요합니다. 지정된 선택기가 있습니다.

현재 CSS는 중첩을 사용하지 않는 경우:

.demo :not(.pink) {
  opacity: .25;
  filter: blur(25px);
}

중첩을 사용하는 경우 다음과 같은 두 가지 유효한 방법이 있습니다.

.demo {
  :not(.pink) {
    opacity: .25;
    filter: blur(25px);
  }
}

또는

.demo {
  & :not(.pink) {
    opacity: .25;
    filter: blur(25px);
  }
}

결과: 분홍색이 아닌 모든 도형은 .demo 내부에 숨겨집니다.

<ph type="x-smartling-placeholder">
</ph> 이제 다채로운 그리드가 흑백으로 바뀌고 분홍색 도형만 표시됩니다. <ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder"></ph> 데모 사용해 보기
&의 정확성과 유연성

:not() 선택기로 .demo을(를) 타겟팅하려고 한다고 가정해 보겠습니다. &이(가) 필요합니다. 다음과 같습니다.

.demo {
  &:not() {
    ...
  }
}

이전과 달리 .demo:not().demo:not()에 합성됩니다. .demo :not()가 필요한 예시 이 알림은 :hover 상호작용을 중첩하려는 경우

.demo {
  &:hover {
    /* .demo:hover */
  }

  :hover {
    /* .demo :hover */
  }
}

추가 중첩 예

중첩을 위한 CSS 사양은 다음과 같습니다. 더 많은 예시로 가득합니다 구문에 관해 자세히 알아보려면 유효한 예시와 잘못된 예시를 다양하게 다룹니다.

다음 몇 가지 예에서는 CSS 중첩 기능을 간단히 소개하여 어떤 기능이 도입되는지 이해할 수 있습니다

@media 중첩

스타일시트의 다른 영역으로 이동하여 원하는 값을 찾는 것은 선택기와 해당 스타일을 수정하는 미디어 쿼리 조건입니다. 방해 요소 컨텍스트 내에서 조건을 중첩할 수 있는 기능이 사라졌습니다.

문법 편의를 위해 중첩된 미디어 쿼리가 스타일만 수정하는 경우 최소 구문을 사용할 수 있습니다.

.card {
  font-size: 1rem;

  @media (width >= 1024px) {
    font-size: 1.25rem;
  }
}

&를 명시적으로 사용하는 방법도 있습니다.

.card {
  font-size: 1rem;

  @media (width >= 1024px) {
    &.large {
      font-size: 1.25rem;
    }
  }
}

이 예에서는 &를 사용하는 확장된 문법을 보여주면서 .large도 타겟팅합니다. 추가 중첩 기능이 계속 작동하는 것을 보여주는 카드

@rules 중첩에 대해 자세히 알아보세요.

어디서나 사용 가능

지금까지의 모든 예는 이전 컨텍스트에 계속되거나 추가되었습니다. 필요한 경우 컨텍스트를 완전히 변경하거나 다시 정렬할 수 있습니다.

.card {
  .featured & {
    /* .featured .card */
  }
}

& 기호는 선택기 객체 (문자열이 아님)에 대한 참조를 나타내며 중첩 선택기의 아무 곳에나 배치할 수 있습니다. 여러 위치에 회:

.card {
  .featured & & & {
    /* .featured .card .card .card */
  }
}

이 예시는 별로 쓸모가 없어 보이지만, 선택기 컨텍스트를 반복하는 것이 편리합니다

잘못된 중첩의 예

몇 가지 유효하지 않은 중첩 구문 시나리오가 있습니다. 여러 가지 방법이 있습니다.

중첩 및 연결

많은 CSS 클래스 이름 지정 규칙은 중첩을 통해 연결 또는 선택자를 문자열인 것처럼 추가합니다. 이는 CSS 중첩에서 작동하지 않습니다. 선택기는 문자열이 아니라 객체 참조입니다.

.card {
  &--header {
    /* is not equal to ".card--header" */
  }
}

더 자세한 설명은 사양에서 확인할 수 있습니다.

까다로운 수습 기간 예시

선택기 목록 및 :is() 내에 중첩

다음과 같은 중첩 CSS 블록을 고려해 보세요.

.one, #two {
  .three {
    /* some styles */
  }
}

이 예시는 선택기 목록으로 시작한 다음 계속해서 중첩되는 첫 번째 예입니다. 이전 예는 선택기 목록으로만 끝났습니다. 이 중첩 예에는 잘못된 것이 없지만 선택기 목록 내부의 중첩에 관한 구현 세부정보가 까다로울 수 있습니다(특히 ID 선택기가 포함된 목록).

중첩 인텐트가 작동하도록 안쪽에 가장 중첩되지 않는 선택기 목록은 브라우저에서 :is()로 래핑됩니다. 이 래핑은 작성된 컨텍스트 내에서 선택기 목록 그룹화를 유지합니다. 이 그룹화인 :is(.one, #two)의 부작용은 괄호 안에 있는 선택기에서 가장 높은 점수의 특이성을 채택한다는 것입니다. 이는 :is()가 항상 작동하는 방식이지만, 중첩 문법을 사용하면 작성된 것과 정확히 다르기 때문에 놀랄 수 있습니다. 요령은 요약되었습니다. ID와 선택기 목록을 중첩하면 선택기의 유연성이 매우 높아질 수 있습니다.

까다로운 예를 명확하게 요약하자면, 이전 중첩 블록이 다음과 같이 문서에 적용됩니다.

:is(.one, #two) .three {
  /* some styles */
}

ID 선택기를 사용하는 선택기 목록 내부에 중첩할 때 주의를 기울이거나 린터에 경고를 보내도록 학습시키면 해당 선택기 목록 내에서 모든 중첩의 특이성이 높아집니다.

중첩 및 선언 혼합

다음과 같은 중첩 CSS 블록을 고려해 보세요.

.card {
  color: green;
  & { color: blue; }
  color: red;
}

.card 요소의 색상은 blue입니다.

상호 혼합된 스타일 선언은 마치 중첩되기 전에 작성된 것입니다. 자세한 내용은 사양에서 확인할 수 있습니다.

해결 방법이 있습니다. 다음은 &의 세 가지 색상 스타일을 래핑합니다. 작성자가 의도한 대로 계단식 순서를 유지합니다. 색상 요소 .card개가 빨간색이 됩니다.

.card {
  color: green;
  & { color: blue; }
  & { color: red; }
}

실제로, 중첩을 따르는 모든 스타일을 &로 래핑하는 것이 좋습니다.

.card {
  color: green;

  @media (prefers-color-scheme: dark) {
    color: lightgreen;
  }

  & {
    aspect-ratio: 4/3;
  }
}

특성 감지

CSS 중첩 감지 기능에는 중첩을 사용하거나 @supports: 중첩 선택기 파싱 기능을 확인합니다.

브라우저에서 지원되는지 묻는 Bramus의 Codepen 데모 스크린샷
  CSS 중첩. 질문 아래에는 지원을 나타내는 녹색 상자가 있습니다.

중첩 사용:

html {
  .has-nesting {
    display: block;
  }

  .no-nesting {
    display: none;
  }
}

@supports 사용:

@supports (selector(&)) {
  /* nesting parsing available */
}

제 동료인 Bramus는 이 전략을 보여주는 훌륭한 코펜을 보유하고 있습니다.

Chrome DevTools로 디버깅

현재 DevTools의 중첩 지원은 최소 수준입니다. 현재 다음에서 확인할 수 있습니다. 스타일이 스타일 창에 예상대로 표시되지만 중첩 추적은 전체 선택기 컨텍스트는 아직 지원되지 않습니다. Google은 이러한 노력의 일환으로 정보를 투명하게 공개하세요.

Chrome DevTools 중첩 구문의 스크린샷

Chrome 113에서는 CSS 중첩을 추가로 지원할 계획입니다. 조금만 더 기다려 주시기 바랍니다.

앞으로

CSS 중첩은 버전 1에만 있습니다. 버전 2에서는 기억할 것입니다. 중첩의 파싱에 대한 요구가 많습니다. 또는 어려운 순간을 할 수 있습니다.

중첩은 CSS 언어를 크게 개선합니다. 작성에 영향을 미칩니다. CSS의 거의 모든 아키텍처 측면에 적용될 수 있습니다. 이렇게 큰 영향력을 발휘하려면 탐색 및 이해가 이뤄진다는 것을 의미합니다.

마지막으로 여기에 데모가 있습니다. 는 @scope, 중첩, @layer를 모두 사용합니다. 이 모든 것이 매우 흥미롭습니다.

회색 배경에 밝은 카드입니다. 카드에는 제목과 텍스트가 있고
  몇 개의 작업 버튼, 사이버 펑크 스타일 이미지가 있습니다.