Sass (Syntactically Awesome StyleSheets)
Sass์ ์์๊ฐ ๋์์ง๊ณ , ๋ง์ด๋ค ์ฌ์ฉํ๋ ์ถ์ธ๋ผ ๋ฐฐ์๋ณด๊ณ ์ถ์๋๋ฐ ์๊ฐ๋ณด๋ค ๊ณต๋ถํ๊ณ ํ๋ก์ ํธ์ ์ ์ฉ์ํค๊ธฐ๊ฐ ์ด๋ ค์ ์ต๋๋ค.
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ๊ฒฝ์ฐ์ Sass๋ฅผ ์ฌ์ฉํด ๋ณด๊ณ ์ถ์์ง๋ง, ๋น๋๋ CSSํ์ผ ๊ด๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํด์ผํ ์ง ๋ชฐ๋ผ ๊ฒฐ๊ตญ ์ต์ํ styled-components๋ก ์ฌ์ฉํ๊ธฐ๋ ํ์ต๋๋ค.
์์ ์ ์น ๊ณต๋ถ๋ฅผ ์์ํ ๋ ๊ธฐ์ด ๊ฐ์๋ก ๋์์ ๋ฐ์๋ ์ ๋ ธ์ฝ๋ฉ๋์ Sass ๊ฐ์๊ฐ ์ด๋ ค ์ฌ๋ฐ๊ฒ ๊ณต๋ถํ๊ณ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
๐ Sass๋ ๋ฌด์์ธ๊ฐ?
Sass๋ css๋ฅผ ํจ์จ์ ์ผ๋ก ์์ฑํ๊ธฐ ์ํ CSS ์ ์ฒ๋ฆฌ๊ธฐ ์ธ์ด์
๋๋ค.
์ ์ฒ๋ฆฌ๊ธฐ๋ โ์ ์ ์ฒ๋ฆฌํ๋คโ๋ผ๊ณ ์ดํดํ๋ฉด ์ฝ์ต๋๋ค.
css๊ฐ ๋๊ธฐ ์ ์ Sass๊ตฌ๋ฌธ์ผ๋ก ์์ฑํด ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์
๋๋ค.
css๋ ์ฝ๋๊ฐ ์ปค์ง์๋ก ์ ์ง๋ณด์๊ฐ ๋ณต์กํด์ง๋๋ค.
Sass๋ ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ๋ฑ์ฅํ์์ผ๋ฉฐ, ์ฝ๋๋ฅผ ์์ ํ๊ฑฐ๋ ์ฌ์ฌ์ฉํ๊ธฐ์๋ ๊ต์ฅํ ํธ๋ฆฌํฉ๋๋ค.
์ ๋ฆฌํ์๋ฉด CSS๋ฅผ ์ฝ๊ธฐ๋ ์ข๊ณ ์ฐ๊ธฐ์๋ ์ข๊ฒ ์ฌ์ฉํ๊ธฐ ์ํด ๋ง๋ค์ด์ง CSS ์ ์ฒ๋ฆฌ๊ธฐ ์ธ์ด์ ๋๋ค.
โช Sass ๋์ ๋ฐฉ์
Sass์ ๋์ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Sass ๊ตฌ๋ฌธ์ ๋ง๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
- Sass ์ ์ฒ๋ฆฌ๊ธฐ์ ์ํด CSS ์ฝ๋๋ก ๋ณํ(์ปดํ์ผ)๋๋ค.
- ๋ณํ์ ๋ง์น๊ณ , CSS ํ์ผ์ด ์์ฑ๋๋ค.(๋น๋)
โช SCSS ์ด๋?
SCSS๋ Sass์ ํ์ ๊ฐ๋
์
๋๋ค.
Sass ๊ตฌ๋ฌธ๊ณผ ๋์ผํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋๋ฐ ์ฌ์ฉํ๊ธฐ ์ข์ SCSS๊ตฌ๋ฌธ์ ์์๊ฐ ๋ ๋์ ํธ์
๋๋ค.
๐พ scss๋ก ์์ฑํ ์ฝ๋
$font-stack: Helvetica, sans-serif;
$primary-color: #333;
body {
font: 100% $font-stack;
color: $primary-color;
}
๐พ sass๋ก ์์ฑํ ์ฝ๋
$font-stack: Helvetica, sans-serif;
$primary-color: #333;
body
font: 100% $font-stack;
color: $primary-color;
Sass๋ก ์์ฑํ๋ SCSS๋ก ์์ฑํ๋ ๊ฒฐ๊ณผ๋ ๊ฐ์ง๋ง SCSS๊ตฌ๋ฌธ์ด ๋ ๊ฐ๋ ์ฑ์๊ณ ์น์ํ ๋๋์ ์ค๋๋ค.
// ๊ฒฐ๊ณผ
body {
font: 100% $font-stack;
color: $primary-color;
}
๐ Sass ์ค๋นํ๊ธฐ
โช Live Sass Compiler ์ค์นํ๊ธฐ
scss ์ฝ๋์ ๋ณ๊ฒฝ ์ฌํญ์ ์๋์ผ๋ก ๊ฐ์งํด ์ ์ฅํ ๋๋ง๋ค ์๋กญ๊ฒ ๋น๋๋ฅผ ์งํํ๊ฒ ํด์ฃผ๋ vscode extension์ ๋๋ค.
SCSSํ์ผ์ ์์ฑ ํ vscode ํ๋จ์ ์๋ Live Sass Compiler ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์คํ๋ฉ๋๋ค.
โช ๋ช ๋ นํ ์ธํฐํ์ด์ค ์ฌ์ฉํ๊ธฐ
๋ช
๋ นํ์ ๋ช
๋ น ํ๋กฌํํธ๋ ํฐ๋ฏธ๋์ ๋ปํฉ๋๋ค.
๋ช
๋ นํ์์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด Sass ์ปดํ์ผ์ ์งํํ ์ ์์ต๋๋ค.
node.js๊ฐ ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค..
โ Sass ๋ช ๋ นํ ์ธํฐํ์ด์ค ์ค์นํ๊ธฐ
npm install -g sass
// ์ค์น ํ์ธํ๊ธฐ
sass --version
โ Sassํ์ผ์ cssํ์ผ๋ก ์ปดํ์ผํ๊ธฐ
์๋์ ๊ฐ์ด ์ปดํ์ผ์ ์งํํ๋ฉด styleํด๋์ main.css ํ์ผ์ด ์์ฑ๋์ด ์ปดํ์ผ๋ฉ๋๋ค.
sass style/main.scss:style/main.css // style/main.scss๋ฅผ style/main.css๋ก ์ปดํ์ผํ๋ค.
// live Sass Compiler์ฒ๋ผ ์๋์ผ๋ก ๋ณ๊ฒฝ์ฌํญ ๊ฐ์งํ๋ ์ต์
์ถ๊ฐ
sass --watch style/main.scss:style/main.css
css์์ ๊ธฐ์กด ์ค๊ดํธ์ ๋ค์ฌ์ฐ๊ธฐ๊ฐ ํฌํจ๋ css์คํ์ผ์ extend ์คํ์ผ์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
extend ์คํ์ผ์ ๊ฐ๋
์ฑ์ ์ข์ง๋ง ์ง์ css๋ฅผ ๋ค๋ฃจ์ง ์๋ ๊ฒฝ์ฐ์ ๊ฐ๋
์ฑ์ด ํ์๊ฐ ์์ผ๋ ํ์ผ์ด ํฐ ๊ฒฝ์ฐ ์ฉ๋์ ๋ถ๋ด์ด ๋ฉ๋๋ค.
compressed์ต์
์ ๊ทธ๋ฌํ ๋จ์ ์ ๋ณด์ํด ์ฝ๋๋ฅผ ๊ณต๋ฐฑ์์ด ์์ถํด ์ค๋๋ค.
sass --style compressed style/main.scss:style/main.css
โ extend ์คํ์ผ
h1 {
color: black;
background-color: yellow;
}
โ compressed ์คํ์ผ
h1 {color: #fff;background-color: #ff0;}
๐ ์ฃผ์๊ณผ ์ค์ฒฉ(nestring)
โช ์ฃผ์
์ฃผ์ 1: ์ฌ๋ฌ ์ค ์ง๋ฆฌ ์ฃผ์
/* ์ฌ๋ฌ ์ค ์ง๋ฆฌ ์ฃผ์*/
์ฃผ์ 2: ํ ์ค ์ง๋ฆฌ ์ฃผ์
// ํ ์ค ์ง๋ฆฌ ์ฃผ์
Scss์์ ์ฃผ์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๊ฐ์ง ์
๋๋ค.
ํ ์ค ์ง๋ฆฌ ์ฃผ์์ ์ปดํ์ผ๋ cssํ์ผ์ ๋ฐ์๋์ง ์์ง๋ง, ๊ธฐ์กด css ์ฃผ์์ ์ต์ข
css ํ์ผ์๋ ๋ฐ์๋๋ค๋ ์ฐจ์ด์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
โช ์ค์ฒฉ ๊ท์น (nesting)
css๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ ์ ํ์๋ฅผ ์๋ก ๋ค๋ฅธ ์ ์ธ๋ฌธ์์ ๋ฐ๋ณตํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
Sass์์๋ ์ ํ์๋ฅผ ๋ฐ๋ณตํ์ง ์๊ณ ์ค์ฒฉํด ์ฌ์ฉํ ์ ์์ต๋๋ค.
div {
width: 100px;
height: 100px;
p {
color: red;
span {
color: blue;
}
}
}
์ปดํ์ผ ํ ๊ฒฐ๊ณผ ํ์ผ์๋ ์ ํ์๊ฐ ๋ฐ๋ก ์์ฑ๋์ด ๋ฐ์๋๋ค.
div {
width: 100px;
height: 100px;
}
div p {
color: red;
}
div p span {
color: blue;
}
โ ๋จ์ถ ์์ฑ ์ค์ฒฉ
Sass์ ๋จ์ถ ์์ฑ ์ค์ฒฉ์ โ๋ค์ ์คํ์ด์ค ์์ฑ ์ค์ฒฉโ์ด๋ผ๊ณ ๋ ๋ถ๋ฆ ๋๋ค.
์๋ ์ฝ๋๋ font์ ์์ฑ๋ค์ ์ค์ฒฉ์ผ๋ก ์ ์ํ ์์์ ๋๋ค.
p {
font: {
family: sans-serif;
size: 1rem;
style: normal;
weight: 900;
}
}
โ ์์ ์ ํ์ ์ฐธ์กฐ (&)
๊ธฐํธ &
์ฌ์ฉํ๋ฉด ์ค์ฒฉ๋ ์ ์ธ๋ฌธ์์์ ์์ ์ ํ์๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
์์ฌํด๋์ค๋ฅผ ์ ํํ๊ณ ์ ํ ๋ ์ ์ฉํฉ๋๋ค.
.first-btn {
&:hover {
background: {
color: red;
}
}
}
๐ ๋ณ์
Sass์์๋ $
๋ฅผ ์ฌ์ฉํด ๋ณ์๋ฅผ ๋ง๋ค์ด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ฑ๋ ๋ณ์๋ ์ต์ข
CSSํ์ผ์์ ํ์๋์ง ์์ต๋๋ค.
$main-color: orange;
$font-color: white;
button {
&:nth-child(1) {
color: $font-color;
background-color: $main-color;
width: 100px;
}
&:nth-child(2) {
color: $font-color;
background-color: $main-color;
width: 200px;
}
&:nth-child(3) {
color: $font-color;
background-color: $main-color;
width: 300px;
}
}
โช SCSS ๋ณ์ ์ฌ์ฉ ๊ท์น
- ๊ฐ์ ์ ํ์ ์์ง๋ง, ๊ฐ๋ ์ฑ์ ํด์น๋ ๋จ์ฉํ์ง ์๋๋ค.
- ๋ณ์๋ช
์๋ ์๋ฌธ์, ์ซ์,
-
,_
๋ฅผ ์ฌ์ฉํ๋ฉฐ ๊ฐ๋ฅํ ์ง๊ด์ ์ธ ์ด๋ฆ์ ์ฌ์ฉํ๋ค.
๐ ๋ฏน์ค์ธ (mixin)
๋ฏน์ค์ธ์ ์ฌ์ดํธ ์ ์ฒด์์ ์ฌ์ฌ์ฉํ ์คํ์ผ ๊ทธ๋ฃน์ ์ ์ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฌธ๋ฒ์ ๋๋ค.
โช ๋ฏน์ค์ธ ์ ์ํ๊ธฐ
๋ฏน์ค์ธ์ ์ ์ํ ๋ ์ธ์๋ฅผ ํจ๊ป ์ ์ํ๋ฉด, ๋ฏน์ค์ธ ํธ์ถ ์์ ์ํฉ์ ๋ฐ๋ผ ๊ฐ์ ๋ค๋ฅด๊ฒ ์ฃผ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ธ์๋ฅผ ์ ์ํ ๋ ๊ธฐ๋ณธ๊ฐ์ ์ต์
์ผ๋ก ์ค์ ํฉ๋๋ค.
์ ์๋ ๋ฏน์ค์ธ์ ์ต์ข
CSSํ์ผ์ ํฌํจ๋์ง ์์ต๋๋ค.
@mixin box-style($bg-color: yellow, $font-color: green) {
width: 100px;
height: 100px;
display: flex;
justify-content: center;
align-items: center;
background-color: $bg-color;
color: $font-color;
}
โช ๋ฏน์ค์ธ ์ฌ์ฉํ๊ธฐ
์ ์๋ ๋ฏน์ค์ธ์ ์ฌ์ฉํ๊ณ ์ ํ ๋ @include
์ง์์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
.one {
@include box-style();
}
.two {
@include box-style(purple, yellow);
}
๐ @content
@content
๋ ๋ฏน์ค์ธ์ ์ธ์๋ก ๋จ์ํ ๋ณ์๊ฐ ์๋ ์คํ์ผ ๋ธ๋ก ์ ์ฒด๋ฅผ ๋๊ธธ ๋ ์ฌ์ฉํ๋ ๋ฌธ๋ฒ์
๋๋ค.
์ธ์์ ์คํ์ผ ๋ธ๋ก์ ๋ชจ๋ ์ ๋ฌ๋ฐ๋ ํํ์ ๋ฏน์ค์ธ์ ์ ์ํ ์๋ ์์ต๋๋ค.
@mixin btn-style($hv-color) {
@content;
width: 100px;
height: 25px;
&:hover {
background-color: $hv-color;
}
}
.one {
@include btn-style(orange) {
color: white;
background-color: tomato;
}
}
.two {
@include btn-style(green) {
color: red;
background-color: teal;
}
}
๐ ์ฌ๋ฌ๊ฐ์ .scssํ์ผ์ ํ๋์ .cssํ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ
์ฌ๋ฌ๊ฐ์ .scssํ์ผ์ด ์ฐํ์ฃฝ์ ์๊ฒจ๋ ๋ ์ด๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๋ชจ๋ scssํ์ผ์ ํ๋์ cssํ์ผ๋ก ๋ณด๋ด๋ฒ๋ฆฌ๋ ๊ฒ์ด ์๋๋ผ,
ํ๋์ main.scssํ์ผ์์ ๊ฐ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ scssํ์ผ์ @importํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
์ด๋ ์ฃผ์ํด์ผํ ์ ์ mains.scssํ์ผ์ด ์๋ scssํ์ผ์ ์ด๋ฆ์ ์ธ๋๋ฐ๋ก ์์ํด์ผ ์ปดํ์ผ ๋์์์ ์ ์ธ๋๋ค๋ ์ฌ์ค์ ๋๋ค.</br> @import์ง์์๋ฅผ ์ฌ์ฉํ ๋๋ ์ธ๋๋ฐ๋ฅผ ์ ๊ฑฐํ๊ณ ์ฌ์ฉํฉ๋๋ค.
//main.scss
@import "variables.scss";
@import "mixins.scss";
div {
@include box($main-color);
}
์ด๋ ๊ฒ CSSํ์ผ์ ํ๋๋ก ๋ง๋ค๊ฒ ๋๋ค๋ฉด
- HTML๊ณผ CSS ๋ฌธ์ ๊ฐ ์ฐ๊ฒฐ ํ์๊ฐ ์ค์ด ์น์ฌ์ดํธ ์ฑ๋ฅ ๊ฐ์ ์ ๋์์ด ๋๊ณ
- scssํ์ผ์ ๊ธฐ๋ฅ๋ณ๋ก ๋ถ๋ฆฌํ ์ ์์ด ๋ณด๊ธฐ๋ ์ข๊ณ ์ฌ์ฌ์ฉํ๊ธฐ๋ ์ข์ต๋๋ค.
๐ ์คํ์ผ ์ค๋ณต์ ํผํ๋ ๋ฐฉ๋ฒ @extend
@extend์ง์์๋ ๊ธฐ์กด์ ์คํ์ผ์ ํ์ฅํด์ ๋ค๋ฅธ ํด๋์ค์์ ์ฐ๊ณ ์ถ์ ๋ ์ฌ์ฉํฉ๋๋ค.
.message {
padding: 8px;
text-transform: uppercase;
text-align: center;
color: #fff;
background: #5f0;
}
.bad-message {
@extend .message;
background: #f05;
}
mixin๊ณผ ๋น์ทํ์ง๋ง, ์ ๋ mixin์ ๊ท๊ฒฉ์ ์ค์ ํ๋ ๊ฒ์ด๊ณ extend๋ ํ์ฅ์ ์ํด ์ฌ์ฉํ๋ ๊ฒ์ด๋ผ๊ณ ์ดํดํ์ต๋๋ค.
์ค์ ๋ก ์ปดํ์ผ๋ ๊ฒฐ๊ณผ๋ mixin๊ณผ ๋ค๋ฆ ๋๋ค.
.message,
.bad-message {
padding: 8px;
text-transform: uppercase;
text-align: center;
color: #fff;
background: #5f0;
}
.bad-message {
background: #f05;
}
@exclue๋ฅผ ์ฌ์ฉํด ์ปดํ์ผ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์์ฑ๋ค์ ์ฌ์ฉํ๊ณ ์๋ ํด๋์ค ๋ค์์ด ์ผํ์ ํจ๊ป ์ด๊ฑฐ๋๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ ๋ น ํด๋์ค(๊ณต์ ๋ช
์นญ์ ์๋๋๋ค.)๋ฅผ ์ฌ์ฉํด ์ปดํ์ผ ๋์์ ๋ ๊ธฐ์กด ํด๋์ค๋ ๋
ธ์ถ๋์ง ์์ผ๋ฉด์ ์ฌ์ฌ์ฉํ ํด๋์ค๋ง ๋ณด์ฌ์ฃผ๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.
์ ๋ น ํด๋์ค๋ %
๊ธฐํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
%message {
padding: 8px;
text-transform: uppercase;
text-align: center;
color: #fff;
background: #5f0;
}
.bad-message {
@extend %message;
background: #f05;
}
์ปดํ์ผ ๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ฉด ์ ๋ นํด๋์ค์ ์ด๋ฆ์ ๋ ธ์ถ๋์ง ์๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
.bad-message {
padding: 8px;
text-transform: uppercase;
text-align: center;
color: #fff;
background: #5f0;
}
.bad-message {
background: #f05;
}
๐ ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํด ์ฝ๋์ ํ๋ฆ ์ ์ดํ๊ธฐ
Sass์์๋ @if
์ง์์๋ฅผ ์ด์ฉํด ์กฐ๊ฑด์ ์ค์ ํ ์ ์์ต๋๋ค.</br>
์๋ ์์๋ mixin์์ ์กฐ๊ฑด๋ฌธ์ ์ค์ ํ ๊ฒฝ์ฐ์
๋๋ค.</br>
@else
์ง์์๋ฅผ ์ฌ์ฉํ๋ฉด @if
๋ฌธ์ด ๋ถ๋ง์กฑํ ๊ฒฝ์ฐ์ ์์ฑ์ ์ค์ ํ ์ ์์ต๋๋ค.
@mixin select-color($color) {
@if $color == blue {
color: blue;
} @else {
color: tomato;
}
}
h1 {
@include select-color((red));
}
Sass์์ ์กฐ๊ฑด๋ฌธ์ ์น์ฌ์ดํธ๋ฅผ ๊ฐ๋ฐํ๋ ๋จ๊ณ๋ณด๋ค๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ์ ๋ ์์ฃผ ์ฌ์ฉ๋๋ค๊ณ ํฉ๋๋ค.
๐ ๋ฏธ๋์ด ์ฟผ๋ฆฌ
๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ ๋ฐ์ํ ์น์ ๋ง๋ค ๋ ์ฌ์ฉ๋๋ ํ์ ๋ฌธ๋ฒ์
๋๋ค.
Sass์์ ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋ ๋ฌธ์์ด์ ๋ณ์๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ ์ด๋ ๋ฌธ์์ด ์ฝ์
์ฉ ๊ธฐํธ์ธ #{}
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
$width-small: "all and (min-width: 300px)";
$width-medium: "all and (min-width: 600px)";
$width-large: "all and (min-width: 900px)";
div {
width: 100px;
height: 100px;
@media #{$width-small} {
background-color: cadetblue;
}
@media #{$width-medium} {
background-color: orange;
}
@media #{$width-large} {
background-color: purple;
}
}
๐ฌ ์ต์ ๋๊ธ