본문 바로가기
Scss

@extend 대신 @mixin 사용하기

by hjcode 2019. 9. 25.

 

@extend를 언제 사용해야 할까?

 

먼저 @extend는 연관성을 형성한다는 것을 알아야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
%brand-font {
    font-family: webfont, sans-serif;
    font-weight: 700;
}
 
h1 {
    @extend %brand-font;
    font-size: 2em;
}
 
.btn {
    @extend %brand-font;
    display: inline-block;
    padding: 1em;
}
 
.promo {
    @extend %brand-font;
    background-color: #BADA55;
    color: #fff;
}
 
.footer-message {
    @extend %brand-font;
    font-size: 0.75em;
}

이 코드를 컴파일하면 아래처럼 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
h1, .btn, .promo, .footer-message {
    font-family: webfont, sans-serif;
    font-weight: 700;
}
 
h1 {
    font-size: 2em;
}
 
.btn {
    display: inline-block;
    padding: 1em;
}
 
.promo {
    background-color: #BADA55;
    color: #fff;
}
 
.footer-message {
    font-size: 0.75em;
}
 

위 코드의 문제점은 연관성없는 규칙들에 강제로 연관성을 부여했다는 점이다.

그리고 반복을 피하려고 작성한 @extend로 인해 파일 용량도 더 커진다.

그렇다면 언제 @extend를 사용해야 할까?

 

다음은 좋은 예다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
.btn,
%btn {
    display: inline-block;
    padding: 1em;
}
 
.btn-positive {
    @extend %btn;
    background-color: green;
    color: white;
}
 
.btn-negative {
    @extend %btn;
    background-color: red;
    color: white;
}
 
.btn-neutral {
    @extend %btn;
    background-color: lightgray;
    color: black;
}
 

아래는 컴파일한 결과이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
.btn,
.btn-positive,
.btn-negative,
.btn-neutral {
    display: inline-block;
    padding: 1em;
}
 
.btn-positive {
    background-color: green;
    color: white;
}
 
.btn-negative {
    background-color: red;
    color: white;
}
 
.btn-neutral {
    background-color: lightgray;
    color: black;
}

 

@mixin을 사용할 때

프로젝트에서 특정한 글꼴을 사용하고 있다고 생각해 보자.

이 글꼴에는 언제나 font-weight를 정의해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.foo {
    font-family: webfont, sans-serif;
    font-weight: 700;
}
 
.bar {
    font-family: webfont, sans-serif;
    font-weight: 700;
}
 
.baz {
    font-family: webfont, sans-serif;
    font-weight: 700;
}
 

코드에서 두 선언을 수동으로 한없이 반복하는 것은 아주 지루한 일일 것이다.

게다가 익숙한 regular나 bold가 아니라 700이라는 숫자를 기억해야만 한다.

만약 웹 폰트 종류나 굵기를 변경해야 한다면, 우리는 프로젝트 전체를 훑으면서 위 선언을 전부 찾아내 바꿔야 한다.

이럴 때 @extend를 이용해 강제로 연관성을 부여하는 것은 하면 안 된다는 점을 앞서 다뤘다.

해야 할 일은 믹스인을 사용하는 것이다.

1
2
3
4
5
6
7
8
@mixin webfont() {
    font-family: webfont, sans-serif;
    font-weight: 700;
}
 
.foo {
    @include webfont();
}

위 규칙들은 서로 연관성이 없는 규칙들이다.

그래서 연관을 맺게 만들지 않았다는 점을 기억하는 것이 여기서 중요하다.

 

같은 주제로 묶여 있을때만 @extend를 사용하자.

그냥 같을 뿐이라면 @mixin을 사용하자.

https://mytory.net/2016/12/23/when-to-use-extend-when-to-use-a-mixin.html

 

반응형

'Scss' 카테고리의 다른 글

Scss random 함수  (0) 2020.01.03
Sass 반복문  (0) 2019.10.23