[Sass] - 재활용, 확장

Lee Jeong Min·2021년 8월 20일
1
post-thumbnail

이 글은 패스트캠퍼스 오늘 복습으로 [프론트엔드 개발 올인원 패키지 with React Online] 강의와 HEROPY 블로그의 Sass(SCSS)완전 정복!을 보고 정리한 글입니다.

02. 문법

18. 재활용 - Mixin, Include 1

Sass Mixins는 스타일 시트 전체에서 재사용할 CSS 선언 그룹을 정의하는 기능이다.

Mixin의 사용에 있어서 두 가지만 기억하면 되는데 @mixin@include이다.

@mixin size ($w: 100px, $h: 100px) {
    width: $w;
    height: $h;
}

.box1 {
    @include size;
}

.box2 {
    @include size(200px, 300px);
}

.box3 {
    @include size($h: 400px);
}
.box1 {
  width: 100px;
  height: 100px;
}

.box2 {
  width: 200px;
  height: 300px;
}

.box3 {
  width: 100px;
  height: 400px;
}

@include mixin 이름으로 믹스인을 사용하는 데, 전달할 인자가 없으면 괄호 생략 가능하다. 또한 @mixin을 정의할 때 기본 값 설정도 가능하며, $h에만 따로 값을 주어 인자로 사용할 값을 알려줄 수 있다.

19. 재활용 - Mixin, Include 2

// SCSS
@mixin 믹스인이름 {
  스타일;
}

// Sass
=믹스인이름
  스타일

scss에서는 @mixin으로 선언을 하지만 sass에서는 =기호를 사용하여 믹스인 선언을 한다.

Mixin은 선택자를 포함 가능하고 상위 요소 참조(&)도 할 수 있다.

@mixin large-text {
  font: {
    size: 22px;
    weight: bold;
    family: sans-serif;
  }
  color: orange;

  &::after {
    content: "!!";
  }

  span.icon {
    background: url("/images/icon.png");
  }
}

.box1 {
    @include large-text
}

css로 컴파일된 결과

.box1 {
  font-size: 22px;
  font-weight: bold;
  font-family: sans-serif;
  color: orange;
}

.box1::after {
  content: "!!";
}

.box1 span.icon {
  background: url("/images/icon.png");
}

// SCSS
@include 믹스인이름;

// Sass
+믹스인이름

scss에서는 @include 믹스인이름으로 믹스인을 사용하지만 sass에서는 +믹스인이름으로 사용한다.

// SCSS
h1 {
  @include large-text;
}
div {
  @include large-text;
}

// Sass
h1
  +large-text
div
  +large-text

20. 재활용 - 인수

// SCSS
@mixin 믹스인이름($매개변수) {
  스타일;
}
@include 믹스인이름(인수);

// Sass
=믹스인이름($매개변수)
  스타일

+믹스인이름(인수)

믹스인 옆에 들어가는것이 매개변수이며 @include 옆에 들어가는 것이 인수이다.

21. 재활용 - 인수 - 기본값 설정

인수는 기본 값을 가질 수 있다.
@include 포함 단계에서 별도의 인수가 전달되지 않으면 기본값이 사용된다.

@mixin 믹스인이름($매개변수: 기본값) {
  스타일;
}

22. 재활용 - 인수 - 키워드 인수

매개변수의 첫 번째 부분이 아닌 다른 부분에 인수를 전달하기 위하여 사용된다.

@mixin 믹스인이름($매개변수A: 기본값, $매개변수B: 기본값) {
  스타일;
}

@include 믹스인이름($매개변수B: 인수);

단 작성하지 않은 인수가 적용될 수 있도록 기본값을 설정해 주는 것이 좋다.

23. 재활용 - 인수 - 가변 인수

입력할 인수의 개수가 불확실한 경우 가변 인수를 사용할 수 있다.

@mixin 믹스인이름($매개변수...) {
  스타일;
}

@include 믹스인이름(인수A, 인수B, 인수C);
// 인수를 순서대로 하나씩 전달 받다가, 3번째 매개변수($bg-values)는 인수의 개수에 상관없이 받음
@mixin bg($width, $height, $bg-values...) {
  width: $width;
  height: $height;
  background: $bg-values;
}

div {
  // 위의 Mixin(bg) 설정에 맞게 인수를 순서대로 전달하다가 3번째 이후부터는 개수에 상관없이 전달
  @include bg(
    100px,
    200px,
    url("/images/a.png") no-repeat 10px 20px,
    url("/images/b.png") no-repeat,
    url("/images/c.png")
  );
}

반대로 가변 인수를 전달할 값으로 사용하는 경우 다음과 같이 된다.

@mixin font(
  $style: normal,
  $weight: normal,
  $size: 16px,
  $family: sans-serif
) {
  font: {
    style: $style;
    weight: $weight;
    size: $size;
    family: $family;
  }
}
div {
  // 매개변수 순서와 개수에 맞게 전달
  $font-values: italic, bold, 16px, sans-serif;
  @include font($font-values...);
}
span {
  // 필요한 값만 키워드 인수로 변수에 담아 전달
  $font-values: (style: italic, size: 22px);
  @include font($font-values...);
}
a {
  // 필요한 값만 키워드 인수로 전달
  @include font((weight: 900, family: monospace)...);
}

가변인수로 키워드 인수를 전달할 때에는 $을 앞에 붙이지 않는다.

24. 재활용 - Content

@mixin icon ($url) {
    &::after {
        content: $url;
        @content;
    }
}

.box1 {
    @include icon("image/icon1.png");
}

.box2 {
    @include icon("image/icon2.png") {
        display: block;
        position: absolute;
        width: 100px;
        height: 100px;
    };
}
.box1::after {
  content: "image/icon1.png";
}

.box2::after {
  content: "image/icon2.png";
  display: block;
  position: absolute;
  width: 100px;
  height: 100px;
}

@content가 mixin안에 있다면 해당 부분에 원하는 스타일 블록을 전달할 수 있다.
@include하는 부분에 믹스인 이름과 인자를 적고 {}(중괄호)를 통해 적으면 된다.

25. 확장 - Extend

특정 선택자가 다른 선택자의 모든 스타일을 가져야하는 경우가 종종 있다. 이럴 경우 확장 기능을 사용할 수 있다.

.btn {
    padding: 10px;
    margin: 10px;
    background: blue;
}

.btn-danger {
    @extend .btn;
    background: red;
}
.btn, .btn-danger {
  padding: 10px;
  margin: 10px;
  background: blue;
}

.btn-danger {
  background: red;
}

26. 확장 - 추천하지 않는 이유

확장 기능의 성격으로 결과를 보면 ,로 구분하는 다중 선택자가 만들어진다. 따라서 이러한 성격은 아래와 같은 사례로 이어질 수 있다.

.container {
    width: 300px;
    height: 300px;
    background: red;
    .item {
        width: 200px;
        height: 200px;
        background: blue;
        .icon {
            width: 100px;
            height: 100px;
            background: green;
        }
    }
}

.wrapper {
    .new-icon {
        @extend .icon;
    }
}
.container {
  width: 300px;
  height: 300px;
  background: red;
}

.container .item {
  width: 200px;
  height: 200px;
  background: blue;
}

.container .item .icon, .container .item .wrapper .new-icon, .wrapper .container .item .new-icon {
  width: 100px;
  height: 100px;
  background: green;
}

따라서 @extend를 사용하기 위해선 다음과 같은 문제를 고려해야 한다.

  • 내 현재 선택자가 어디에 첨부될 것인가?
  • 원치 않는 부작용이 초래될 수 있는가?
  • 이 한 번의 확장으로 얼마나 큰 CSS가 생성되는 가?

--> 확장은 그만큼 부작용을 가지고 있으며 사용을 권장하지 않고 Mixin을 대체 기능으로 사용하는 것을 추천

profile
It is possible for ordinary people to choose to be extraordinary.

0개의 댓글

관련 채용 정보