[css] Sass를 사용하여 미디어 쿼리 내에서 선택기 확장

항목 클래스와 컴팩트 “수정 자”클래스가 있습니다.

.item { ... }
.item.compact { /* styles to make .item smaller */ }

이건 괜찮아. 그러나 화면이 충분히 작을 때 클래스를 압축하도록 하는 @media쿼리 를 추가하고 싶습니다 .item.

처음 생각했을 때, 이것이 제가 시도한 것입니다.

.item { ... }
.item.compact { ... }
@media (max-width: 600px) {
  .item { @extend .item.compact; }
}

그러나 이것은 다음과 같은 오류를 생성합니다.

@media 내에서 외부 선택기를 @extend 할 수 없습니다. 동일한 지시문 내에서만 @extend 선택기를 사용할 수 있습니다.

스타일을 복사 / 붙여 넣기하지 않고도 SASS를 사용하여이 작업을 수행하려면 어떻게해야합니까?



답변

간단한 대답은 Sass가 선택기를 작성할 수 없기 때문에 할 수 없다는 것입니다. 미디어 쿼리 내부에있을 수없고 미디어 쿼리 외부에있는 것을 확장 할 수 없습니다. 선택자를 구성하는 대신 단순히 복사본을 가져 가면 좋을 것입니다. 하지만 그렇게 할 수 없습니다.

믹스 인 사용

미디어 쿼리 내부와 외부에서 코드 블록을 재사용하고 여전히 확장 할 수 있기를 원하는 경우 mixin과 extend 클래스를 모두 작성하십시오.

@mixin foo {
    // do stuff
}

%foo {
    @include foo;
}

// usage
.foo {
    @extend %foo;
}

@media (min-width: 30em) {
    .bar {
        @include foo;
    }
}

외부에서 미디어 쿼리 내에서 선택기 확장

이것은 실제로 사용 사례에 도움이되지는 않지만 또 다른 옵션입니다.

%foo {
  @media (min-width: 20em) {
    color: red;
  }
}

@media (min-width: 30em) {
  %bar {
    background: yellow;
  }
}

// usage
.foo {
  @extend %foo;
}

.bar {
  @extend %bar;
}

Sass가이 제한을 해제 할 때까지 기다리십시오 (또는 직접 패치하십시오).

이 문제에 대해 계속 논의되고 있습니다 (추가 할 의미있는 내용이없는 한이 스레드에 기여하지 마십시오. 관리자는 사용자가이 기능을 원한다는 것을 이미 알고 있습니다.이 기능을 구현하는 방법과 구문이어야합니다).


답변

기록을 위해 생성 된 스타일을 한 번만 복제하여 문제를 해결 한 방법은 다음과 같습니다.

// This is where the actual compact styles live
@mixin compact-mixin { /* ... */ }

// Include the compact mixin for items that are always compact
.item.compact { @include compact-mixin; }

// Here's the tricky part, due to how SASS handles extending
.item { ... }
// The following needs to be declared AFTER .item, else it'll
// be overridden by .item's NORMAL styles.
@media (max-width: 600px) {
  %compact { @include compact-mixin; }

  // Afterwards we can extend and
  // customize different item compact styles
  .item {
    @extend %compact;
    /* Other styles that override %compact */
  }
  // As shown below, we can extend the compact styles as many
  // times as we want without needing to re-extend
  // the compact mixin, thus avoiding generating duplicate css
  .item-alt {
    @extend %compact;
  }
}


답변

SASS / SCSS가 @extend미디어 쿼리 내부의 지시문을 지원하지 않는다고 생각 합니다. http://designshack.net/articles/css/sass-and-media-queries-what-you-can-and-cant-do/

대신 믹스 인을 사용해야 할 수도 있지만 코드 부풀림을 목표와 비교해야합니다.


답변

이것은 내가 찾은 가장 깨끗하고 부분적인 해결책입니다. 가능한 경우 @extend를 활용하고 미디어 쿼리 내부에서 믹스 인으로 대체합니다.

Sass의 교차 미디어 쿼리 @extend 지시문

자세한 내용은 기사를 참조하십시오. 그러나 요점은 @extend 또는 @include를 출력할지 여부를 결정하는 mixin ‘placeholder’를 호출한다는 것입니다.

@include placeholder('clear') {
   clear: both;
   overflow: hidden;
}

.a {
    @include _(clear);
}
.b {
    @include _(clear);
}
.c {
    @include breakpoint(medium) {
      @include _(clear);
   }
}

궁극적으로 현재 허용되는 대답 인 믹스 인을 사용하는 것보다 낫지 않을 수 있습니다.


답변

중단 점을 사용하지만 같은 생각입니다.

@mixin bp-small {
    @media only screen and (max-width: 30em) {
        @content;
    }

사용 방법:

.sidebar {
    width: 60%;
    float: left;
    @include bp-small {
        width: 100%;
        float: none;
    }
}

텍스트 는 더이 옵션에 대한 찾을 수 있습니다 유지 mixin에 대한이.


답변

재구성 할 수 있습니까?

.compact { //compact-styles }
.item {}
.item.compact { @extend .compact }

@media (max-width: 600px) {
    .item { @extend .compact; }
}

문서를 올바르게 이해하면 작동합니다. 나는 당신이 시도하는 방식이 작동하지 않는 이유는 @extend를 구문 분석 할 때 .item.compact가 보이지 않기 때문이라고 생각하지만 그것은 무식한 추측이므로 트럭에 소금을 넣으십시오! 🙂


답변