๐ 1๏ธโฃ ๋ ์ด์์ & ์ ๋ ฌ ์ต์ข ํ
๊ฐ๋ | ์ค๋ช | ๋น์ ๐ | ์ค๋ฌด ํฌ์ธํธ ๐ |
---|---|---|---|
display |
์์์ ๋ฐ์ค ํ์ ๊ฒฐ์ โ block, inline, flex, grid | ๐ฆ ์์์ ํํ ์ค์ | ์ค๋ฌด ๊ธฐ๋ณธ: flex, grid |
position |
์์์ ์์น ์ง์ โ static, relative, absolute, fixed, sticky | ๐ ๊ฐ๊ตฌ ๋ฐฐ์น ์ ํ๊ธฐ | absolute ๋ถ๋ชจ๋ relative ํ์! |
flexbox |
1D ๋ ์ด์์ (์ฃผ์ถ์ ๋ฐ๋ผ ์ ๋ ฌ) | โก๏ธ ์ฑ ๊ฝ์ด ์ง์ด | ์์ฃผ ์ฐ๋ ์ ๋ ฌ โ justify-content: space-between |
grid |
2D ๋ ์ด์์ (ํ + ์ด ์ ๋ ฌ) | ๐งฉ ํผ์ฆํ ๋ฐฐ์น | template-areas๋ก ์ง๊ด์ ๋ ์ด์์ ๊ด๋ฆฌ |
float |
์ข/์ฐ๋ก ๋์ (ํ ์คํธ ์ฃผ์ ๋ฐฐ์น) | ๐โโ๏ธ ์ด๋ฏธ์ง ์์ผ๋ก ํ ์คํธ ํ๋ฆ | ๋ ๊ฑฐ์ โ Flex/Grid๋ก ๋์ฒด |
clear |
float ํด์ | ๐ง ํ๋ฆ ๋๊ธฐ | clearfix ํจํด ํ์ ์ ์ฌ์ฉ |
โ ์ฌํ ์์ : Grid + Flex ํผํฉ
/* ์ ์ฒด ๋ ์ด์์์ ๋ด๋นํ๋ ์ปจํ
์ด๋ */
.container {
display: grid; /* Grid ๋ ์ด์์ ์ ์ฉ */
/* Grid ์์ญ์ ์ด๋ฆ์ผ๋ก ์ ์ */
grid-template-areas:
"header header" /* ์ฒซ ์ค: header๊ฐ ๋ ์นธ ๋ชจ๋ ์ฐจ์ง */
"nav main" /* ๋ ๋ฒ์งธ ์ค: ์ผ์ชฝ์ nav, ์ค๋ฅธ์ชฝ์ main */
"footer footer";/* ์ธ ๋ฒ์งธ ์ค: footer๊ฐ ๋ ์นธ ๋ชจ๋ ์ฐจ์ง */
/* ์ด ๋๋น ์ค์ : ์ฒซ ๋ฒ์งธ ์ด์ 200px ๊ณ ์ , ๋ ๋ฒ์งธ ์ด์ ๋จ๋ ๊ณต๊ฐ ๋ชจ๋ ์ฌ์ฉ */
grid-template-columns: 200px 1fr;
}
/* ํค๋ ์์ญ ์ค์ */
.header {
grid-area: header; /* header ์์ญ์ ์์น */
}
/* ๋ด๋น๊ฒ์ด์
์์ญ ์ค์ */
.nav {
grid-area: nav; /* nav ์์ญ์ ์์น */
/* nav ์์ ์์ดํ
๋ค์ Flexbox๋ก ์ธ๋ก ์ ๋ ฌ */
display: flex;
flex-direction: column; /* ์ธ๋ก ๋ฐฉํฅ ์ ๋ ฌ */
justify-content: space-between; /* ์-์๋๋ก ๊ณต๊ฐ์ ์ต๋ํ ๋ฒ๋ฆผ */
}
/* ๋ฉ์ธ ์ฝํ
์ธ ์์ญ ์ค์ */
.main {
grid-area: main; /* main ์์ญ์ ์์น */
}
/* ํธํฐ ์์ญ ์ค์ */
.footer {
grid-area: footer; /* footer ์์ญ์ ์์น */
}
๐ ํฌ์ธํธ:
- Grid โ ํฐ ํ
- Flex โ ๋ด๋ถ ์ธ๋ถ ์ ๋ ฌ
- ์ค๋ฌด์์ ๊ฐ์ฅ ์์ฃผ ์ฐ๋ ํผํฉ ๊ตฌ์กฐ
๐ฑ 2๏ธโฃ ๋ฐ์ํ ์น ์ฌํ ํ์ฅ
๊ฐ๋ | ์ค๋ช | ๋น์ ๐ | ์ค๋ฌด ํฌ์ธํธ ๐ |
---|---|---|---|
@media |
ํ๋ฉด ํฌ๊ธฐ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅธ ์คํ์ผ | ๐ ์ฌ์ด์ฆ๋ณ ์ท ๋ฐ๊พธ๊ธฐ | Mobile-first ์ ๋ต ๊ถ์ฅ |
๋จ์ | vw , vh , rem , em , % |
๐ ํฌ๊ธฐ ๋์ด๋๋ ํ์ | rem โ ์ ๊ทผ์ฑ ๊ณ ๋ ค, vw/vh โ ๋ฐ์ํ ํต์ฌ |
flex-wrap , grid-auto-flow |
์์ ํ๋ฉด์์ ์๋ ์ค๋ฐ๊ฟ | ๐งฉ ์๋ ๋ง์ถค ํผ์ฆ | ์ปจํ ์ด๋๊ฐ ์ข์์ง ๋ ์์ฐ์ค๋ฌ์ด ์ค๋ฐ๊ฟ |
โ ์ฌํ ์์ : ์๋ฒฝํ ๋ฐ์ํ ์นด๋ ๋ ์ด์์
/* ์นด๋๋ค์ ๋ด๊ณ ์๋ ์ปจํ
์ด๋ */
.container {
display: grid; /* Grid ๋ ์ด์์ ์ ์ฉ */
/* ์ด(Column)์ ์๋์ผ๋ก ๋ฐ๋ณต ์์ฑ
๊ฐ ์ด์ ์ต์ 250px, ์ต๋ ๊ณต๊ฐ์ 1fr ๋น์จ๋ก ์ฑ์
ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ์นด๋ ์๊ฐ ์๋ ์กฐ์ ๋จ (๋ฐ์ํ) */
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 1rem; /* ์นด๋๋ค ์ฌ์ด์ 1rem(16px ์ ๋) ๊ฐ๊ฒฉ */
}
/* ๊ฐ๋ณ ์นด๋ ์คํ์ผ */
.card {
background: white; /* ์นด๋ ๋ฐฐ๊ฒฝ ํฐ์ */
padding: 1rem; /* ์นด๋ ์์ชฝ ์ฌ๋ฐฑ 1rem */
}
/* ํ๋ฉด ๋๋น๊ฐ 600px ์ดํ (๋ชจ๋ฐ์ผ ํ๋ฉด)์ผ ๋ */
@media (max-width: 600px) {
.container {
grid-template-columns: 1fr; /* ์นด๋ ํ๋๊ฐ ํ ์ค ์ ์ฒด ์ฐจ์ง (์ธ๋ก๋ก ์ญ ๋์ด) */
}
}
๐ ํฌ์ธํธ:
- auto-fit + minmax โ ์ ์ฐํ ์นด๋ ๋ ์ด์์
- ๋ชจ๋ฐ์ผ์์๋ ํ ์ค๋ก ๋ณ๊ฒฝ
โจ 3๏ธโฃ ์ ๋๋ฉ์ด์ & ํธ๋์ง์ ์ฌํ ํ์ฅ
์์ฑ | ์ค๋ช | ๋น์ ๐ | ์ค๋ฌด ํฌ์ธํธ ๐ |
---|---|---|---|
transition |
์ํ ๋ณํ ์ ๋ถ๋๋ฝ๊ฒ | ๐ช ์ฒ์ฒํ ์ด๋ฆฌ๋ ๋ฌธ | ๋ฒํผ, ๋ฉ๋ด, ์ด๋ฏธ์ง hover |
animation |
๋ฐ๋ณต์ ์์ง์ ์ ์ด | ๐ข ๋กค๋ฌ์ฝ์คํฐ | ๋ฐฐ๋ ์ฌ๋ผ์ด๋, ๋ก๋ฉ ํจ๊ณผ |
@keyframes |
์ ๋๋ฉ์ด์ ๋จ๊ณ ์ง์ | ๐๏ธ ์ฌ๋ผ์ด๋์ผ | ย |
will-change |
๋ ๋๋ง ์ต์ ํ ํํธ | ๐ GPU ๊ฐ์ ์์ฝ | transform, opacity์๋ง ์ฌ์ฉ! |
โ ์ฌํ ์์ : ์นด๋ ์ ๋๋ฉ์ด์
/* ์นด๋ ์คํ์ผ์ ํธ๋์ง์
(๋ณํ ํจ๊ณผ) ์ถ๊ฐ */
.card {
/* transform๊ณผ box-shadow๊ฐ 0.4์ด ๋์ ๋ถ๋๋ฝ๊ฒ ๋ณํ */
transition: transform 0.4s, box-shadow 0.4s;
}
/* ์นด๋์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ ธ์ ๋ (hover) */
.card:hover {
transform: translateY(-10px); /* ์นด๋๊ฐ ์๋ก 10px ์ด์ง ์ฌ๋ผ๊ฐ */
box-shadow: 0 10px 20px rgba(0,0,0,0.2); /* ๊ทธ๋ฆผ์๊ฐ ์ปค์ ธ์ ์
์ฒด๊ฐ ํจ๊ณผ */
}
/* ํ์ด๋ ์ธ ์ ๋๋ฉ์ด์
์ ์ */
@keyframes fadeIn {
from { opacity: 0; } /* ์ฒ์์ ์์ ํฌ๋ช
*/
to { opacity: 1; } /* ๋์ ์์ ๋ถํฌ๋ช
(์์ฐ์ค๋ฝ๊ฒ ๋ํ๋จ) */
}
/* ์ ์ฒด ์ปจํ
์ด๋์ ํ์ด๋ ์ธ ์ ๋๋ฉ์ด์
์ ์ฉ */
.container {
animation: fadeIn 1s ease-in; /* 1์ด ๋์ ์ฒ์ฒํ ๋ํ๋จ */
will-change: opacity; /* ์ฑ๋ฅ ์ต์ ํ ํํธ: opacity๊ฐ ๋ณํ ๊ฒ์์ ๋ธ๋ผ์ฐ์ ์๊ฒ ๋ฏธ๋ฆฌ ์๋ ค์ค */
}
๐ ๋ฉด์ ํ:
- transform + opacity โ GPU ๊ฐ์
- will-change ๋จ๋ฐ ๊ธ์ง โ ๊ณผ๋ํ๋ฉด ๋ ๋๋ง ๋ถํ
๐ค 4๏ธโฃ ํฐํธ & ํ ์คํธ ์ฌํ ํ์ฅ
์์ฑ | ์ค๋ช | ๋น์ ๐ | ์ค๋ฌด ํฌ์ธํธ ๐ |
---|---|---|---|
font-family |
๊ธ๊ผด ์ง์ | โ๏ธ ๊ธ์จ์ฒด ๊ณ ๋ฅด๊ธฐ | Google Fonts CDN ํ์ฉ |
font-size |
ํฌ๊ธฐ | ๐ ๊ธ์จ ํ๋/์ถ์ | clamp(), rem, vw ์ ๊ทน ์ฌ์ฉ |
line-height |
์ค ๊ฐ๊ฒฉ | ๐ ์ฑ ์ค ๊ฐ๊ฒฉ ์กฐ์ | 1.5~1.8 ๊ถ์ฅ โ ๊ฐ๋ ์ฑโ |
letter-spacing |
๊ธ์ ๊ฐ๊ฒฉ | ๐งฎ ๋์ด์ฐ๊ธฐ ํญ ์กฐ์ | ย |
font-display |
ํฐํธ ๋ก๋ฉ ์ ๋ต | ๐ฆ Fallback ๊ธ๊ผด ์ ์ด | swap โ ํ์ด์ง ๋ ๋๋ง ๋น ๋ฆ |
โ ๋ฐ์ํ ํฐํธ ์ฌํ ์์
h1 {
/* ๐ ๋ฐ์ํ ํฐํธ ํฌ๊ธฐ ์ค์ : ์ต์ 1.5rem, ํ๋ฉด ํญ์ ๋ฐ๋ผ 5vw, ์ต๋ 3rem */
font-size: clamp(1.5rem, 5vw, 3rem);
/* โ๏ธ ๊ธ๊ผด ์ง์ : 'Poppins' ํฐํธ โ ์์ ์ sans-serif ๋์ฒด */
font-family: 'Poppins', sans-serif;
/* ๐ ์ค ๊ฐ๊ฒฉ: 1.6๋ฐฐ โ ๊ฐ๋
์ฑ ํฅ์ */
line-height: 1.6;
/* ๐ ์นํฐํธ ๋ ๋๋ง ์ ๋ต: ํฐํธ ๋ก๋ฉ ์ ๊ธฐ๋ณธ ํฐํธ ๋ณด์ฌ์ฃผ๊ณ , ๋ก๋ ์๋ฃ๋๋ฉด ๊ต์ฒด */
font-display: swap;
}
๐จ 5๏ธโฃ ์์ & ๋ฐฐ๊ฒฝ ์ฌํ
์์ฑ | ์ค๋ช | ๋น์ ๐ | ์ค๋ฌด ํฌ์ธํธ ๐ |
---|---|---|---|
color , background-color |
๊ธ์/๋ฐฐ๊ฒฝ ์์ | ๐จ ์น ํ & ๋ฐฐ๊ฒฝ์ | ๋คํฌ๋ชจ๋ ๋์ ์ํด CSS ๋ณ์์ ํจ๊ป ํ์ฉ |
opacity , rgba |
ํฌ๋ช ๋ ์กฐ์ | ๐ซ๏ธ ์ ๋ฆฌ ํจ๊ณผ | rgba โ ๋ฐฐ๊ฒฝ๋ง, opacity โ ์ ์ฒด |
gradient |
๊ทธ๋ผ๋์ธํธ ๋ฐฐ๊ฒฝ | ๐ ๋ฌด์ง๊ฐ ๋ฐฐ๊ฒฝ | ๋ธ๋๋ ์ปฌ๋ฌ ๊ฐ์กฐ |
โ ๋ฐฐ๊ฒฝ ๊ณ ๊ธ ์์
/* ์ ์ฒด ํ์ด์ง(body)์ ๋ฐฐ๊ฒฝ ์ค์ */
body {
/* ๋๊ฐ์ (135๋) ๋ฐฉํฅ์ผ๋ก ๊ทธ๋ผ๋์ธํธ ๋ฐฐ๊ฒฝ ์ ์ฉ
์ผ์ชฝ ์๋จ โ ์ค๋ฅธ์ชฝ ํ๋จ์ผ๋ก #f06(ํํฌ)์์ #4a90e2(ํ๋์)์ผ๋ก ์์ฐ์ค๋ฝ๊ฒ ๋ณํ */
background: linear-gradient(135deg, #f06, #4a90e2);
}
/* ์ค๋ฒ๋ ์ด(๋ฐํฌ๋ช
๋ง์์ฐ๊ธฐ) ์์ ์คํ์ผ */
.overlay {
/* ๋ฐํฌ๋ช
๊ฒ์ ์ ๋ฐฐ๊ฒฝ (rgba: ๋นจ๊ฐ, ์ด๋ก, ํ๋, ํฌ๋ช
๋)
ํฌ๋ช
๋ 0.5 โ ๋ฐฐ๊ฒฝ์ด 50% ํฌ๋ช
ํ๊ฒ ๋ณด์ */
background-color: rgba(0,0,0,0.5);
}
๐ง 6๏ธโฃ CSS ๋ณ์ ์ฌํ ํ์ฅ
๊ฐ๋ | ์ค๋ช | ๋น์ ๐ | ์ค๋ฌด ํฌ์ธํธ ๐ |
---|---|---|---|
--๋ณ์๋ช
|
๋ณ์ ์ ์ธ | ๐ฆ ์์์ ๊ฐ ์ ์ฅ | ํ ๋ง, ์์, ์ฌ๋ฐฑ ๊ด๋ฆฌ |
var() |
๋ณ์ ํธ์ถ | ๐ฌ ์์์์ ๊บผ๋ด๊ธฐ | ๋คํฌ๋ชจ๋, ๋ค๊ตญ์ด ๋์ |
๋ฐํ์ ์์ | JS๋ก ์ค์๊ฐ ์์ ๊ฐ๋ฅ | ๐ฎ ์ต์ ์ค์๊ฐ ๋ณ๊ฒฝ | ์ค์๊ฐ ๋คํฌ๋ชจ๋, ์ ์ ์ปค์คํฐ๋ง์ด์ง |
โ ์ค์ ์์ : ํ ๋ง ์ค์์น
/* ์ ์ญ CSS ๋ณ์ ์ ์ธ (๊ธฐ๋ณธ ํ
๋ง ์์) */
:root {
--primary-color: #333; /* ๊ธ์ ์ โ ์ด๋์ด ํ์ (#333) */
--bg-color: white; /* ๋ฐฐ๊ฒฝ ์ โ ํฐ์ */
}
/* ๋คํฌ ๋ชจ๋์ฉ ํด๋์ค */
.dark {
--primary-color: white; /* ๋คํฌ ๋ชจ๋์์ ๊ธ์ ์ โ ํฐ์ */
--bg-color: #333; /* ๋คํฌ ๋ชจ๋์์ ๋ฐฐ๊ฒฝ ์ โ ์ด๋์ด ํ์ (#333) */
}
/* ์ค์ ์ ์ฉ ๋ถ๋ถ */
body {
color: var(--primary-color); /* ๊ธ์ ์์ CSS ๋ณ์ ์ ์ฉ */
background-color: var(--bg-color); /* ๋ฐฐ๊ฒฝ ์์๋ CSS ๋ณ์ ์ ์ฉ */
}
๐ก 7๏ธโฃ ์ค๋ฌด Best Practice ํ์ฅ
ํฌ์ธํธ | ์ด์ |
---|---|
Grid + Flex ํผํฉ โ ๋ณต์ก ๋ ์ด์์ ๊น๋ํ๊ฒ ๊ตฌํ | header/footer grid, ๋ด๋ถ flex |
Mobile-First + media query โ ์ ์ง๋ณด์ ํจ์จ โ | ์ฑ๋ฅ ์ต์ ํ, ์ ๊ทผ์ฑ โ |
CSS ๋ณ์ ์ ๊ทน ์ฌ์ฉ โ ์ ์ง๋ณด์์ฑ & ํ ๋ง ์ ์ฐํ | ์์, ํฐํธ, ์ฌ๋ฐฑ ๋ฑ ๊ณตํต ๊ด๋ฆฌ |
animation โ transform + opacity ์ค์ฌ, will-change ์ต์ํ | ๋ ๋๋ง ์ฑ๋ฅ ์ต์ ํ |
ํฐํธ โ clamp(), rem ๋จ์ + font-display: swap | ๊ฐ๋ ์ฑ & ์๋ ์ต์ ํ |
๐ง 8๏ธโฃ ๊ธฐ์ ๋ฉด์ ๊ณ ๊ธ ์ง๋ฌธ ํฌ์ธํธ
์ง๋ฌธ | ๊ณ ๊ธ ํฌ์ธํธ ์ ๋ฆฌ |
---|---|
Flexbox์ Grid ์ ํ ๊ธฐ์ค? | 1D โ Flex / 2D โ Grid, ๋ ํผํฉ ๊ฐ๋ฅ |
opacity vs rgba ์ฐจ์ด? | opacity: ์ ์ฒด ์์, rgba: ๋ฐฐ๊ฒฝ๋ง ํฌ๋ช |
CSS ๋ณ์ vs SASS ๋ณ์ ์ฐจ์ด? | CSS ๋ณ์: ๋ฐํ์ ์์ , SASS ๋ณ์: ์ปดํ์ผ ์ ๊ณ ์ |
will-change ์์ฑ ์ฃผ์์ ์? | ๊ณผ๋ ์ฌ์ฉ โ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น & ๋ ๋๋ง ๋ณ๋ชฉ |
clamp(), minmax() ์ธ์ ์ฌ์ฉํ๋๊ฐ? | ๊ฐ๋ณ ํฐํธ, ๋ ์ด์์ โ ๋ฐ์ํ ํ์ |