on
scss 주요 문법-2
scss 주요 문법-2
scss의 주요 문법을 정리해봅니다.
이번 글에서는 scss에서 @를 붙여 사용하는 주요 문법들을 살펴볼 계획입니다.
1. @mixin, @include
scss에서 가장 많이 쓰이고 가장 중요한 기능이라고 생각되는 mixin 입니다.
mixin은 스타일 시트에서 반복적으로 사용되는 기능들을 한데 모아 선언해놓고 필요한 부분에서 간편하게 include 해서 사용하는 기능입니다.
찍어내기 틀이라고도 부르더라구요.
@mixin은 @include와 짝꿍을 이뤄서 사용됩니다.
사용예시 )
@mixin 믹스인1 {
// 스타일 선언
}
// 사용할 부분에서 선언
.blabla {
@include 믹스인1
}
javascript에서 공통 함수로 정의해 사용하는 방식과 비슷합니다.
공통으로 정의되야 하는 속성들을 한군데에 모아 선언해서 사용하니 수정사항 발생시에도 믹스인 부분만 수정하면 되니 수정이 용이합니다.
개인적으로 font, media query, $map함수 관련 등을 선언해서 사용하니 아주 편하더라구요.
이 mixin은 단순히 선언 -> @include로 호출만 하는 것이 아니라 js의 함수처럼 인자를 넘겨줄 수도 있습니다.
즉 함수처럼 사용처에서 인자를 넘겨주면서 사용처마다 값을 다르게 설정할 수도 있다는 이야기입니다.
ex)
@mixin font-scale($scale, $size){
.font-size-#{$scale}{
font-size: #{$scale};
}
}
$scale과 $size를 인자로 받아 사용처마다 다르게 font-size를 다르게 설정합니다.
보간법으로 class명도 동적으로 설정해서 class명마다 size가 설정되도록 한 코드입니다.
보간법이나 $map 함수를 잘 활용하면 보다 더 간편하게 모듈화를 시켜 스타일을 정의할 수 있습니다.
인자의 갯수를 유동적으로 지정해야 할 경우에는 javascript처럼 …로 가변인자를 넘겨줄 수도 있습니다.
@mixin blabla($args...) {
...
}
2 @content
@mixin을 @include해서 사용할 때 @content를 사용해서 사용처에서 내용을 추가해줄 수 있습니다.
react에서 element안에 {children}으로 컨텐츠를 넘겨주는 것과 같은 개념.
개인적으로 madia query에서 사용하기 매우 유용하다 생각합니다.
ex.
@mixin media-desktop-l {
@media only screen and (min-width: #{$--breakpoint-desktop-l}px){
@content;
}
}
.title {
@include media-desktop-l {
color: red;
}
}
3. @extend
include와 비슷하게 동일하게 공통적으로 사용되는 속성을 가져와 사용할 수 있습니다.
정의된 클래스나 선택자를 가져와 확장시켜줍니다.
사용방법은 아래와 같습니다.
.button {
width: 80px;
height: 32px;
background-color: blue;
}
.button-error {
@extend .button;
backgorund-color: red;
}
.button-success {
@extend .button;
backgorund-color: green;
}
extend는 확장시킬 기본 스타일 선언이 필요하기 때문에 위 예시에서는 class로 extend 시켜주었는데요.
굳이 class를 뽑아서 정의하지 않아도 되는 상황이 있을 거에요.
그럴때는 %로 extend 시킬 속성들을 선언해줄 수 있습니다.
ex.
%button {
width: 80px;
height: 32px;
background-color: blue;
}
.button-error {
@extend .button;
backgorund-color: red;
}
.button-success {
@extend .button;
backgorund-color: green;
}
위 코드처럼 사용하면 %button은 컴파일되지 않고 .button-error와 .button-success로 확장되기만 합니다.
주의할 점
@extend는 media query내에서 실행되지 않습니다.
그래서 반응형 작업을 할 때 사용하면 안됩니다.
scss 가이드에서도 @extend의 사용을 권장하고 있지 않는 다고 합니다.
@extend와 @include는 흡사해보이지만 큰 차이가 있는 데요. 아래에서 살펴봅시다.
@mixin & @include vs @extend
@mixin & @include과 @extend는 비슷해보이지만 큰 차이가 있습니다.
컴파일 되는 방식에 큰 차이가 있는 데요
mixin 예시입니다.
@mixin set-border{
border: 1px solid gray;
}
.title_01 {
@include set-border;
color: red;
}
.box_01 {
@include set-border;
color: blue;
}
이 코드가 컴파일 되면 아래처럼 출력됩니다.
.title_01 {
border: 1px solid gray;
color: red;
}
.box_01 {
border: 1px solid gray;
color: blue;
}
extend 예시입니다.
.border{
border: 1px solid gray;
}
.title_01 {
@include set-border;
color: red;
}
.box_01 {
@include set-border;
color: blue;
}
이 코드가 컴파일 되면 아래처럼 출력됩니다.
.border, .title_01, .box_01{
border: 1px solid gray;
}
.title_01 {
color : red;
}
.box_01 {
color : blue;
}
차이가 보이시나요?
include로 넣은 속성은 속한 클래스, 선택자 내부에서 정의 되어집니다.
extend로 확장한 속성은 extend가 들어간 해당 선택자들이 한군데 취업되어 상단에서 정의되어집니다.
그렇기때문에 extend를 사용할 때는 연관성있는 한 그룹의 선택자들안에서 사용하는 것이 컴파일 된 css 파일의 가독성을 해치지 않을 거에요.
button 속성은 button 선택자들 안에서만 extend 시키는 걸로 !
Discussion and feedback