DevYoon
[Sass] Sass๋ ๋ฌด์์ธ๊ฐ? & ๊ธฐ๋ณธ ๋ฌธ๋ฒ ๋ณธ๋ฌธ
๐จ 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
์ธ๋์ค์ฝ์ด(_)๋ก ํ์ผ๋ช ์์
๊ฐ์ ธ์ค๋ ์์ ์ ๊ฐ๋ณ์ ์ผ๋ก ํธ๋์คํ์ผ๋์ง ์์
ํ์ผ๋ค์ ๊ฐ์ ธ์ค๋ ํ์ผ์์ ์ผ๊ด์ ์ผ๋ก ํธ๋์คํ์ผ ์คํ
โ๏ธ์ฐธ๊ณ - ใ๊ธฐ์ด๋ถํฐ ์์ฑ๊น์ง, ํ๋ก ํธ์๋ใ - ์ด์ฌ์ฑ, ํ์