유형 선택기와 앰퍼샌드 (&)를 사용하여 부모를 결합하는 Sass


101

Sass에서 중첩하는 데 문제가 있습니다. 다음 HTML이 있다고 가정합니다.

<p href="#" class="item">Text</p>
<p href="#" class="item">Text</p>
<a href="#" class="item">Link</a>

다음과 같은 스타일을 중첩하려고하면 컴파일 오류가 발생합니다.

.item {
    color: black;
    a& {
        color:blue;
   }
}

유형 선택기가 동일한 요소의 일부일 때 부모 선택자 앞에 어떻게 참조합니까?

답변:


157

Kumar가 지적했듯이 이것은 Sass 이후로 가능했습니다 3.3.0.rc.1 (Maptastic Maple).

@ at-root 지시문은 부모 선택자 아래에 중첩되지 않고 문서의 루트에서 하나 이상의 규칙을 내 보냅니다.

의도 한 결과에 도달하기 위해 @at-root지시문보간#{} 과 결합 할 수 있습니다 .

SASS

.item {
    color: black;
    @at-root {
        a#{&} {
            color:blue;
        }
    }
}

// Can also be written like this.
.item {
    color: black;
    @at-root a#{&} {
        color:blue;
    }
}

출력 CSS

.item {
    color: black;
}
a.item {
    color: blue;
}

3
이것이이 질문에 대한 해결책이되어야합니다.
Kayhadrin 2014 년

이것은 나를 위해 작동하지 않습니다 ... .item a.item어떤 이유로 출력이 나옵니다 . 나는 a#{&}그것 자체도 시도했지만 여전히 같은 결과를 얻었습니다.
jaminroe

@jaminroe Libsass를 사용하고 있습니까? 그것은됩니다 3.3에 고정 .
Blaine

1
@jaminroe는 후드 아래에서 libsass (node-sass)를 사용하는 것처럼 보입니다. 이 경우 3.3까지 기다려야합니다.
Blaine 2015

1
나는이 이 약간 강하다 버전 , 유사한 해결하기 위해,하지만 함께 여러 클래스, 그건에 추가하는 태그 - 누구를?
Frank Nocke 2017

29

@at-root당신은 체인까지 가장 가까운 선택을 확장하려는 경우 - 단지 방법은 문제가 해결되지 않습니다. 예로서:

#id > .element {
    @at-root div#{&} {
        color: blue;
    }
}

다음으로 컴파일됩니다.

div#id > .element {
    color: blue;
}

.element대신 태그에 가입해야하는 경우 어떻게해야 #id합니까?

selector-unify()문제를 해결 하는 함수가 Sass에 있습니다. 이것을 사용하여 @at-root그것을하는 것은 대상에 가능하다 .element.

#id > .element {
    @at-root #{selector-unify(&, div)} {
        color: blue;
    }
}

다음으로 컴파일됩니다.

#id > div.element {
    color: blue;
}

1
이것은 나에게 의도 된 결과를주지 않았습니다. Sass 3.4.11에서 이것은 #id > .element #id > div.element { color: blue; }. 또 다른 접근 방식은 selector_replace, #id { > .element { @at-root #{selector-replace(&,'.element', 'div.element')} { color: blue;}}}. 더 나은 가독성을위한 요점 이 있습니다.
Blaine

@Blaine 눈부신 버그를 발견했습니다. 감사합니다. 나는 작동하는 솔루션으로 내 대답을 편집했습니다.
Ben Fleming

1
즉, selector-replace또 다른 방법이지만 선택자가 무엇인지 알아야합니다. 이 selector-unify방법은 믹스 인에 사용되는 이점이 있습니다.
Ben Fleming

멋진 대답입니다.
Senthe dec

8

우선, (이 답변을 작성할 당시) selector & 를 사용하는 sass 구문이 없습니다 . 그렇게하려면 선택기와 앰퍼샌드 사이에 공백이 필요합니다. 예를 들면 :

.item {
    .helper & {

    }
}

// compiles to:
.helper .item {

}

앰퍼샌드를 사용하는 다른 방법은 아마도 (잘못) 찾고있는 것입니다.

.item {
    &.helper {

    }
}

// compiles to:
.item.helper {

}

이를 통해 다른 클래스, ID, 의사 선택자 등으로 선택자를 확장 할 수 있습니다. 불행히도 귀하의 경우에는 이론적으로 분명히 작동하지 않는 .itema와 같은 것으로 컴파일됩니다.

CSS를 작성하는 방법을 다시 생각하고 싶을 수도 있습니다. 사용할 수있는 부모 요소가 있습니까?

<div class="item">
    <p>text</p>
    <p>text</p>
    <a href="#">a link</a>
</div>

이렇게하면 다음과 같은 방식으로 SASS를 쉽게 작성할 수 있습니다.

.item {
    p {
        // paragraph styles here
    }
    a {
        // anchor styles here
    }
}

(참고 : HTML을 살펴 봐야합니다. 작은 따옴표와 큰 따옴표를 혼합하고 href 속성을 p 태그에 넣습니다.)


@ Lübnah 동의하지만 마이크로 성능 향상을위한 모범 사례를 정의하려고하는 것은 아닙니다. 나는 작동하는 CSS를 작성하기 위해 href태그를 붙이는 사람을 얻으려고합니다 p.
14:04에 imjared

& .selector가 나쁜 습관이라고 말하는 것에 대한 지원이 전혀 없으며 OP가 게시 한 것과 똑같은 사용 사례가 많이 있습니다.
Mike Mellor

@MikeMellor 영업 이익은 작성 .item { a& }과 지금까지 내가 알고 있어요으로 (즉에 대한 말대꾸 구문이 없다. 나는 그가 아마 당신이 말대꾸에 꽤 정기적으로 사용되는 기술 앰퍼샌드 구문 같은 것을 찾고 있었다 제안했다. 그러나 영업 이익의 예를 구축, .item { &a }이다 유효하지 않으며으로 컴파일됩니다.itema . 내 대답에서 말한 것처럼 누락 된 것이 있습니까?
imjared

영업 이익은 원 .item { a& { ... } }@Blaine 함께 지적으로 지금 할 수있다 .item { @at-root a#{&} { ... } }. 요점은 요소에 클래스가있는 경우 쉽게 수행 할 수 .item { &.class { ... } }있으므로 원시 html 요소로 동일한 작업을 수행 할 수 없어야합니다. OP가 게시 된 시점에이를 수행 할 수있는 방법이 없다고해서 기능이 실제로 수행하기를 원하는 것이 잘못되었음을 의미하지는 않습니다.
Mike Mellor

4

AFAIK 클래스와 태그의 앰퍼샌드를 동시에 결합하려는 경우 다음 구문을 사용해야합니다.

.c1 {
  @at-root h1#{&},
    h2#{&}
    &.c2, {
    color: #aaa;
  }
}

컴파일됩니다

h1.c1,
h2.c1,
.c1.c2 {
  color: #aaa;
}

다른 용도 (예 : 이전에 클래스 @at-root사용 또는 여러 @at-roots 사용)는 오류를 발생시킵니다.

유용하길 바라


1
난 그냥 당신이 범위에 대한 행동이나 예를 들어 DIV 요소 변화 할 유지 mixin이 매우 유용하게 사용
산티아고 arizti

와우-아주 멋져요 :-) 그래서 #{&}기본적으로 컴파일러를 속이고 있습니다-아니면 이것은 항상 미래에 작동할까요!?
Simon_Weaver

@Simon_Weaver in sass, 내부의 모든 #{}것이 평가됩니다. 또한 &현재 선택기를 의미합니다. 그래서 #{&}로 평가됩니다 .c1.
Vahid

그러나 당신은 & 혼자서 작동하지 않는다는 의미에서 그것을 속이고 있습니다 ;-)
Simon_Weaver

1
@Simon_Weaver의 더 많은 예를 보려면 이 링크 를 참조하십시오&
Vahid

3

이 기능은 최신 버전의 Sass에 추가되었습니다. 3.3.0.rc.1(Maptastic Maple)

당신이 사용하는 데 필요한 두 밀접하게 관련 기능은 스크립트입니다 &당신이 참조 부모 요소에 중첩 스타일에서 보간 할 수 있습니다, 그리고 @at-root그것은하지 않습니다 루트에 바로 다음 선택 또는 CSS의 블록을 배치 지침을, ( 출력 된 CSS에 부모가 있음)

자세한 내용은이 Github 문제 를 참조하십시오.

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