SCSS ์๊ฐ ๐จ
13385 ๋จ์ด productivitycodenewbiewebdevcss
๋๋ ์ ์ ๋์ 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 ํ๋ฆฌํ๋ก์ธ์๋ฅผ ์ฌ์ฉํ๋๋ฐ ๊ทธ๋ด ๋งํ ์ด์ ๊ฐ ์์ต๋๋ค.
์ฆ๊ฒ๊ฒ ์ฝ์ผ์ จ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๊ณง ๋ต๊ฒ ์ต๋๋ค!
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(SCSS ์๊ฐ ๐จ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/killianfrappartdev/scss-introduction-8ppํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค