DevYoon

[Sass] Sass๋ž€ ๋ฌด์—‡์ธ๊ฐ€? & ๊ธฐ๋ณธ ๋ฌธ๋ฒ• ๋ณธ๋ฌธ

Web/CSS

[Sass] Sass๋ž€ ๋ฌด์—‡์ธ๊ฐ€? & ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

gimewn 2022. 9. 7. 17:27

๐ŸŽจ Sass

Syntactically Awesome Style Sheets

CSS ํŒŒ์ผ๋กœ ๋ณ€ํ™˜๋˜๋Š” ์Šคํƒ€์ผ ์‹œํŠธ ์–ธ์–ด

๐Ÿ˜‘ CSS๋Š”...

  • ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์ค‘์ฒฉ๋œ ์Šคํƒ€์ผ ๊ตฌ์กฐ์™€ ๋นˆ๋ฒˆํ•œ ์ˆ˜์ • ๋•Œ๋ฌธ์— ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง

    โžก๏ธ Sass๋Š” ๋ณ€์ˆ˜, ์ค‘์ฒฉ ๊ทœ์น™, Mixin, ํ•จ์ˆ˜ ๋“ฑ ์‚ฌ์šฉํ•˜์—ฌ CSS๋ฅผ ๊ตฌ์กฐํ™”ํ•˜์—ฌ ํ‘œํ˜„ํ•˜๊ฑฐ๋‚˜ ์Šคํƒ€์ผ ์š”์†Œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

โ” SCSS

Sass 3.0 ์ด์ƒ๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ, CSS ๊ตฌ๋ฌธ๊ณผ ํ˜ธํ™˜๋จ

๊ธฐ์กด ๋ฌธ๋ฒ•

.nav-list
  display:flex
  list-style:none
  li
    margin-right: 10px

SCSS ๋ฌธ๋ฒ•

.nav-list{
  display:flex;
  list-style:none;
  li{
    margin-right:10px;
  }
}

โžก๏ธ ๋ธ”๋ก({})๊ณผ ์„ธ๋ฏธ์ฝœ๋ก (;)์„ ์‚ฌ์šฉํ•˜์—ฌ ํ›จ์”ฌ CSS ์นœํ™”์ , ํ˜„์žฌ๋Š” Sass๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋Œ€๋ถ€๋ถ„ SCSS ํ‘œ๊ธฐ๋ฒ• ์‚ฌ์šฉ

๊ธฐ๋ณธ ๋ฌธ๋ฒ•

1๏ธโƒฃ Nesting

CSS๋ฅผ ๋ธ”๋ก ๋‹จ์œ„์˜ ์Šค์ฝ”ํ”„๋กœ ๋ฌถ์–ด ์ž์‹ ์„ ํƒ์ž๋“ค์˜ ์Šคํƒ€์ผ์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ

๋™์ผํ•œ ๋ถ€๋ชจ ์„ ํƒ์ž๋ฅผ ๊ฐ€์ง„ ์Šคํƒ€์ผ๋“ค์„ ๊ตฌ์กฐํ™” โžก๏ธ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ

์Šคํƒ€์ผ ํ”„๋กœํผํ‹ฐ์—๋„ ์ ์šฉ ๊ฐ€๋Šฅ ex) font-weight, font-style => font:{}

header {
  h1 {
    font:{
      style:italic;
      weight: bold;
    }
  }
}

2๏ธโƒฃ ๋ณ€์ˆ˜ ์„ ์–ธ($)

$ ๊ธฐํ˜ธ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฌธ์ž์—ด๋กœ ๋ณ€์ˆ˜ ์„ ์–ธ ๊ฐ€๋Šฅ

๊ณตํ†ต๋œ ์Šคํƒ€์ผ์˜ ๋ฐ˜๋ณต ์ž‘์„ฑ์„ ํ”ผํ•จ โžก๏ธ ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ ํ–ฅ์ƒ

๋ธ”๋ก ์Šค์ฝ”ํ”„ ๋‹จ์œ„๋กœ ๋ณ€์ˆ˜ ์„ ์–ธโžก๏ธ ์Šค์ฝ”ํ”„๋ณ„๋กœ ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌ

$font_color: #222;

body{
  $max_width: 1000px;
  color: $font_color;
}

3๏ธโƒฃ Parent ์„ ํƒ์ž(&)

๋ถ€๋ชจ ์„ ํƒ์ž๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์„ ํƒ์ž, Sass์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

์˜์‚ฌ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ถ€๋ชจ ์„ ํƒ์ž์™€ ๋‹ค๋ฅธ ์„ ํƒ์ž๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

.title{
  &:hover{ // .title:hover๊ณผ ๋™์ผ
    color:$hovered-color;
  }
}

4๏ธโƒฃ Shadowing

Sass์˜ ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ์ „์—ญ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š์Œ์„ ๋œปํ•จ

์˜๋„์ ์œผ๋กœ ์ „์—ญ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ง€์—ญ ๋ณ€์ˆ˜์˜ ๊ฐ’์œผ๋กœ ๋ฎ์–ด์“ฐ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ, !gloabl ์˜ต์…˜์„ ์‚ฌ์šฉ

$padding: 10px;

.list{
  $padding: 20px;
  padding: $padding; // 20px
}

.list{
  $padding: 20px !global; // ์ „์—ญ ๋ณ€์ˆ˜ $padding์˜ ๊ฐ’์„ 20px๋กœ ๋ณ€๊ฒฝ
  padding: $padding;
}

5๏ธโƒฃ ํƒ€์ž…๊ณผ ์—ฐ์‚ฐ์ž

๊ธฐ๋ณธ์ ์ธ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž, ๋ฌธ์ž์—ด ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž(+), ๋™๋“ฑ ๋ฐ ๋น„๊ต ์—ฐ์‚ฐ์ž ์ œ๊ณต

ํƒ€์ž… ์„ค๋ช…
Numbers ์ˆซ์ž์™€ ๋‹จ์œ„๋กœ ์ด๋ฃจ์–ด์ง ex) 15px โžก๏ธ 15(์ˆซ์ž)+px(๋‹จ์œ„)
Strings ๋”ฐ์˜ดํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์™€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ชจ๋‘ ๋ฌธ์ž์—ด๋กœ ์ธ์‹ ex) 'string', string
Colors 16์ง„์ˆ˜ ์ฝ”๋“œ(#ffffff), CSS ์ƒ‰์ƒ๋ช…(red), rgb(), rgba(), hsl(), hsla() ํ˜•ํƒœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
Lists ๋ฐ์ดํ„ฐ๋ฅผ ์ฝค๋งˆ(,)๋‚˜ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅ ex) (Helvetica, Arial, sans-serif)
Maps ๊ด„ํ˜ธ ์•ˆ์— ์ด๋ฆ„:๊ฐ’ ํ˜•ํƒœ๋กœ ๋งต์„ ์ •์˜, map-get ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งต์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ
Boolean true, false | ์ฃผ๋กœ @if ์กฐ๊ฑด๋ฌธ์—์„œ ์‚ฌ์šฉ
null ๊ฐ’์ด ์—†์Œ์„ ์˜๋ฏธํ•˜๋ฉฐ, null ๊ฐ’์ด ํ• ๋‹น๋œ ์Šคํƒ€์ผ ํ”„๋กœํผํ‹ฐ๋Š” ํŠธ๋žœ์ŠคํŒŒ์ผ ํ›„ ์ œ๊ฑฐ๋จ
Functions ํ•จ์ˆ˜๋„ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ, ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆœ ์—†์ง€๋งŒ
meta.get-function() ๋‚ด์žฅ ํ•จ์ˆ˜์™€ meta.call() ๋‚ด์žฅ ํ•จ์ˆ˜๋กœ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Œ

6๏ธโƒฃ at-rules

์กฐ๊ฑด๋ฌธ, ๋ฐ˜๋ณต๋ฌธ, ํ•จ์ˆ˜, ๊ฐ€์ ธ์˜ค๊ธฐ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ at-rules๋ผ๋Š” ๊ทœ์น™์œผ๋กœ ์ œ๊ณต

๋ชจ๋“  ๊ทœ์น™์€ @๋ฌธ์ž๋ฅผ ์•ž์— ๋ถ™์—ฌ ๋‚˜ํƒ€๋ƒ„

ํ•จ์ˆ˜

@function์œผ๋กœ ์„ ์–ธ, @return์œผ๋กœ ๊ฒฐ๊ณผ๊ฐ’ ๋ฐ˜ํ™˜

$margin: 10px;

@function get-added-default-margin($target){
  @return $margin + $target;
}

.description{
  margin-top: get-added-default-margin(5);
}

mixin

@mixin์œผ๋กœ ์„ ์–ธ, @include๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Œ

ํ•จ์ˆ˜๊ฐ€ ๊ฒฐ๊ณผ๋กœ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด, mixin์€ ์Šคํƒ€์ผ ์ž์ฒด๋ฅผ ๋ฐ˜ํ™˜

@mixin flexbox{
  display: -webkit-box;
}

๊ฐ€์ ธ์˜ค๊ธฐ

๋‹ค๋ฅธ ์Šคํƒ€์ผ ์‹œํŠธ์˜ ์Šคํƒ€์ผ๊ณผ mixin, ํ•จ์ˆ˜, ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ฐ€๋Šฅ

Sass ํŒŒ์ผ์˜ ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” ํŠธ๋žœ์ŠคํŒŒ์ผ ์‹œ ์ฒ˜๋ฆฌ๋จ

@use ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑ, ํ™•์žฅ์ž๋Š” ์ƒ๋žต ๊ฐ€๋Šฅ

โ—@import๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ํ–ฅํ›„ deprecate ์˜ˆ์ • โžก๏ธ ๊ฐ€๊ธ‰์  @use ์‚ฌ์šฉ

@import์˜ ๋ฌธ์ œ์ 

  • ์ „์—ญ namespace์— ๋ณ€์ˆ˜๋‚˜ mixin์ด ์ƒ์„ฑ โžก๏ธ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ด ์žˆ๋‹ค๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ
  • ๊ฐ€์ ธ์˜ค๊ธฐ ์ˆœ์„œ์— ๋”ฐ๋ผ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง ์‹คํ–‰ โžก๏ธ ํŒŒ์ผ์˜ ์ˆœ์„œ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•ด์•ผ ์—๋Ÿฌ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ
  • ์™ธ๋ถ€๋กœ ๋…ธ์ถœํ•˜๊ณ  ์‹ถ์€ private ๋ฉค๋ฒ„๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Œ

@use

Sass์˜ ์ƒˆ๋กœ์šด ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์œผ๋กœ, @import์˜ ๋ฌธ์ œ์  ํ•ด๊ฒฐ ๊ฐ€๋Šฅ

  • ๋…๋ฆฝ์ ์ธ namespace๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณ€์ˆ˜๋‚˜ mixin์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • private ๋ฉค๋ฒ„ ์ฒ˜๋ฆฌ ์ง€์›
  • ์ค‘๋ณต ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฌธ์ œ ์ œ๊ฑฐ ๋“ฑ

// _var.scss
@use 'vars';

Partial

  • ์–ธ๋”์Šค์ฝ”์–ด(_)๋กœ ํŒŒ์ผ๋ช… ์‹œ์ž‘

  • ๊ฐ€์ ธ์˜ค๋Š” ์‹œ์ ์— ๊ฐœ๋ณ„์ ์œผ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผ๋˜์ง€ ์•Š์Œ

  • ํŒŒ์ผ๋“ค์„ ๊ฐ€์ ธ์˜ค๋Š” ํŒŒ์ผ์—์„œ ์ผ๊ด„์ ์œผ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผ ์‹คํ–‰

โœ๏ธ์ฐธ๊ณ  - ใ€Ž๊ธฐ์ดˆ๋ถ€ํ„ฐ ์™„์„ฑ๊นŒ์ง€, ํ”„๋ก ํŠธ์—”๋“œใ€ - ์ด์žฌ์„ฑ, ํ•œ์ •