SCSS ์†Œ๊ฐœ ๐ŸŽจ

13385 ๋‹จ์–ด productivitycodenewbiewebdevcss
์ฐธ๊ณ : ์ด ์งง์€ ๊ฐ€์ด๋“œ์—์„œ๋Š” SCSS ๊ตฌ๋ฌธ์œผ๋กœ๋งŒ ์ž‘์—…ํ•˜๊ณ  ์žˆ์ง€๋งŒ SASS์™€ SCSS๋Š” ๋งค์šฐ ์œ ์‚ฌํ•˜๋ฉฐ ๊ฑฐ์˜ ๋ชจ๋“  ์˜ˆ์ œ๊ฐ€ ๋‘˜ ๋‹ค์— ๋Œ€ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ž ์‹œ ๋™์•ˆ SASS์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ˆœ์ˆ˜ํ•œ CSS๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ž˜ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋›ฐ์–ด ๋“ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋ช‡ ์ฃผ ๋™์•ˆ SCSS๋ฅผ ์‚ฌ์šฉํ•œ ํ›„ ์ œ ๊ฐœ์ธ์ ์ธ ์˜๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ํ•œ CSS๋กœ๋„ ์ถฉ๋ถ„ํ•˜์ง€๋งŒ ์ผ๋‹จ SCSS๋กœ ์ž‘์—…์„ ํ•˜๊ฒŒ ๋˜๋ฉด CSS ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ธฐ๊ฐ€ ์ •๋ง ๋‹ต๋‹ตํ•ฉ๋‹ˆ๋‹ค...

SCSS๋Š” ํ”„๋ŸฐํŠธ ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ์„œ์˜ ์‚ถ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์„ ํ…Œ์ด๋ธ”์— ์ œ๊ณตํ•˜๋ฉฐ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์„ ์œ„ํ•ด ๊ฐ„๋‹จํ•œ ์†Œ๊ฐœ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์„ค์ •



์•ˆํƒ€๊น๊ฒŒ๋„ ๋ธŒ๋ผ์šฐ์ €๋Š” SCSS๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ SCSS ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โžก๏ธ VSCode ์„ ์‚ฌ์šฉ์ค‘์ด์‹œ๋ผ๋ฉด, Live SASS Compiler ์„ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์ด ์„ค์น˜๋˜๋ฉด .scss/.sass ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  Watch SASS ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



๋‹น์‹ ์€ ์ด๋ฏธ ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž๋™์œผ๋กœ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.

โžก๏ธ ๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ SASS ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ปดํ“จํ„ฐ์— ์ „์ฒด์ ์œผ๋กœ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
npm install -g sass
๊ทธ๋Ÿฐ ๋‹ค์Œ CLI์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด SCSS ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.
sass --watch index.scss index.css
์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ณต์‹documentation์œผ๋กœ ๋ฌธ์˜ํ•˜์„ธ์š”.

โžก๏ธ ๋งˆ์ง€๋ง‰์œผ๋กœ, React ๋˜๋Š” ๊ธฐํƒ€ JavaScript ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์•ฑ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒฝ์šฐ ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ React๋กœ ์ž‘์—…ํ•˜๋ฉฐ create-react-app ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋งŒ๋“  ๋ชจ๋“  ์•ฑ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ SCSS๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ webpack์€ sass-loader๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SCSS ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ง•



โžก๏ธ ๋ณ€์ˆ˜๋Š” CSS์—์„œ๋„ ์ง€์›๋˜์ง€๋งŒ SCSS๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ›Œ๋ฅญํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

$robotoFont: 'Roboto', sans-serif;
$color: (
  primary: #fff,
  secondary: #000,
);

body {
  font-family: $robotoFont;
  background-color: map-get($color, secondary);
}



๋ณ€์ˆ˜๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์œ ์šฉํ•œ์ง€ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ผ ํ•„์š”๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ์•ฑ์—์„œ ๊ณต์œ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ €์žฅ ๋ฐ ์—…๋ฐ์ดํŠธํ•˜์„ธ์š”.

โžก๏ธ ์ค‘์ฒฉ์€ HTML ์š”์†Œ๋ฅผ ์„ ํƒํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ์ƒ์œ„ ์š”์†Œ์—์„œ ํŠน์ • ์š”์†Œ๋ฅผ ๋ชฉํ‘œ๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

body {
  margin: 0;

  header {
    background-color: red;

    button {
      width: 200px;
      height: 200px;

      &:hover {
        background-color: blue;
      }
    }
  }
}


์ด๊ฒƒ์€ ์˜์‚ฌ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

โžก๏ธ At-rules๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค ๋ชจ๋‘๋ฅผ ๋‹ค๋ฃจ์ง€๋Š” ์•Š์„ ๊ฒƒ์ด์ง€๋งŒ ์ด๊ฒƒ์„ ๋ณด์—ฌ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

/* second.scss */
$color: red;

@forward 'second.scss';

/* index.scss */
@use 'second.scss';

body {
  background-color: $color;
}



@forward๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SCSS ํŒŒ์ผ์—์„œ ๋ณ€์ˆ˜์™€ ๋ฏน์Šค์ธ(๋‹ค์Œ์— ์†Œ๊ฐœํ•  ๊ธฐ๋Šฅ)์„ ๋‚ด๋ณด๋‚ด๊ณ  @use๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

โžก๏ธ ๋ฏน์Šค์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํƒ€์ผ์‹œํŠธ์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํƒ€์ผ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฏน์Šค์ธ ๋•๋ถ„์— "float-left"๋˜๋Š” "flex-center"์™€ ๊ฐ™์€ ํด๋ž˜์Šค๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@mixin centerFlex {
  display: flex;
  justify-content: center;
  align-items: center;
}

@mixin formButton($color) {
  border-radius: 10px;
  background-color: rgba($color: #000000, $alpha: 0);
  color: $color;
  border: solid 3px $color;

  &:hover {
    background-color: $color;
    color: #fff;
    cursor: pointer;
  }
}

form {
  @include centerFlex;

  button {
    @include formButton(blue);
  }
}


@mixin์„ ์ž‘์„ฑํ•˜์—ฌ ์ƒˆ ์Šคํƒ€์ผ์„ ์„ ์–ธํ•˜๊ณ  . ๋” ๋งŽ์€ ์œ ์—ฐ์„ฑ์„ ์œ„ํ•ด ๋ฏน์Šค์ธ ์„ ์–ธ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์„ธ์š” ๐Ÿคธ.

โžก๏ธ ํ•จ์ˆ˜, ์กฐ๊ฑด ๋ฐ ๋ฃจํ”„๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋˜ ๋‹ค๋ฅธ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ์ต์ˆ™ํ•˜๋‹ค๋ฉด ์ด ์–ธ์–ด๊ฐ€ ํŽธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@function getHeight($width, $ratio) {
  @return $width / $ratio;
}

div {
  width: 200px;
  height: getHeight(200px, 4);
}


@function์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ์ด๋ฆ„๊ณผ ๊ด„ํ˜ธ(๋ฐ ์„ ํƒ์  ์ธ์ˆ˜)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

@mixin drawCircleOnly($width, $height) {
  width: $width;
  height: $height;
  @if $width = $height {
    border-radius: 50%;
  } @else {
    display: none;
  }
}

div {
  background-color: black;
  @include drawCircleOnly(100px, 100px);
}



@if ๋ฐ . ๋•๋ถ„์— ์กฐ๊ฑด๋ถ€๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ‘œํ˜„์‹์ด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

@for $i from 1 through 5 {
  .section-#{$i} {
    background-color: black;
    width: 10px * $i;
  }
}


๋ฃจํ”„ ๋•๋ถ„์— ์œ ์‚ฌํ•œ ์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ์นด์šดํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค!

โžก๏ธ ๋ณด๋„ˆ์Šค! SCSS ์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ž๋™์œผ๋กœ --webkits๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋” ๋„“์€ ๋ธŒ๋ผ์šฐ์ € ์ง€์›์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์ƒ๊ฐํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์–ผ๋งˆ๋‚˜ ๋ฉ‹์ง„๊ฐ€์š”?

/* index.scss */
div {
  display: flex;
  justify-content: center;
  align-items: center;
  transform: rotate(180deg);
}

/* index.css */
div {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
      -ms-flex-pack: center;
          justify-content: center;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  -webkit-transform: rotate(180deg);
          transform: rotate(180deg);
}


๊ฒฐ๋ก 



SCSS๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ํˆดํ‚ท์— ํ›Œ๋ฅญํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฉฐ ์‹œ์ž‘ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์š”์ฆ˜ ์ ์  ๋” ๋งŽ์€ ํšŒ์‚ฌ์—์„œ CSS ํ”„๋ฆฌํ”„๋กœ์„ธ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๊ทธ๋Ÿด ๋งŒํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ๊ฒ๊ฒŒ ์ฝ์œผ์…จ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ณง ๋ต™๊ฒ ์Šต๋‹ˆ๋‹ค!

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ