{ ํ›‘์–ด๋ณด๋Š” Sass๐Ÿ’…๐Ÿป }

30270 ๋‹จ์–ด SassSass

๐Ÿ’…๐Ÿป Sass๋ž€?


Sass๋Š” ํŠน์ •ํ•œ ํ˜•ํƒœ์˜ ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ css์Šคํƒ€์ผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ๋ณ€ํ™˜ ์—”์ง„ ์ปดํŒŒ์ผ๋Ÿฌ์ด๋ฉฐ CSS ์ „์ฒ˜๋ฆฌ๊ธฐ์˜ ํ•˜๋‚˜์ด๋‹ค. ๊ฐœ๋ฐœ์€ Sass๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ํ›„, CSS๋กœ exportํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ SassํŒŒ์ผ์„ ์ง์ ‘ ์ฝ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— CSS๋กœ ์ปดํŒŒ์ผํ•ด์•ผ ํ•œ๋‹ค.

Sass๋‚˜ SCSS ์“ฐ๋Š” ์ด์œ 

  • ํ”„๋กœ์ ํŠธ๊ฐ€ ์™„์„ฑ๋˜์–ด ๊ฐˆ์ˆ˜๋ก css๊ฐ€ ์ ์  ๋ณต์žกํ•ด์ง€๊ณ  ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง€๊ณ  ์žˆ๋‹ค. css ์ฝ”๋“œ ๋‚ด์—์„œ๋„ ๋ฐ˜๋ณต์ ์ธ ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์„๊นŒ ์ด๋Ÿฐ ๊ณ ๋ฏผ์—์„œ ์ถœ๋ฐœ์„ ํ•˜๊ฒŒ ๋œ๊ฑฐ๋‹ค.
  • Sass์•ˆ์—๋Š” ๋ณ€์ˆ˜, ๋„ค์ด์ŠคํŒ…, ๋ฏน์Šค์ธ, ๊ฐ€์ ธ์˜ค๊ธฐ, ์ƒ์†, ๋‚ด์žฅ๊ธฐ๋Šฅ ๋“ฑ css์—๋Š” ์—†๋Š” ํŽธ์˜ ๊ธฐ๋Šฅ๋“ค์ด ์žˆ์–ด ์‹œ๊ฐ„ ์ ˆ์•ฝํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.
  • ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Sass ๊ธฐ์ˆ ๋ฐฉ์‹

Sass

$base-font: 20px 
p
  font-size: $base-font
  line-height: 1.5

Sass๋Š” ์„ธ๋ฏธํด๋ก ๊ณผ ์ค‘๊ด„ํ˜ธ๊ฐ€ ์—†๋‹ค.

๐ŸŽจ SCSS

$base-font: 20px; 
p {
  font-size: $base-font;
  line-height: 1.5;
}

SCSS๋Š” ์„ธ๋ฏธํด๋ก ๊ณผ ์ค‘๊ด„ํ˜ธ๊ฐ€ ์žˆ๋‹ค. SCSS๋Š” CSS์™€ ๋™์ผํ•˜๊ฒŒ ์ค‘๊ด„ํ˜ธ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— SCSS๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

ํŒŒ์ผ ๋ถ„๋ฆฌ


๊ฐ ํ”„๋ ˆ์ž„๋ณ„(_header.scss, _main.css, _mixin.scss, _variables.scss)๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค. style.scss์— ๋ถ„๋ฆฌํ–ˆ๋˜ ํŒŒ์ผ๋“ค์„ @importํ•œ๋‹ค.

  • ์Šคํƒ€์ผ๋ณ„๋กœ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ํŽธํ•ด์ง„๋‹ค.

ํŒŒ์ผ๋ช… ์•ž์— _(์–ธ๋”๋ฐ”)๋ฅผ ๋ถ™์ธ ์ด์œ 

Sass์—๊ฒŒ _(์–ธ๋”๋ฐ”)๋ถ™์ธ ํŒŒ์ผ์ด mainํŒŒ์ผ์˜ ์ผ๋ถ€๋ถ„์ž„์„ ์•Œ๋ ค์ค˜์„œ _(์–ธ๋”๋ฐ”)๋ถ™์ธ ํŒŒ์ผ๋“ค์€ CSSํŒŒ์ผ๋กœ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š๊ณ  ๋‚ด๋ถ€์—์„œ @importํ˜•ํƒœ๋กœ ์ž‘๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

Nesting

<nav>
        <ul>
            <li>one</li>
            <li>two</li>
            <li>three</li>
            <li>four</li>
        </ul>
 </nav>
nav{
    background-color: lightcoral;
    padding: 10px;
    height: 50px;;
    ul{
        display: flex;
        justify-content: flex-end;
        list-style: none;
        li{
            color: white;
            margin-right: 10px;
        }
    }
}

Nesting(์ค‘์ฒฉ)์„ ์‚ฌ์šฉํ•˜๋ฉด HTML์˜ ์‹œ๊ฐ์  ๊ณ„์ธต ๋ฐฉ์‹๊ณผ ๋™์ผํ•˜๊ฒŒ CSS๋ฅผ ์ค‘์ฒฉํ•˜์—ฌ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. CSS์ฝ”๋“œ๊ฐ€ ๊ตฌ์กฐํ™” ๋˜์–ด ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง€๋ฉฐ ์œ ์ง€ ๋ณด์ˆ˜ํ•˜๊ธฐ ํŽธ๋ฆฌํ•ด์ง„๋‹ค.

์ค‘์ฒฉ์„ ํ•˜๋Š” ์ด์œ 

// CSS 
// info-list์— ์žˆ๋Š” ์ž์‹๊ณผ ์ž์†์—๊ฒŒ ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋งˆ๋‹ค ๋ถ€๋ชจ ์„ ํƒ์ž๋ฅผ ์ ์–ด์ค€๋‹ค.  
info-list div {
  display: flex;
  font-size: 14px;
  color: #4f4f4f;
}

info-list div dt {
  font-weight: 700;
  margin-right: 7px;
}
// SCSS
// ์ค‘์ฒฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๋ชจ์„ ํƒ์ž๋ฅผ ํ•œ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.
// lifo-list div ์•ˆ์— dt๊ฐ€ ๋“ค์–ด์žˆ์Œ์„ ํ•œ ๋ˆˆ์— ์•Œ ์ˆ˜ ์žˆ๋‹ค.
info-list {
  div {
    display: flex;
    font-size: 14px;
    color: #4f4f4f;
    dt {
      font-weight: 700;
      margin-right: 7px;
    }
  }
}

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

โ— ์ง€๋‚˜์นœ ์ค‘์ฒฉ๋œ ์ฝ”๋“œ๋Š” ์‚ผ๊ฐ€ํ•ด์•ผํ•œ๋‹ค. ๊นŠ์ด ์ค‘์ฒฉ๋˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋ณด๋Š” ๊ฒŒ ๋ถˆํŽธํ•˜๊ณ  ์ปดํŒŒ์ผ ํ–ˆ์„ ๊ฒฝ์šฐ ๋ถˆํ•„์š”ํ•œ ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

Nesting ์†์„ฑ

// SCSS
.backgroud-img{
    width: 100%;
    height: auto;
    background: {
        image: url("/example/cat.png");
        position: center;
        repeat: no-repeat;
    };
}
// CSS
.backgroud-img {
  width: 100%;
  height: auto;
  background-image: url("/example/cat.png");
  background-position: center;
  background-repeat: no-repeat;
}

์ค‘์ฒฉ์€ ์„ ํƒ์ž๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์Šคํƒ€์ผ ์†์„ฑ๋“ค๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์†์„ฑ์„ ์ค‘์ฒฉ ํ•  ๋•Œ๋Š” :์„ ์‚ฌ์šฉํ•œ๋‹ค. SCSS๋Š” ์†์„ฑ์ด ์ค‘์ฒฉ๋˜์—ˆ์Œ์„ ์ธ์ง€ํ•˜๊ณ  css ์†์„ฑ๋“ค๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

Ampersand

์ƒ์œ„ ๋ถ€๋ชจ์„ ํƒ์ž๋ฅผ ์„ ํƒํ•  ๊ฒฝ์šฐ

// SCSS
.box{
    width: 300px;
    height: 300px;
    background-color: lightcoral;
    transition: all 1s;
    &:hover{
        background-color: wheat;
    }
}
// CSS
.box {
  width: 300px;
  height: 300px;
  background-color: lightcoral;
  -webkit-transition: all 1s;
  transition: all 1s;
}

.box:hover {
  background-color: wheat;
}

๊ณตํ†ต ํด๋ž˜์Šค๋ช…์„ ๊ฐ€์ง„ ์„ ํƒ์ž๋“ค์„ ์ค‘์ฒฉ์‹œํ‚ฌ ๊ฒฝ์šฐ

//Scss
.box {
  &-yellow {
    background: #ffc92c;
  }
  &-red {
    background: #ff4949;
  }
  &-green {
    background: #0066ff;
  }
}
.box-yellow {
  background: #ffc92c;
}
.box-red {
  background: #ff4949;
}
.box-green {
  background: #0066ff;
}

์ž์‹ ์˜ ๋ถ€๋ชจ ์„ ํƒ์ž๋ฅผ ์ฐธ์กฐํ•˜์ง€๋งŒ ์ค‘์ฒฉ์ด ๊นŠ์–ด์ง€๋ฉด ์ตœ์ƒ์œ„ ๋ถ€๋ชจ ์„ ํƒ์ž๋กœ๋ถ€ํ„ฐ ์ฐธ์กฐ๋˜๋Š” ๊ฒฝ์šฐ

//Scss
.nav {
  height: 60px;
  font-size: 18px;
  .nav-list {
    background: #3e68ff;
    span {
      padding: 10px 13px;
      a {
        color: white;
        .one {
          & .two {
            color: skyblue;
          }
        }
      }
    }
  }
}
// CSS
.nav {
  height: 60px;
  font-size: 18px;
}
.nav .nav-list {
  background: #3e68ff;
}
.nav .nav-list span {
  padding: 10px 13px;
}
.nav .nav-list span a {
  color: white;
}
.nav .nav-list span a .one .two {
  color: skyblue;
} 

@at-root

// SCSS
.one{
    color: ff4949;
    .two{
        color: ffc92c;
        .three{
            color: 0066ff;
            @at-root p{
                color: lightcoral;
            }
        }
    }
}
// CSS
.one {
  color: ff4949;
}

.one .two {
  color: ffc92c;
}

.one .two .three {
  color: 0066ff;
}

p {
  color: lightcoral;
}

@at-root ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘์ฒฉ์—์„œ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค. ์ค‘์ฒฉ์—์„œ ๋ฒ—์–ด๋‚˜๊ณ  ์‹ถ์€ ์„ ํƒ์ž ์•ž์— @at-root ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

๐Ÿ’…๐Ÿป ๋ณ€์ˆ˜

๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ฐ’์„ ์ผ์ผ์ด ๊ณ ์น˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ์œ ์ง€๋ณด์ˆ˜๋ฅผ ๋งค์šฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค.

โ— ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ CSS๋ฅผ ์ž‘์„ฑํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. ์ถฉ๋Œํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ค€

  • ๊ฐ’์ด ๋‘๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋œ๋‹ค๋ฉด ๋ฏธ๋ฆฌ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค.
  • ๊ธฐ์กด์˜ ๊ฐ’์„ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ, ๋ณ€์ˆ˜์˜ ๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด ์ˆ˜์ •๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋ฉด ๋ณ€์ˆ˜ ์ƒ์„ฑ์„ ๊ณ ๋ คํ•ด๋ณธ๋‹ค.

๋ณ€์ˆ˜ ์ƒ์„ฑํ•˜๊ธฐ

$bgColor: #ff4949;

h1{
    color: $bgColor; 
}

๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” $ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์Šคํƒ€์ผ์„ ์ ์šฉํ•  ๊ฐ’(์ƒ‰์ƒ, ํฐํŠธ ์‚ฌ์ด์ฆˆ, ์ด๋ฏธ์ง€url)์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ณ€์ˆ˜ type

  • numbers : 1, .82, 20px, 2em ๋“ฑ
  • strings : "./images/a.png", bold, left, uppercase ๋“ฑ
  • colors : green, #FFF, rgba(255,0,0,.5) ๋“ฑ
  • booleans : true, false
  • null
  • lists, maps

Lists

// SCSS
// 3๋ฒˆ์€ right์ด๋‹ค.
$valid-sides: left, center, right;

p{
	text-align : nth($valid-sides, 3);
}

๋ฆฌ์ŠคํŠธ๋Š” ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๊ฐ’์œผ๋กœ, ๊ฐ’๋งˆ๋‹ค ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. lists๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด lists์˜ ์š”์†Œ๋“ค์„ ,(์‰ผํ‘œ) ๋‚˜ ๊ณต๋ฐฑ ๋˜๋Š” ์ผ๊ด€์„ฑ์ด ์žˆ๋Š” /๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋ณ€์ˆ˜๋“ค๊ณผ ๋‹ค๋ฅด๊ฒŒ ํŠน์ˆ˜ ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ lists๋กœ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค. ๋นˆ lists๋ฅผ ๋งŒ๋“ค ๋•Œ๋‚˜ lists์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’์ด ํ•˜๋‚˜ ์ธ ๊ฒฝ์šฐ [ ] ๋‚˜ ( ) ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•œ๋‹ค.

โ— lists์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’์˜ index๋Š” 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.

Lists ๊ด€๋ จ ๋‚ด์žฅํ•จ์ˆ˜

  • append(list,value,[separator]) : lists์˜ ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š” ํ•จ์ˆ˜
  • index(list,value) : lists์˜ ๊ฐ’์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜
  • nth(list, n) : lists์˜ ์ธ๋ฑ์Šค์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜

Maps

// SCSS
// key๊ฐ€ $font-sizes, value๊ฐ€ myh1์„ ํ˜ธ์ถœ์„ ํ•œ๋‹ค.
// font-sizes๋Š” 45px์ด๋‹ค.
$font-sizes: ("myh1": 45px, "myh2": 19px, "myp": 16px);

h1{
    color: $bgColor; 
    font-size: map-get($font-sizes, "myh1");
}

maps๋Š” ( ) ๊ด„ํ˜ธ ์•ˆ์— ํ‚ค:๊ฐ’์˜ ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. ํ‚ค์™€ ๊ฐ’์„ ์ •์˜ํ•  ๋•Œ, ํ‚ค๋Š” ๊ณ ์œ ํ•ด์•ผ ํ•˜์ง€๋งŒ ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์€ ์ค‘๋ณต์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ณ€์ˆ˜๋ฅผ ๊ฐ๊ฐ ์„ ์–ธํ•˜๋Š” ๋Œ€์‹ , ๊ด€๋ จ ์žˆ๋Š” ๋ณ€์ˆ˜๋“ค์„ ํ•œ๋ฒˆ์— ๋ชจ์•„ maps๋กœ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Maps ๊ด€๋ จ ๋‚ด์žฅํ•จ์ˆ˜

  • map-get(map,key) : ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜
  • map-keys(map) : map์— ๋“ค์–ด์žˆ๋Š” ํ‚ค(key) ์ „๋ถ€๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜
  • map-values(map) : map์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’(value) ์ „๋ถ€๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜

โ— lists์™€ maps ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ string์ด๋‚˜ number๊ฐ™์€ ํƒ€์ž…๋“ค๋„ function์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๋ณ€์ˆ˜์˜ Scope

์ง€์—ญ๋ณ€์ˆ˜

h1{
    $spanColor: #ffc92c; // ์ง€์—ญ๋ณ€์ˆ˜
    color: $bgColor; 
    font-size: map-get($font-sizes, "myh1");
    span {
        color: $spanColor;
    }
}

์ง€์—ญ๋ณ€์ˆ˜๋Š” ์„ ์–ธํ•œ ์ž๊ธฐ์ž์‹ ์„ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ์ค‘๊ด„ํ˜ธ { } ์•ˆ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค. ํ•˜์œ„ ๋‹จ๊ณ„์— ์žˆ๋Š” ์ค‘๊ด„ํ˜ธ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ „์—ญ๋ณ€์ˆ˜

$bgColor: #ff4949;
$font-h1 : 28px;
$valid-sides: left, center, right;
$font-sizes: ("myh1": 45px, "myh2": 19px, "myp": 16px);

์ „์—ญ๋ณ€์ˆ˜๋Š” ๊ฐ€์žฅ ์œ—๋ถ€๋ถ„์— ์ •์˜ํ•˜๋ฉด ํŒŒ์ผ ๋‚ด์— ์–ด๋””์„œ๋“ ์ง€ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.

$mycolor: #ffffff !global;

!global ์‚ฌ์šฉํ•˜์—ฌ local ๋ณ€์ˆ˜๋ฅผ global ๋ณ€์ˆ˜๋กœ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ• ์ˆ˜์žˆ๋‹ค.

โ— global ๋ณ€์ˆ˜๋Š” ์–ด๋Š ์–ธ์–ด๋“  ์ง€ํ–ฅํ•˜๋Š” ์ถ”์„ธ์ด๋‹ค.

Operator

๋น„๊ต์—ฐ์‚ฐ์ž (์ˆซ์žํ˜•)

// SCSS
@debug 100 > 50; // true
@debug 10px < 17px; // true
@debug 96px >= 1in; // true
@debug 1000ms <= 1s; // true
  • a < b : a์˜ ๊ฐ’์ด b๋ณด๋‹ค ๊ฐ’์ด ์ž‘์€์ง€ ํ™•์ธํ•œ๋‹ค.
  • a <= b : a๊ฐ€ b๋ณด๋‹ค ๊ฐ’์ด ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€์ง€ ํ™•์ธํ•œ๋‹ค.
  • a > b : a์˜ ๊ฐ’์ด b๋ณด๋‹ค ๊ฐ’์ด ํฐ์ง€ ํ™•์ธํ•œ๋‹ค.
  • a >= b : a๊ฐ€ b๋ณด๋‹ค ๊ฐ’์ด ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€์ง€ ํ™•์ธํ•œ๋‹ค.

โ— ERROR : ๋น„๊ตํ•˜๊ฑฐ๋‚˜ ์—ฐ์‚ฐํ•˜๋Š” ๊ฐ’์˜ ๋‹จ์œ„๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹จ์œ„๊ฐ€ ์—†๋Š” ์ˆซ์ž์™€ ์ผ๋ฐ˜์ˆซ์ž์™€ ๋น„๊ตํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

==, != (๋ชจ๋“  ํƒ€์ž…)

// SCSS
// ์ˆซ์ž
@debug 1px == 1px; // true
@debug 1px != 1em; // true
@debug 1 != 1px; // true
@debug 96px == 1in; // true

// ๋ฌธ์ž
@debug "Poppins" == Poppins; // true
@debug "Open Sans" != "Roboto"; // true

// ์ƒ‰์ƒ
@debug rgba(53, 187, 169, 1) == #35bba9; // true
@debug rgba(179, 115, 153, 0.5) != rgba(179, 115, 153, 0.8); // true

์ˆซ์ž, ๋ฌธ์ž, ์ƒ‰์ƒ ๋ฆฌ์ŠคํŠธ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค.

  • a == b : a๊ฐ€ b์™€ ๊ฐ’์ด ๊ฐ™์€์ง€ ํ™•์ธํ•œ๋‹ค.
  • a != b : a๊ฐ€ b์™€ ๊ฐ’์ด ๋‹ค๋ฅธ์ง€ ํ™•์ธํ•œ๋‹ค.

์‚ฐ์ˆ ์—ฐ์‚ฐ์ž (์ˆซ์ž๋‚˜ ์ƒ‰)

// SCSS
@debug 10s + 15s; // 25s
@debug 1in - 10px; // 0.8958333333in
@debug 5px * 3px; // 15px*px
@debug 1in % 9px; // 0.0625in (1in == 96px)
  • a + b : a ์™€ b์˜ ๊ฐ’์„ ๋”ํ•œ๋‹ค.
  • a - b : a ์—์„œ b์˜ ๊ฐ’์„ ๋บ€๋‹ค.
  • a * b : a์™€ b์˜ ๊ฐ’์„ ๊ณฑํ•œ๋‹ค.
  • a / b : a๋ฅผ b๋กœ ๋‚˜๋ˆˆ๋‹ค.
  • a % b : a ์—์„œ b๋ฅผ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€ ๊ฐ’์„ ๊ตฌํ•œ๋‹ค.
// SCSS
$font-sizes: ("myh1": 45px, "myh2": 19px, "myp": 16px);

// 16px * 2 = 32px์ด๋‹ค.
h1{
    font-size: map-get($font-sizes, "myp") * 2;
}

โ— ๋‚˜๋ˆ„๊ธฐ๋ฅผ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์Šฌ๋ž˜์‹œ/๋Š” ๋ฆฌ์ŠคํŠธ์—์„œ๋„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜ผ๋™์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ง์…ˆ์„ ํ•  ๋•Œ ํ•จ๊ป˜ ์จ์„œ SCSS์—๊ฒŒ / ๋ฅผ ๋‚˜๋ˆ„๊ธฐ ์—ฐ์‚ฐ์ž์ž„์„ ์•Œ๋ ค์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค

String์˜ a + b

// SCSS
@debug "Helvetica" + " Neue"; // "Helvetica Neue"
@debug sans- + serif; // sans-serif
@debug sans - serif; // sans-serif

@debug "Elapsed time: " + 10s; // "Elapsed time: 10s";
@debug true + " is a boolean value"; // "true is a boolean value";

+ ์—ฐ์‚ฐ์ž์—์„œ a์™€ b๊ฐ€ ๋ชจ๋‘ ๋ฌธ์ž์—ด์ด๋ผ๋ฉด ๋ฌธ์ž์—ด a,b ๋ฅผ ํ•ฉ์ณ์„œ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋งŒ์•ฝ a๋‚˜ b์ค‘ ํ•˜๋‚˜๋งŒ ๋ฌธ์ž์—ด์ด๋ผ ํ•˜๋”๋ผ๋„ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๊ฐ’์€ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋‘ ๊ฐ’์„ ํ•ฉ์นœ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž (boolean ํƒ€์ž…)

// SCSS
@debug not true; // false
@debug not false; // true

@debug true and true; // true
@debug true and false; // false

@debug true or false; // true
@debug false or false; // false
  • not : true์ด๋ฉด false๋ฅผ, false์ด๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค
  • and : ๋‘๊ฐœ ๋‹ค true์ผ๋•Œ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ํ•˜๋‚˜๋ผ๋„ false๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • or : ๋‘๊ฐœ ๋‹ค false๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ํ•˜๋‚˜๋ผ๋„ true๋ผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๐Ÿ’…๐Ÿป Mixin

Mixin์ด๋ž€

Mixin์€ ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ธฐ๋Šฅ์ด๋‹ค. ์„ ํƒ์ž๋“ค ์‚ฌ์ด์—์„œ ๋ฐ˜๋ณต๋˜๊ณ  ์žˆ๋Š” ์ฝ”๋“œ๋“ค์€ mixin์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ๋ฐ˜๋ณต์„ ์ค„์ธ๋‹ค. ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ๋Š” mixin์œผ๋กœ ๋งŒ๋“ค์–ด ๋†“๊ณ  ์›ํ•˜๋Š” ์„ ํƒ์ž ๋ธ”๋Ÿญ์— mixin์„ includeํ•˜๋ฉด ๋œ๋‹ค.

Mixin ์‚ฌ์šฉํ•˜๊ธฐ

// SCSS
@mixin ์ด๋ฆ„(๋งค๊ฐœ๋ณ€์ˆ˜) //์ƒ์„ฑ
@include ์ด๋ฆ„(์ธ์ˆ˜)  //์‚ฌ์šฉ
// SCSS
@mixin flexCenter{
	display: flex;
	justify-content : center;
	align-items : center;
        list-style: none;
}

.one{
	@include flexCenter; 
        background-color: #ff4949;
}

.two{
	@include flexCenter; 
        background-color: #ffc92c;
}
  • ์•ž์— @Mixin์„ ์“ฐ๊ณ  ์ด๋ฆ„์„ ์ •ํ•ด์ค€ ํ›„ ์ค‘๊ด„ํ˜ธ { } ์•ˆ์— ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.
  • @include๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํƒ€์ผ ํ•˜๊ณ ์ž ํ•˜๋Š” ์š”์†Œ์— ํฌํ•จ ์‹œํ‚ค๋ฉด ๋œ๋‹ค.
  • mixin์€ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ importํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ mixin์„ ์‚ฌ์šฉํ•  ํŒŒ์ผ ๋‚ด์—์„œ ์„ ์–ธ ํ›„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ mixin์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•œ๋‹ค๋ฉด _mixins.scss ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ๊ด€๋ฆฌํ•œ๋‹ค.

Arguments

Arguments

// SCSS
@mixin flexCenter{
	display: flex;
	justify-content : center;
	align-items : center;
        list-style: none;
}

.one{
	@include flexCenter;
        background-color: #ff4949;
	margin-right: 10px;
    	li{
    	    margin-right: 10px;
   	 }

}

.two{
	@include flexCenter;
    	background-color: #ffc92c;
    	li{
    	    margin-right: 20px;
   	 }
}
// SCSS
@mixin flexCenterTwo($size){
	display: flex;
	justify-content : center;
	align-items : center;
    	list-style: none;
    	li{
            margin-right: $size;
   	 }
}

.one{
   	@include flexCenterTwo(10px);
   	background-color: #ff4949;  
}

.two{
        @include flexCenterTwo(20px);
        background-color: #ffc92c;
}

mixin ์ด๋ฆ„ ๋’ค์— ์ธ์ˆ˜๋ฅผ ๋„ฃ์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ธ์ˆ˜์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค. mixin์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋Šฅ๋™์ ์œผ๋กœ ์Šคํƒ€์ผ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’ ์„ค์ •

// SCSS
@mixin flexCenterTwo($size: 30px){
	display: flex;
	justify-content : center;
	align-items : center;
        list-style: none;
        li{
            margin-right: $size;
        }
}

.one{
    	@include flexCenterTwo(10px);
    	background-color: #ff4949;
}

.two{
    	@include flexCenterTwo(20px);
    	background-color: #ffc92c;
}

.three{
    	@include flexCenterTwo;
    	background-color: #0066ff;
}

๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๊ฐ’์ด ๋“ค์–ด์˜ค์ง€ ์•Š์„ ๋•Œ ๊ธฐ๋ณธ์œผ๋กœ ์„ค์ •ํ•œ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Content

// SCSS
@mixin flexCenterTwo($size: 30px){
	display: flex;
	justify-content : center;
	align-items : center;
        list-style: none;
        li{
            margin-right: $size;
        }
        @content
}

.one{
    	@include flexCenterTwo(10px);
    	background-color: #ff4949;
}

.two{
    	@include flexCenterTwo(20px);
    	background-color: #ffc92c;
}

.three{
    	@include flexCenterTwo{
        	color: white;
            }
    	background-color: #0066ff;
}

@content๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์›ํ•˜๋Š” ๋ถ€๋ถ„์— ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’…๐Ÿป Extend

Extend

extend๋Š” ์—ฐ๊ด€ ์žˆ๋Š” ์š”์†Œ๋“ค๋ผ๋ฆฌ ์Šคํƒ€์ผ ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋ฏธ ์Šคํƒ€์ผ์ด ์ž‘์„ฑ๋œ ์„ ํƒ์ž์˜ ํด๋ž˜์Šค๋ฅผ extendํ•˜๊ฑฐ๋‚˜ %๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋”ฐ๋กœ ์Šคํƒ€์ผ์„ ์ •์˜ํ•œ ํ›„ extendํ•˜์—ฌ ์›ํ•˜๋Š” ์„ ํƒ์ž์—๊ฒŒ ์Šคํƒ€์ผ์„ ์ ์šฉํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

  • mixin : ๊ด€๊ณ„ ์—†๋Š” ์„ ํƒ์ž์—์„œ ์กฐ๊ธˆ ๋‹ค๋ฅธ ์Šคํƒ€์ผ์„ ์ ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • extend : ๊ด€๊ณ„ ์žˆ๋Š” ์„ ํƒ์ž๋“ค์˜ ๋™์ผํ•œ ์†Œ์Šค์ฝ”๋“œ ์ ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
// SCSS
.profile-user {
    background-image: url("./user.png");
    background-size: cover;
    background-position : 50% 50%;
    border-radius: 50%;
    width : 50px;
    height : 50px;
}

.comment-user {
    @extend .profile-user;
}

.profile-user ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง„ ๋กœ๊ทธ์ธ ํ”„๋กœํ•„ user ์ด๋ฏธ์ง€ ๋ฐ•์Šค๊ฐ€ .comment-user๊ฐ€ ๋Œ“๊ธ€์„ ์ž‘์„ฑํ•  ๋•Œ user์ž„์„ ๋‚˜ํƒ€๋‚ด์ฃผ๋Š” ์ด๋ฏธ์ง€ ๋ฐ•์Šค์™€ ์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. .profile-user ์ฝ”๋“œ ์ „์ฒด๋ฅผ .comment-user ์—๊ฒŒ extend ํ•ด์ค๋‹ˆ๋‹ค.

%placeholder

// SCSS
%base-button {
    width: 133px;
    height: 44px;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 14px;
    border-radius: 10px;
}

.follow-button {
    @extend %base-button;
    background-color: #ffffff;
    color: #0066ff;
    border: 3px solid #0066ff;
}

.message-button {
    @extend %base-button;
    background-color: #0066ff;
    color: white;
}

%๋กœ ์„ ํƒ์ž๋ฅผ ๋งŒ๋“ ๋‹ค. @extend๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์•ž์„œ %placeholder ์Šคํƒ€์ผ ๋ธ”๋Ÿญ์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. %๋Š” CSS ์ปดํŒŒ์ผ๋˜์ง€ ์•Š๋Š”๋‹ค.

โ— Extend๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ํด๋ž˜์Šค๋ณด๋‹ค %๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.

๐Ÿ’…๐Ÿป ์กฐ๊ฑด๋ฌธ๊ณผ ๋ฐ˜๋ณต๋ฌธ, ํ•จ์ˆ˜

์กฐ๊ฑด๋ฌธ

@if

@if์— ๊ด„ํ˜ธ ์—†์ด true๋‚˜ false๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด๋ฌธ์„ ์ž‘์„ฑํ•œ๋‹ค. (์กฐ๊ฑด์„ ์ž‘์„ฑํ•  ๋•Œ ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ด„ํ˜ธ๋Š” ์ƒ๋žตํ•œ๋‹ค.) ์กฐ๊ฑด์—๋Š” ๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž and, or, not์„ ์‚ฌ์šฉํ•˜๊ณ  if๋ฌธ์˜ ์กฐ๊ฑด์ด true์ผ ๋•Œ๋งŒ { } ๊ด„ํ˜ธ ์•ˆ์— ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ํ•œ๋‹ค.

// SCSS
@mixin avatar($size, $circle: false) {
    width: $size;
    height: $size;

    @if $circle {
        border-radius: $size / 2;
    }
}

.square-av {
    @include avatar(100px, $circle: false);
}
.circle-av {
    @include avatar(100px, $circle: true);
}
// CSS
.square-av {
  width: 100px;
  height: 100px;
}

.circle-av {
  width: 100px;
  height: 100px;
  border-radius: 50px;
}

avatar๋ผ๋Š” ์ด๋ฆ„์ด ์žˆ๋‹ค. $size์™€ $circle์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๋Š”๋‹ค. $circle๊ฐ’์ด ๊ธฐ๋ณธ์œผ๋กœ false์ด๋‹ค. width์™€ height๋Š” ์ž…๋ ฅ๋œ ์‚ฌ์ด์ฆˆ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ํ•œ๋‹ค.
๋งŒ์•ฝ์— $circle์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด border-radius๊ฐ€ ์‚ฌ์ด์ฆˆ ๋‚˜๋ˆ„๊ธฐ 2๋ฅผ ํ•ด์„œ ๋™๊ทธ๋ž—๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค. @include์—์„œ avatar๊ฐ€ 100px, $circle๊ฐ€ false์ผ๋•Œ์™€ $circle๊ฐ€ true์ผ ๋•Œ ์œ„์™€ ๊ฐ™์ด CSS๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค.

@else

@if (์กฐ๊ฑด) {
	// ์กฐ๊ฑด์ด ์ฐธ์ผ ๋•Œ ์‹คํ–‰๋  ๊ตฌ๋ฌธ
} @else{
	// if๋ฌธ์˜ ์กฐ๊ฑด์ด ๊ฑฐ์ง“์ผ ๋•Œ ์‹คํ–‰๋  ๊ตฌ๋ฌธ
}

if๋ฌธ์˜ ์กฐ๊ฑด์ด ์ฐธ์ผ ๋•Œ์™€ ๊ฑฐ์ง“์ผ ๋–„ ์‹คํ–‰๋  ๊ตฌ๋ฌธ์ด ๋‹ค๋ฅด๋‹ค.

// SCSS
$light-background: #f2ece4;
$light-text: #036;
$dark-background: #6b717f;
$dark-text: #d2e1dd;

@mixin theme-colors($light-theme: true) {
@if $light-theme {
    background-color: $light-background;
    color: $light-text;
} @else {
    background-color: $dark-background;
    color: $dark-text;
}
}

.banner {
@include theme-colors($light-theme: true);
body.dark & {
    @include theme-colors($light-theme: false);
    }
}
// CSS
// ture์ด๋ฉด ๋ฐ์€ ์ƒ‰์„, false๋ฉด ์–ด๋‘์šด ์ƒ‰์„ ์Šคํƒ€์ผํ•œ๋‹ค.
.banner {
  background-color: #f2ece4;
  color: #036;
}

body.dark .banner {
  background-color: #6b717f;
  color: #d2e1dd;
}

theme-colors๊ฐ€ light-theme๋งˆ๋‹ค ๊ธฐ๋ณธ๊ฐ’์ด true์ด๋‹ค. ๋งŒ์•ฝ์— true๊ฐ€ ๋“ค์–ด์˜จ๋‹ค๋ผ๊ณ  ํ•˜๋ฉด ์œ„์˜ ๊ตฌ๋ฌธ์„ ์‹คํ–‰์ด ๋˜๊ณ  false๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ์•„๋ž˜์˜ ๊ตฌ๋ฌธ์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. banner์— ๋ณด๋ฉด light-theme๋งˆ๋‹ค true์ด๋‹ค. body์˜ dark๋Š” light-theme๋งˆ๋‹ค false์ด๋‹ค.

โ— ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์กฐ๊ฑด๋ฌธ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

@else if

if (์กฐ๊ฑด){
	// ์กฐ๊ฑด์ด ์ฐธ์ผ ๋•Œ ์‹คํ–‰๋  ๊ตฌ๋ฌธ
} @else if(์กฐ๊ฑด){
	// else if ์กฐ๊ฑด์ด ์ฐธ์ผ ๋•Œ ์‹คํ–‰๋  ๊ตฌ๋ฌธ
} @else{
	// ์œ„์— ๋ชจ๋“  ์กฐ๊ฑด์ด ๊ฑฐ์ง“์ผ ๋•Œ ์‹คํ–‰๋  ๊ตฌ๋ฌธ
}
// SCSS
//์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋Š” ๋ฐฉํ–ฅ์— ๋งž์ถฐ์„œ border-bottom ์ปฌ๋Ÿฌ๋ฅผ ์Šคํƒ€์ผํ•œ๋‹ค.
@mixin triangle($size, $color, $direction) {
    height: 0;
    width: 0;

    border-color: transparent;
    border-style: solid;
    border-width: ($size/2);

@if $direction == up {
    border-bottom-color: $color;
    } @else if $direction == right {
    border-left-color: $color;
    } @else if $direction == down {
    border-top-color: $color;
    } @else if $direction == left {
    border-right-color: $color;
    } @else {
    @error "Unknown direction #{$direction}.";
    }
}

.next {
    @include triangle(5px, black, right);
}
/// CSS
.next {
  height: 0;
  width: 0;
  border-color: transparent;
  border-style: solid;
  border-width: 2.5px;
  border-left-color: black;
}

$triangle์— $size, $color, $direction์˜ ๊ธฐ๋ณธ๊ฐ’์ด ์—†๋‹ค. $direction์€ up,right, down, left์ด๋‹ค. border-bottom-color, border-left-color, border-top-color border-right-color์˜ color๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋Š” ์ฝ”๋“œ์ด๋‹ค. else์— @error๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค. triangle์— 5px, 'black', 'right'๋ฅผ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€์„œ $size, $color, $'direction` ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•œ๋‹ค.

๋ฐ˜๋ณต๋ฌธ

@for

for ($๋ณ€์ˆ˜) from (์‹œ์ž‘) through(๋){
	// ๋ฐ˜๋ณตํ•  ๋‚ด์šฉ
}

์ •์˜ํ•œ ํšŸ์ˆ˜๋งŒํผ ์ฝ”๋“œ ์‹คํ–‰์„ ๋ฐ˜๋ณตํ•œ๋‹ค. @for๋ฌธ์— from(์‹œ์ž‘ : ์ด์ƒ) - through(๋ : ์ดํ•˜)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋””์„œ ์‹œ์ž‘ํ•ด์„œ ์–ด๋””์„œ ๋๋‚  ์ง€๋ฅผ ์•Œ๋ ค์ค€๋‹ค.
nth- ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

/// SCSS
// for๋ฌธ์„ ์ด์šฉํ•ด nth-์„ ํƒ์ž์—๊ฒŒ ๊ฐ๊ฐ์˜ image๋ฅผ ๋ฐฐ๊ฒฝ์— ๋„ฃ์–ด์ค€๋‹ค.
@for $i from 1 through 5 {
  .photo-box:nth-child(#{$i}) {
    background-image: url("../assets/phoster#{$i}.png");
  }
} 
// CSS
.photo-box:nth-child(1) {
  background-image: url("../assets/phoster1.png");
}

.photo-box:nth-child(2) {
  background-image: url("../assets/phoster2.png");
}

.photo-box:nth-child(3) {
  background-image: url("../assets/phoster3.png");
}

.photo-box:nth-child(4) {
  background-image: url("../assets/phoster4.png");
}

.photo-box:nth-child(5) {
  background-image: url("../assets/phoster5.png");
}

๋ฒ”์œ„ 1์ด์ƒ 5์ดํ•˜์ด๊ณ  for๋ฌธ์—์„œ 1๋ถ€ํ„ฐ 5๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค. ์ด 5๋ฒˆ ๋ฐ˜๋ณต๋˜๋ฉด์„œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ๋งŒ์•ฝ from 3 throught 8 ์ด๋ผ๋ฉด 3์—์„œ 8๊นŒ์ง€ 6๋ฒˆ ์‹คํ–‰๋œ๋‹ค.

@each

@each ($๋ณ€์ˆ˜) in (Lists ๋‚˜ Maps){ 
	// ๋ฐ˜๋ณตํ•  ๋‚ด์šฉ
}

each๋ฌธ์€ Lists๋‚˜ Maps์˜ ๊ฐ๊ฐ์˜ ์š”์†Œ๋งˆ๋‹ค ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์„œ ์Šคํƒ€์ผ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

// SCSS
// color-palette ๋ฆฌ์ŠคํŠธ์— ๋“ค์–ด์žˆ๋Š” ์ƒ‰์ƒ์„ each๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ background์— ์ƒ‰์ƒ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.
$color-palette: #dad5d2 #3a3532 #375945 #5b8767 #a6c198 #dbdfc8;

@each $color in $color-palette {
    $i: index($color-palette, $color);
    .color-circle:nth-child(#{$i}) {
    background: $color;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    }
}
// CSS
.color-circle:nth-child(1) {
  background: #dad5d2;
  width: 20px;
  height: 20px;
  border-radius: 50%;
}

.color-circle:nth-child(2) {
  background: #3a3532;
  width: 20px;
  height: 20px;
  border-radius: 50%;
}

.color-circle:nth-child(3) {
  background: #375945;
  width: 20px;
  height: 20px;
  border-radius: 50%;
}

.color-circle:nth-child(4) {
  background: #5b8767;
  width: 20px;
  height: 20px;
  border-radius: 50%;
}

.color-circle:nth-child(5) {
  background: #a6c198;
  width: 20px;
  height: 20px;
  border-radius: 50%;
}

.color-circle:nth-child(6) {
  background: #dbdfc8;
  width: 20px;
  height: 20px;
  border-radius: 50%;
}

$color-palette๊ฐ€ Lists๋กœ ์ด์ฐจ์›์œผ๋กœ ์ˆœํ™˜๋˜๊ณ  ์žˆ๋‹ค. $color๋กœ ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— color์•ˆ์—์„œ ์“ธ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

// SCSS
@each $color in $color-palette {
    .icon-#{$color} {
    background: $color;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    }
}
// CSS
icon-#375945 {
  background: #375945;
  width: 20px;
  height: 20px;
  border-radius: 50%;
}

.icon-#5b8767 {
  background: #5b8767;
  width: 20px;
  height: 20px;
  border-radius: 50%;
}

.icon-#a6c198 {
  background: #a6c198;
  width: 20px;
  height: 20px;
  border-radius: 50%;
}

.icon-#dbdfc8 {
  background: #dbdfc8;
  width: 20px;
  height: 20px;
  border-radius: 50%;

@while

@while ์กฐ๊ฑด {
	// ๋ฐ˜๋ณตํ•  ๋‚ด์šฉ
}

ํŠน์ • ์กฐ๊ฑด์— ์ถฉ์กฑ๋  ๋•Œ๊นŒ์ง€ ์ฝ”๋“œ๋ฅผ ๋ฌดํ•œ ๋ฐ˜๋ณตํ•˜๊ณ  ์กฐ๊ฑด์„ ๋งŒ๋‚  ๋•Œ while๋ฌธ์„ ๋น ์ ธ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค. ์ฐธ๊ณ ๋กœ while๋ฌธ์€ ๋น ์ ธ๋‚˜์˜ค๋Š” ์กฐ๊ฑด์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ฑฐ์˜ ์—†์–ด์„œ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

// SCSS
// value๊ฐ’์ด base๋ณด๋‹ค ์ž‘์„ ๋•Œ๊นŒ์ง€ ์ผ์ •ํ•œ ๊ฐ’์œผ๋กœ ๊ณ„์† ๋‚˜๋ˆ ์ค€๋‹ค.
@function scale-below($value, $base, $ratio: 1.618) {
  @while $value > $base {
    $value: ($value/$ratio);
  }
  @return $value;
}

$normal-font-size: 16px;
.sup {
  font-size: scale-below(20px, 16px);
}
// CSS
.sup {
  font-size: 12.36094px;
}

$value๋ณด๋‹ค ์ž‘์•„์งˆ ๋•Œ๊นŒ์ง€ ๊ณ„์† ๋ฌดํ•œ๋น„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฑฐ๋‹ค. $value์— $ratio๋ฅผ ๋‚˜๋ˆ ์ค€๋‹ค. scale-below๋ผ๊ณ  ์„ ์–ธ์„ ํ•˜์˜€๋‹ค. 20px๊ณผ 16px์— ๋“ค์–ด๊ฐ€ ์žˆ์œผ๋ฉด 20px์€ 16px๋ณด๋‹ค ํฌ๊ธฐ ๋•Œ๋ฌธ์— $value๋Š” 1.618์ด ๋‚˜์˜จ๋‹ค. $value์ด 16px๋ณด๋‹ค ์ž‘์•„์ง€๋ฉด while๋ฌธ์—์„œ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๊ณ  ๋‚˜์„œ $value์€ returnํ•ด์ค€๋‹ค. font-size๋Š” return๋œ $value๊ฐ€ ๋‚˜์˜จ๋‹ค.

function

function

@function ํ•จ์ˆ˜์ด๋ฆ„($๋งค๊ฐœ๋ณ€์ˆ˜) {
	// ์‹คํ–‰ ์ฝ”๋“œ
	@return ๊ฐ’
}

@function ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ•จ์ˆ˜์ด๋ฆ„( ) ํ˜•ํƒœ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์‹คํ–‰ํ•œ๋‹ค. ํ•จ์ˆ˜ ์•ˆ์—์„œ๋Š” @return ์ด์šฉํ•ด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ•จ์ˆ˜๋Š” Mixin๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ mixin์€ ์Šคํƒ€์ผ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  function์€ @return ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’ ์ž์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

// SCSS
// ๊ฑฐ๋“ญ์ œ๊ณฑ์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
@function pow($base, $exponent) { 
  $result: 1;
  @for $_ from 1 through $exponent {
    $result: $result * $base;
  }
  @return $result;
}

.sidebar {
  float: left;
  margin-left: pow(4, 3) * 1px;
}
// CSS
.sidebar {
  float: left;
  margin-left: 64px;
}

$base์— 4, $exponent์— 3์ด ๋“ค์–ด๊ฐ„๋‹ค. result๋ฅผ ๋ฐ˜ํ™˜์„ ํ•ด์ค€๋‹ค. ์˜๋ฏธ ์—†๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ $_๋กœ ์“ด๋‹ค. 1๋ถ€ํ„ฐ exponent๊ฐ€ 3์ด๋‹ˆ๊นŒ 1๋ถ€ํ„ฐ 3๊นŒ์ง€ $_ ์•ˆ์— ๋“ค์–ด ๊ฐ€ ์žˆ๋‹ค. $result๊ฐ€ ๊ณ„์† ๋ณ€๊ฒฝ์ด ๋œ๋‹ค.

๋‚ด์žฅํ•จ์ˆ˜

์ƒ‰์ƒ ํ•จ์ˆ˜

  • lighten(color, amount) : ๊ธฐ์กด ์ƒ‰์ƒ์˜ ๋ฐ๊ธฐ๋ฅผ ๋†’์ธ๋‹ค.( 0%-100% ์‚ฌ์ด์˜ ๊ฐ’ )
  • darken(color, amount) : ๊ธฐ์กด ์ƒ‰์ƒ์˜ ๋ฐ๊ธฐ๋ฅผ ๋‚ฎ์ถ˜๋‹ค.( 0%-100% ์‚ฌ์ด์˜ ๊ฐ’ )
  • mix(color1, color2, weight) : 2๊ฐœ์˜ ์ƒ‰์ƒ์„ ์„ž์–ด์„œ ์ƒˆ๋กœ์šด ์ƒ‰์ƒ์„ ๋งŒ๋“ ๋‹ค.

์ˆซ์ž ํ•จ์ˆ˜

  • max(number, ..) : ๊ด„ํ˜ธ์— ๋„ฃ์€ ๊ฐ’ ์ค‘์— ๊ฐ€์žฅ ํฐ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • min(number, ..) : ๊ด„ํ˜ธ์— ๋„ฃ์€ ๊ฐ’ ์ค‘์— ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • parcentage(number) : ํผ์„ผํŠธ๋กœ ์ˆซ์ž๋ฅผ ๋ฐ”๊ฟ”์ค€๋‹ค.
  • comparable(num1,num2) : ์ˆซ์ž1๊ณผ ์ˆซ์ž2๊ฐ€ ๋น„๊ต ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ ํ›„ true,false ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋ฌธ์ž ํ•จ์ˆ˜

  • srt-insert(string,insert,index) : ๋ฌธ์ž์—ด์— ์›ํ•˜๋Š” ์œ„์น˜(index)์— ๋ฌธ์ž๋ฅผ ๋„ฃ์€ ํ›„(insert), ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • str-index(string,substring) : ๋ฌธ์ž์—ด์—์„œ ํ•ด๋‹น ๋ฌธ์ž์˜ index ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • to-upper-case(string) : ๋ฌธ์ž์—ด ์ „๋ถ€๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.
  • to-lower-case(string) : ๋ฌธ์ž์—ด ์ „๋ถ€๋ฅผ ์†Œ๋ฌธ์ž๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

ํ™•์ธ ํ•จ์ˆ˜

  • unit(number) : ์ˆซ์ž์˜ ๋‹จ์œ„๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • unitless(number) : ๋‹จ์œ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํŒ๋‹จํ•˜์—ฌ true,false ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • variable-exists(name) : ๋ณ€์ˆ˜๊ฐ€ ํ˜„์žฌ ๋ฒ”์œ„์— ์กด์žฌํ•˜๋Š”์ง€ ํŒ๋‹จํ•˜์—ฌ true,false ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋Š” $์—†์ด ์‚ฌ์šฉํ•œ๋‹ค.

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