Sass .scss : 중첩 및 여러 클래스?


332

현재 프로젝트에 Sass (.scss)를 사용하고 있습니다.

다음 예 :

HTML

<div class="container desc">
    <div class="hello">
        Hello World
    </div>
</div>

SCSS

.container {
    background:red;
    color:white;

    .hello {
        padding-left:50px;
    }
}

이것은 잘 작동합니다.

중첩 스타일을 사용하면서 여러 클래스를 처리 할 수 ​​있습니까?

위의 샘플에서 나는 이것에 대해 이야기하고 있습니다 :

CSS

.container.desc {
    background:blue;
}

이 경우 모든 div.container것이 정상적으로 red되지만 div.container.desc파란색이됩니다.

containerSass와 함께 이것을 어떻게 중첩시킬 수 있습니까?


1
이중 클래스 선택기를 사용해야합니다. 이 문제는 Sass에서 중첩 옵션의 완벽한 예입니다. 당신은 여기에 대한 모든 읽을 수 kolosek.com/nesting-in-less-and-sass
Nesha Zoric

답변:


570

부모 선택기 reference를 사용할 수 있으며 &컴파일 후 부모 선택기로 대체됩니다.

예를 들어 :

.container {
    background:red;
    &.desc{
       background:blue;
    }
}

/* compiles to: */
.container {
    background: red;
}
.container.desc {
    background: blue;
}

&완전히 해결되므로 부모 선택기가 자체 중첩 된 경우을 교체하기 전에 중첩이 해결됩니다 &.

이 표기법은 의사 요소 및 클래스 를 작성하는 데 가장 자주 사용됩니다 .

.element{
    &:hover{ ... }
    &:nth-child(1){ ... }
}

그러나 *& 를 거의 원하는 위치에 배치 할 수 있으므로 다음도 가능합니다.

.container {
    background:red;
    #id &{
       background:blue;
    }
}

/* compiles to: */
.container {
    background: red;
}
#id .container {
    background: blue;
}

그러나 이렇게하면 중첩 구조가 손상되어 스타일 시트에서 특정 규칙을 찾는 노력이 증가 할 수 있습니다.

* : 앞에 공백 이외의 문자는 사용할 수 없습니다 &. 당신의 직접 연결 할 수 없도록 selector+를 &- #id&오류가 발생합니다.


12
참고로 &의사 요소와 의사 클래스를 사용할 때 일반적으로 사용 됩니다. 예를 들면 다음과 같습니다 &:hover..
호감

1
@crush for completeness '내 대답에 이것을 추가했습니다. 의견 감사합니다.
Christoph

1
감사. 기본 안내서에 언급되지 않았기 때문에 내가 바보라고 생각했습니다! : BTW 워드 프로세서에 URL 이동 sass-lang.com/documentation/...
scipilot

1
&줄의 끝에서 사용되는 경우 , 나머지 줄의 시작 부분에 그 줄을 다른 모든 수준으로 놓습니다. .desc를 추가 &.desc하여 아래 .container에서 수행하여 요소를 결합 할 수 있습니다 ..container.desc
Kate Miller

scss-lint는 "& :: hover"(이중 콜론)를 사용할 것을 제안합니다
Marcel Lange

18

이 경우 클래스 이름이나 클래스 이름 규칙을 만드는 더 좋은 방법을 사용해야한다고 생각합니다. 예를 들어, 당신이 말한 것처럼 .container특정 사용법이나 모양에 따라 클래스의 색상이 달라 지길 원합니다 . 당신은 이것을 할 수 있습니다 :

SCSS

.container {
  background: red;

  &--desc {
    background: blue;
  }

  // or you can do a more specific name
  &--blue {
    background: blue;
  }

  &--red {
    background: red;
  }
}

CSS

.container {
  background: red;
}

.container--desc {
  background: blue;
}

.container--blue {
  background: blue;
}

.container--red {
  background: red;
}

위의 코드는 클래스 명명 규칙에서 BEM 방법론을 기반으로합니다. 이 링크를 확인할 수 있습니다. BEM — 블록 요소 수정 자 방법론


이것이 좋은 것처럼 들리지만 모든 비용을 피해야합니다. 앞으로 프로젝트를 검색 .container--desc하고 결과를 얻지 못할 때 감사하겠습니다 .
Stavm

2

Christoph의 답변은 완벽합니다. 그러나 때로는 하나보다 많은 수업을 원할 수도 있습니다. 이 경우을 사용하여 두 루트 클래스를 나란히 배치 할 수있는 @at-root#{}css 기능을 시도 할 수 &있습니다.

이것은 nothing before &규칙 으로 인해 작동하지 않습니다 .

container {
    background:red;
    color:white;
    
    .desc& {
      background: blue;
    }

    .hello {
        padding-left:50px;
    }
}

그러나 이것은 (를 사용하여 @at-root plus #{&}) :

container {
    background:red;
    color:white;
    
    @at-root .desc#{&} {
      background: blue;
    }

    .hello {
        padding-left:50px;
    }
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.