이 글은Sass 공식 문서를 참고해 Sass(scss)에서 자주 사용하는 문법을 일부 정리해 놓은 레퍼런스/치트시트입니다. 이 글은 Sass의 모든 기능을 소개하고 있지 않습니다.
주석
sass에는 컴파일시 주석이 유지되는지의 여부에 따라 3가지 종류의 주석이 있습니다.
// 이 주석은 컴파일시 출력 CSS파일에 유지되지 않습니다.
/*
이 주석은 컴파일 시 CSS파일에 유지됩니다.
compressed모드에서는 유지되지 않습니다.
*/
/*! 이 주석은 compressed모드에서도 유지됩니다. */
중첩
CSS selector가 반복되는 경우 중첩을 통해 반복을 줄일 수 있습니다.
예를 들어 아래와 같은 CSS 코드가 있습니다.
nav ul {
margin: 0;
padding: 0;
list-style: none;
}
nav li {
display: inline-block;
}
nav a {
display: block;
padding: 6px 12px;
text-decoration: none;
}
위 코드를 sass에서는 아래 처럼 쓸 수 있습니다.
nav {
ul {
margin: 0;
padding: 0;
list-style: none;
}
li {
display: inline-block;
}
a {
display: block;
padding: 6px 12px;
text-decoration: none;
}
}
부모 셀렉터
중첩을 쓸 때 내부에서 특수한 부모 셀렉터 &
를 사용할 수 있습니다.
예를 들어 아래와 같이 a 태그와 a:hover에 각각 스타일이 있는 CSS가 있습니다.
a {
color: black;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
위 CSS코드를 아래와 같이 &
셀렉터를 이용해 중첩을 사용하면 코드의 가독성을 올릴 수 있습니다.
a {
color: black;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
프로퍼티 중첩
CSS에서 동일한 접두사를 가지고 있는 일부 프로퍼티에도 중첩을 사용할 수 있습니다.
body {
margin: {
top: 5px;
bottom: 10px;
}
}
// 출력 css 파일
body {
margin-top: 5px;
margin-bottom: 10px;
}
변수 선언
Sass에서 변수를 선언하기 위해서는 $variable
과 같이 앞에 $기호를 사용하면 됩니다. 변수에는 어떤 Sass 표현식도 대입할 수 있습니다.
$primary-color: #01579b;
body {
$fontSize: 10px;
font-size: $fontSize;
}
보간(Interpolation)
Interpolation을 이용하면 목표 CSS파일에 표현식을 동적으로 삽입할 수 있습니다. 문법은 #{expression}
으로 자바스크립트의 문법과 #기호를 제외하면 동일합니다.
$header: 2;
// selector에 보간이 사용 가능합니다.
h#{$header} {
$bottom: 'bottom';
$margin-bottom: 1rem;
// 프로퍼티 이름에 보간이 사용 가능합니다.
margin-#{$bottom}: 0;
}
/* 변수에도 #{1 + 1} 보간이 사용 가능합니다. */
이 외에 보간을 쓸 수 있는 모든 경우는 공식 문서에서 확인할 수 있습니다.
@use
@use 규칙은 현재까지 Dart Sass만 지원하고 있는 규칙입니다. 만약 LibSass 또는 Ruby Sass를 사용중이라면 @import규칙을 사용해야 합니다.
@use 규칙은 다른 파일에서 작성된 Sass파일을 불러올 수 있습니다. @use 규칙은 파일에서 @forward 규칙을 제외한 가장 앞에 작성 되어야 합니다. 불러온 모듈의 멤버를 사용하기 위해선 <모듈 이름>.<멤버> 형식을 사용하면 됩니다.
// _module.scss
$margin: 10px;
html {
margin: 0;
}
// style.scss
@use 'module';
body {
margin: module.$margin;
}
// 출력 css파일
html {
margin: 0;
}
body {
margin: 10px;
}
@forward
@forward규칙은 @use와 유사하게 다른 Sass파일을 불러옵니다. 차이점은 다른 파일에서 @forward가 사용된 파일을 @use로 불러왔을 때 해당 파일에서 @forward로 불러들인 파일의 멤버를 네임스페이스 없이 사용할 수 있게 됩니다.
다시 말해서, A파일이 @forward로 B파일을 불러오고 C파일이 @use로 A파일을 불러오면 C파일에서 B파일의 멤버를 A.로 접근할 수 있게 됩니다.
@forward는 파일에서 가장 처음 사용해야 합니다.
// _module.scss
$margin: 10px;
// module2.scss
@forward 'module';
// style.scss
@use 'module2';
body {
// $margin이 module2의 멤버인 것 처럼 사용합니다.
margin: module2.$margin;
}
// 출력 css파일
body {
margin: 10px;
}
@import
@import규칙은 @use와 유사하지만 네임스페이스를 나누지 않아 변수나 함수 등의 이름에 충돌이 일어날 수 있어 Sass 공식사이트에서는 권장하고있지 않습니다. 하지만 @use를 지원하지 않는 컴파일러를 사용 중이라면 @import를 사용해야 합니다. 이 경우 불러오는 파일의 식별자를 다른 파일과 충돌할 가능성이 적도록 작성하는 것이 중요합니다.
@mixin, @include
@mixin으로 코드를 생성해 놓으면 @include를 이용해 동일한 코드를 다른 여러 곳에서 사용할 수 있습니다. @mixin은 매개변수를 넘겨받을 수 있습니다.
@mixin flexbox($dir) {
display: flex;
flex-direction: $dir;
}
body {
@include flexbox(column);
}
section {
@include flexbox(row);
}
// 출력 css파일
body {
display: flex;
flex-direction: column;
}
section {
display: flex;
flex-direction: row;
}
@function
우리가 아는 함수입니다. @return으로 값을 반환해줍니다.
@function circumference($radius) {
@return 2 * 3.14 * $radius;
}
body {
margin: circumference(3rem);
}
// 출력 css파일
body {
margin: 18.84rem;
}
@error, @warn
@error는 임의로 에러를 발생시키고 싶을 때 사용합니다. 사용 방법은 @error <에러 메세지>;
입니다. 비슷하게 @warn은 워닝을 발생시킵니다. 사용 방법은 error와 동일합니다.
@debug
@debug규칙은 자바스크립트의 console.log함수와 같이 개발 과정에서 로그를 남기고 싶을 때 사용합니다. @debug <메세지>;
를 사용하면 메세지 내용이 콘솔에 출력됩니다.
제어문
@if, @else, @else if
우리가 알고 있는 if, else 문입니다.
@if <exp> {
<exp>
} @else if <exp> {
<exp>
} @else {
<exp>
}
@each
리스트/맵을 순회하면서 값을 사용해야 할 때 사용하는 반복문입니다.
@each <변수> in <리스트|맵> { code }
의 형태로 사용합니다.
$headers: (
1: 1.8rem,
2: 1.4rem,
3: 1rem,
4: 0.8rem
);
@each $i, $fs in $headers {
h#{$i} {
font-size: $fs;
}
}
// 출력 css파일
h1 {
font-size: 1.8rem;
}
h2 {
font-size: 1.4rem;
}
h3 {
font-size: 1rem;
}
h4 {
font-size: 0.8rem;
}
@for
주로 반복문에서 인덱스가 필요할 때 사용하는 반복문입니다.
@for <variable> from <exp> to <exp> { code }
또는
@for <variable> from <exp> through <exp> { code }
의 형태로 사용합니다. to를 쓰면 마지막 인덱스는 배제하고 through를 쓰면 포함합니다.
위의 @each예제를 @for로 바꿔보면 아래와 같습니다.
@use 'sass:list';
$headers: 1.8rem, 1.4rem, 1rem, 0.8rem;
@for $i from 1 through 4 {
h#{$i} {
font-size: list.nth($headers, $i);
}
}
// 출력은 위 @each를 사용한 예제와 동일합니다.
@while
역시 우리가 알고 있는 while문입니다. 조건이 참인 경우 블럭 내의 코드를 계속 반복합니다. @while <exp> { code }
의 형태로 사용합니다.