Sass (Syntactically Awesome StyleSheets)

Sass์˜ ์ˆ˜์š”๊ฐ€ ๋†’์•„์ง€๊ณ , ๋งŽ์ด๋“ค ์‚ฌ์šฉํ•˜๋Š” ์ถ”์„ธ๋ผ ๋ฐฐ์›Œ๋ณด๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ๊ณต๋ถ€ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ์— ์ ์šฉ์‹œํ‚ค๊ธฐ๊ฐ€ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์— Sass๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๊ณ  ์‹ถ์—ˆ์ง€๋งŒ, ๋นŒ๋“œ๋œ CSSํŒŒ์ผ ๊ด€๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ ๋ชฐ๋ผ ๊ฒฐ๊ตญ ์ต์ˆ™ํ•œ styled-components๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ „์— ์›น ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ• ๋•Œ ๊ธฐ์ดˆ ๊ฐ•์˜๋กœ ๋„์›€์„ ๋ฐ›์•˜๋˜ ์œ ๋…ธ์ฝ”๋”ฉ๋‹˜์˜ Sass ๊ฐ•์˜๊ฐ€ ์—ด๋ ค ์žฌ๋ฐŒ๊ฒŒ ๊ณต๋ถ€ํ•˜๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

๐Ÿ“„ Sass๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

Sass๋Š” css๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ CSS ์ „์ฒ˜๋ฆฌ๊ธฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.
์ „์ฒ˜๋ฆฌ๊ธฐ๋Š” โ€˜์ „์— ์ฒ˜๋ฆฌํ•œ๋‹คโ€™๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ์‰ฝ์Šต๋‹ˆ๋‹ค.
css๊ฐ€ ๋˜๊ธฐ ์ „์— Sass๊ตฌ๋ฌธ์œผ๋กœ ์ž‘์„ฑํ•ด ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
css๋Š” ์ฝ”๋“œ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค.
Sass๋Š” ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•˜์˜€์œผ๋ฉฐ, ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ์—๋„ ๊ต‰์žฅํžˆ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด CSS๋ฅผ ์ฝ๊ธฐ๋„ ์ข‹๊ณ  ์“ฐ๊ธฐ์—๋„ ์ข‹๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ CSS ์ „์ฒ˜๋ฆฌ๊ธฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

โ–ช Sass ๋™์ž‘ ๋ฐฉ์‹

Sass์˜ ๋™์ž‘ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. Sass ๊ตฌ๋ฌธ์— ๋งž๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
  2. Sass ์ „์ฒ˜๋ฆฌ๊ธฐ์— ์˜ํ•ด CSS ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜(์ปดํŒŒ์ผ)๋œ๋‹ค.
  3. ๋ณ€ํ™˜์„ ๋งˆ์น˜๊ณ , 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์ž…๋‹ˆ๋‹ค.

image

SCSSํŒŒ์ผ์„ ์ƒ์„ฑ ํ›„ vscode ํ•˜๋‹จ์— ์žˆ๋Š” Live Sass Compiler ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

image

โ–ช ๋ช…๋ นํ–‰ ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉํ•˜๊ธฐ

๋ช…๋ นํ–‰์€ ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ๋‚˜ ํ„ฐ๋ฏธ๋„์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.
๋ช…๋ นํ–‰์—์„œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด 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 ๋ณ€์ˆ˜ ์‚ฌ์šฉ ๊ทœ์น™

  1. ๊ฐœ์ˆ˜ ์ œํ•œ์€ ์—†์ง€๋งŒ, ๊ฐ€๋…์„ฑ์„ ํ•ด์น˜๋‹ˆ ๋‚จ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  2. ๋ณ€์ˆ˜๋ช…์—๋Š” ์˜๋ฌธ์ž, ์ˆซ์ž, -, _๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ฐ€๋Šฅํ•œ ์ง๊ด€์ ์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ“„ ๋ฏน์Šค์ธ (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;
  }
}

์ถœ์ฒ˜

Tags:

Categories:

Updated:

Leave a comment