์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
1. ๊ฐœ์š”
1.1. SCSS
2. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ3. ๊ธฐ๋Šฅ4. ์ฐธ์กฐ


๊ณต์‹ ํ™ˆํŽ˜์ด์ง€

Syntactically Awesome StyleSheets

1. ๊ฐœ์š”[ํŽธ์ง‘]

CSS์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“  CSS ์ „์ฒ˜๋ฆฌ๊ธฐ์ด๋‹ค. ๋ณดํ†ต CSS๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ๋‹จ์ˆœ ๋ฐ˜๋ณต๋˜๋Š” ๋ถ€๋ถ„์ด ๋งŽ์€ ๋“ฑ, ๋ถˆํŽธํ•จ์ด ๋А๊ปด์ง€๊ธฐ ๋งˆ๋ จ์ธ๋ฐ, SASS๋Š” ์ด ๋ถ€๋ถ„์„ ๊ฑฐ์˜ ์™„์ „ํžˆ ํ•ด์†Œ์‹œ์ผœ์ฃผ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋‹ค. SASS์—๋Š” Sass์™€ SCSS๊ฐ€ ์žˆ๋‹ค.

๋˜ํ•œ CSS์˜ ํ™•์žฅํŒฉ ๊ฐ™์€ ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— CSS ํŒŒ์ผ ๊ทธ ์ž์ฒด๋ฅผ SCSS๋กœ ํ™•์žฅ์ž๋งŒ ๋ฐ”๊พธ์–ด์ฃผ์–ด๋„ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค. ๋‹ค๋งŒ SASS ์ž์ฒด๋Š” ๊ฐœ๋ฐœ์ž์šฉ ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์›น๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฝ์„ ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์ค‘๊ฐ„์— ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ฑฐ์ณ์„œ CSS๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ HTML์— ์—ฐ๊ฒฐํ•œ๋‹ค.

๋น„์Šทํ•œ CSS ์ „์ฒ˜๋ฆฌ๊ธฐ ์–ธ์–ด๋กœ๋Š” LESS, Stylus ๋“ฑ์ด ์žˆ๋‹ค.

์ด ํ˜•์‹์„ ์‚ฌ์šฉํ•œ ํŒŒ์ผ์˜ ํ™•์žฅ์ž๋Š” .sass, .scss์ด๋‹ค. Sass๋Š” SCSS์—์„œ ์ค‘๊ด„ํ˜ธ๋ฅผ ์—†์• ์„œ ์šฉ๋Ÿ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ˆ˜๋กœ ์ธํ•ด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋œฐ ํ™•๋ฅ ์ด ๊ฝค ํฌ๋‹ค. ๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์ธ ๊ต์œก ์‚ฌ์ดํŠธ์—์„œ๋Š” SCSS๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•œ๋‹ค.

1.1. SCSS[ํŽธ์ง‘]

Sassy CSS

๋ง๊ทธ๋Œ€๋กœ Sassํ•œ CSS๋ผ๋Š” ๋œป์ด๋‹ค. ์‹ค์ œ ๋œป์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด CSSํ•œ Sass๊ฐ€ ๋” ๋งž๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ๊ธฐ์กด Sass์˜ ๋ฌธ๋ฒ•์—์„œ, CSS์˜ ์›๋ž˜ ๋ฌธ๋ฒ•์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CSS๋งŒ ์•Œ๋˜ ์‚ฌ๋žŒ๋“ค์ด ์ฒ˜์Œ ์ ‘ํ•ด๋„ ์ง๊ด€์ ์œผ๋กœ ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

๋‹จ์ˆœํžˆ ๊ฐ€๋…์„ฑ๋งŒ์ด ์•„๋‹ˆ๋ผ Sass์˜ ๊ธฐ์กด๋ฌธ๋ฒ•์ด ๋“ค์—ฌ์“ฐ๊ธฐ ๋ฐ ์ค„๋ฐ”๊ฟˆ์— ์˜์กดํ•˜๋Š” ๋ฌธ๋ฒ•์ž„์— ๋น„ํ•ด, SCSS๋Š” ์ค‘๊ด„ํ˜ธ๊ฐ€ ์žˆ๊ธฐ์— ๊ณต๋ฐฑ์— ์˜ํ•ด ์ปดํŒŒ์ผ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ํ™•๋ฅ ํžˆ ํ˜„์ €ํžˆ ์ ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๋“ค์ด SCSS ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ Sass์˜ ๊ณต์‹ ๋ฌธ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

2. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ[ํŽธ์ง‘]

์—ฌ๋Ÿฌ ํŽธ์ง‘๊ธฐ์™€ ์—ฌ๊ธฐ์— ๋ช…์‹œ๋œ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ณธ๋ž˜ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ Ruby๋กœ ๋˜์–ด ์žˆ์–ด์„œ Ruby ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋„ ์„ค์น˜ํ•ด์•ผ ํ–ˆ์ง€๋งŒ, C++๋กœ ์ œ์ž‘๋œ libsass ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‚˜์˜ค๋ฉด์„œ ์ด์ชฝ์ด ๋” ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค. npm์—์„œ๋„ libsass ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํŒจํ‚ค์ง€ ํ˜•ํƒœ๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์–ด์„œ CUI ํ™˜๊ฒฝ์—์„œ๋Š” ์ด ๋ฐฉ๋ฒ•์ด ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

๊ทธ ์™ธ์—๋„ ๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค ์ฝ”๋“œ์—์„œ Live Sass Compiler๋ผ๋Š” ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŽธ์ง‘๊ธฐ์—์„œ ํŽธ์ง‘ํ•˜๊ณ  ์ €์žฅ๋งŒ ํ•˜๋ฉด ์ž๋™์œผ๋กœ CSS๋กœ ์ปดํŒŒ์ผํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ๋„ ์žˆ๋‹ค.

React์—์„œ๋Š” ํ„ฐ๋ฏธ๋„์—์„œ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋“ค์–ด๊ฐ€ npm install node-sass ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด SCSS ํŒŒ์ผ์„ ํ”„๋กœ์ ํŠธ์—์„œ ์ง์ ‘ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

3. ๊ธฐ๋Šฅ[ํŽธ์ง‘]

  • ๋„ค์ŠคํŒ… - ๊ณ„์ธต์ ์œผ๋กœ ์ƒ์†๋˜๋Š” CSS๋ฅผ ๋”์šฑ ๊ณ„์ธต์ ์œผ๋กœ ๋ณด์ด๊ฒŒ ๋งŒ๋“œ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ์„ ํƒ์ž์—์„œ ์ƒ์œ„ ๊ณ„์ธต์„ ์ ๋˜ ๊ฒƒ์„ ์ •๋ฆฌํ•˜๊ณ  ๊ด€๋ จ ์š”์†Œ๋“ค์„ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ๋”์šฑ ๊น”๋”ํ•ด์ง„๋‹ค.
CSS
ul {
    list-style:none;
    width:1000px;
    margin:0 auto
    }
ul li {
    float:left;
    }
ul li a {
     color:black;
     padding:20px;
     display:block;
    }

SCSS
ul {
    list-style:none;
    width:1000px;
    margin:0 auto;
    li {
        float:left;
        a {
            color:black;
            padding:20px;
            display:block;
        }
    }
}


  • ํ™•์žฅ
  • ํŠน์ˆ˜ ์„ ํƒ์ž
  • SassScript
    • ๋ณ€์ˆ˜ - $๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์ค‘๋ณต๋œ ๋‹จ์–ด๋ฅผ ๋ณ€์ˆ˜๋กœ ์น˜ํ™˜ํ•˜์—ฌ ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.
CSS
.dv1 {width:1000px;margin:0 auto;border:1px solid black}
.dv2 {width:200px;border:1px solid black}
.dv3 {width:500px;float:left;border:1px solid black}
.dv4 {width:700px;position:relative;border:1px solid black}
.dv5 {width:100px;position:absolute;border:1px solid black}

SCSS
$bLine:1px solid black; /* ์—ฌ๊ธฐ๋งŒ ๋ฐ”๊พธ๋ฉด 5๊ฐœ์˜ ํด๋ž˜์Šค ๊ฐ’์„ ์ „๋ถ€ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.  */
 
.dv1 {width:1000px;margin:0 auto;border:$bLine}
.dv2 {width:200px;border:$bLine}
.dv3 {width:500px;float:left;border:$bLine}
.dv4 {width:700px;position:relative;border:$bLine}
.dv5 {width:100px;position:absolute;border:$bLine}



  • ์—ฐ์‚ฐ - ๊ฐ„๋‹จํ•œ ์—ฐ์‚ฐ์„ ํ•  ์ˆ˜ ์žˆ์–ด์„œ ํŒ€ํ”„๋กœ์ ํŠธ ๋“ฑ์„ ํ•  ๋•Œ ์™œ ์ด๋Ÿฐ ์ˆ˜์น˜๊ฐ€ ๋‚˜์™”๋Š”์ง€ ์˜๋„๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
CSS
.dv1 {float:left;width:101.11111px;margin-right:10px}

SCSS
.dv1 {float:left;width:(1000px/9)-10px;margin-right:10px}




  • ํ•จ์ˆ˜ - ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ์ฝ”๋“œ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๊ธฐ๋Šฅ์„ ๋ช…์‹œํ•˜์—ฌ ์œ ์ง€๊ด€๋ฆฌ์— ๋„์›€์„ ์ค€๋‹ค.
CSS
.dv1 {width:1000px;border:1px solid black;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}
.dv2 {width:200px;border:1px solid black;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}
.dv3 {width:500px;border:1px solid black;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}
.dv4 {width:700px;border:1px solid black;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}
.dv5 {width:100px;position:absolute;border:1px solid black;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}

SCSS
@mixin centering(){
  position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)
}

.dv1 {width:1000px;@include centering()}
.dv2 {width:200px;@include centering()}
.dv3 {width:500px;@include centering()}
.dv4 {width:700px;@include centering()}
.dv5 {width:100px;@include centering()}




CSS
.dv1 {width:225px}
.dv2 {width:525px}
.dv3 {width:150px}

SCSS
@function width-cal($a, $b){
  @return $a * $b;
}

.dv1 {width:width-cal(900px, 3/12)}
.dv2 {width:width-cal(900px, 7/12)}
.dv3 {width:width-cal(900px, 2/12)}



  • ๋ฐ˜๋ณต๋ฌธ - ๋น„์Šทํ•œ ๊ตฌ๋ฌธ์˜ ๋ฐ˜๋ณต ์ž‘์„ฑ์„ ํŽธํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
CSS
div:nth-child(1) {
  top: 10px;
}
div:nth-child(2) {
  top: 20px;
}
div:nth-child(3) {
  top: 30px;
}

...

div:nth-child(60) {
  top: 600px;
}

SCSS
@for $i from 1 through 60 {
    div:nth-child(#{$i}){
        top:10px * $i;
    }
}
  • ์กฐ๊ฑด๋ฌธ - ์กฐ๊ฑด์— ๋”ฐ๋ผ ์†์„ฑ์˜ ๊ฐ’์„ ๋‹ค๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
CSS
.container *:nth-child(1) {
  -ms-grid-row: 1;
  -ms-grid-column: 1;
  grid-area: 1/1;
}

.container *:nth-child(2) {
  -ms-grid-row: 1;
  -ms-grid-column: 2;
  grid-area: 1/2;
}

.container *:nth-child(3) {
  -ms-grid-row: 1;
  -ms-grid-column: 3;
  grid-area: 1/3;
}

.container *:nth-child(4) {
  -ms-grid-row: 1;
  -ms-grid-column: 4;
  grid-area: 1/4;
}

.container *:nth-child(5) {
  -ms-grid-row: 2;
  -ms-grid-column: 1;
  grid-area: 2/1;
}

...

.container *:nth-child(60) {
  -ms-grid-row: 15;
  -ms-grid-column: 4;
  grid-area: 15/4;
}

SCSS
.container{
    *{
      @for $i from 1 through 60 { 
        &:nth-child(#{$i}){ /* #{}๋Š” ์ˆซ์ž๋ฅผ ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค. ๋˜ํ•œ &๋Š” ๋ถ€๋ชจ๋ฅผ ์„ ํƒํ•˜๊ฒŒ ํ•˜๋Š” ์„ ํƒ์ž์ด๋‹ค. */
          @if ($i%4 == 0) {
            grid-area:#{floor($i/4+0.9)}/4
          }
          @else {
            grid-area:#{floor($i/4+0.9)}/#{$i%4}
          }
        }
      }
    }
  }
  • Vendor Prefix - webkit ์ฝ”๋“œ๋‚˜ ms ์ฝ”๋“œ๋ฅผ ์ผ์ผ์ด ์ ์ง€ ์•Š์•„๋„ webkit์ด๋‚˜ IE ๋“ฑ์—์„œ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค€๋‹ค.
CSS
.dv1 {
  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0)), to(rgba(255,245,0,.9)));
  background-image: linear-gradient(to right, rgba(0,0,0,0), rgba(255,245,0,.9));
  display: -ms-grid;
  display: grid;
  }

SCSS
.dv1 {
  background-image: linear-gradient(to right, rgba(0,0,0,0), rgba(255,245,0,.9));
  display: grid;
  }

4. ์ฐธ์กฐ[ํŽธ์ง‘]