์ด ๋ฌธ์์ ์๋ณธ์ ์ธ๋ถ ์ํค์์ ๊ฐ์ ธ์์ต๋๋ค.
1. ๊ฐ์[ํธ์ง]
CSS์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋ง๋ CSS ์ ์ฒ๋ฆฌ๊ธฐ์ด๋ค. ๋ณดํต CSS๋ฅผ ์ฌ์ฉํ๋ค๋ณด๋ฉด ๋จ์ ๋ฐ๋ณต๋๋ ๋ถ๋ถ์ด ๋ง์ ๋ฑ, ๋ถํธํจ์ด ๋๊ปด์ง๊ธฐ ๋ง๋ จ์ธ๋ฐ, SASS๋ ์ด ๋ถ๋ถ์ ๊ฑฐ์ ์์ ํ ํด์์์ผ์ฃผ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ค. SASS์๋ Sass์ SCSS๊ฐ ์๋ค.
๋ํ CSS์ ํ์ฅํฉ ๊ฐ์ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ CSS ํ์ผ ๊ทธ ์์ฒด๋ฅผ SCSS๋ก ํ์ฅ์๋ง ๋ฐ๊พธ์ด์ฃผ์ด๋ ์ ์์ ์ผ๋ก ์๋ํ๋ค. ๋ค๋ง SASS ์์ฒด๋ ๊ฐ๋ฐ์์ฉ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ์น๋ธ๋ผ์ฐ์ ๊ฐ ์ฝ์ ์ ์๋ค. ๋ฐ๋ผ์ ์ค๊ฐ์ ์ปดํ์ผ๋ฌ๋ฅผ ๊ฑฐ์ณ์ CSS๋ก ๋ณํํ์ฌ HTML์ ์ฐ๊ฒฐํ๋ค.
๋น์ทํ CSS ์ ์ฒ๋ฆฌ๊ธฐ ์ธ์ด๋ก๋ LESS, Stylus ๋ฑ์ด ์๋ค.
์ด ํ์์ ์ฌ์ฉํ ํ์ผ์ ํ์ฅ์๋ .sass, .scss์ด๋ค. Sass๋ SCSS์์ ์ค๊ดํธ๋ฅผ ์์ ์ ์ฉ๋์ ์ค์ผ ์ ์์ง๋ง ์ค์๋ก ์ธํด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ ํ๋ฅ ์ด ๊ฝค ํฌ๋ค. ๋ฐ๋ผ์ ์ผ๋ฐ์ ์ธ ๊ต์ก ์ฌ์ดํธ์์๋ 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์ ๊ณต์ ๋ฌธ๋ฒ์ผ๋ก ์ฌ์ฉ๋๊ณ ์๋ค.
๋ง๊ทธ๋๋ก 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 ํ์ผ์ ํ๋ก์ ํธ์์ ์ง์ ๋ถ๋ฌ์ฌ ์ ์๊ฒ ๋๋ค.
๊ทธ ์ธ์๋ ๋น์ฃผ์ผ ์คํ๋์ค ์ฝ๋์์ 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;
}