๐
์์ฆ ํด๋ํฐ์ ํ๋ฉด๋น์จ์ ์ ๋ง ๋ค์ํ๋ค.
๋ฏธ๋ ์ฌ์ด์ฆ์ ์ ํธ๋๊ฐ ์ค๊ณ ํด๋ํฐ์ ํ๊ท ์ฌ์ด์ฆ๊ฐ ์ปค์ก์ด๋ ์์ ๊ธฐ์ข ์ ๊ณ ๋ คํ์ง ์์ ์ ์๋ค.
์ด๋ค ๊ธฐ๊ธฐ๋ ์ธ๋ก ๊ธธ์ด๊ฐ 667px ์ ๋๋ก ์๊ณ , ์ด๋ค ๊ธฐ๊ธฐ๋ 882px ์ด์์ผ๋ก ๊ฝค ํฌ๋ค.
๊ทธ๋์ ๋์์ธ ์์์ ๋ฐํ์ผ๋ก ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด ์ด๋ฐ ๊ณ ๋ฏผ์ด ์๊ธด๋ค.
UI ์์ ํฌ๊ธฐ๋ ์์ ํ๋ฉด ๊ธฐ์ค์ผ๋ก ํด์ผ ํ ๊น? ํฐ ํ๋ฉด ๊ธฐ์ค์ผ๋ก ํด์ผ ํ ๊น?
์์ ์ฌ์ด์ฆ์์๋ ํ์ด์ง ๋์์ธ์ด "์๋ป"๋ณด์ด๋๋ฐ ํฐ ์ฌ์ด์ฆ์์๋ ์ ์ ํ์ง ์์๋ณด์ธ๋ค๋ฉด.. ์ด๋ป๊ฒ ํด์ผํ ๊น?
๊ณ ๋ฏผ์ ๋ฐํ์ผ๋ก
- ๋ชจ๋ฐ์ผ UI๋ฅผ ๋์์ด๋ ๊ด์ ์์ ์ด๋ป๊ฒ ์ค๊ณํ๋์ง
- ๊ทธ๋ฆฌ๊ณ ํ๋ก ํธ์๋์์ ๋์์ธ ์์คํ ์ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง
๋ฅผ ๊ฐ๋ณ๊ฒ ์ ๋ฆฌํด๋ณด์๋ค.
1. ๋ชจ๋ฐ์ผ UI๋ ์ด๋ค ํ๋ฉด ๊ธฐ์ค์ผ๋ก ๋์์ธํ ๊น?
์น ๋์์ธ์ ๋ฐฐ์๋ณด์ง ์์์ผ๋ ์ณ์งํผํฐ์๊ฒ ๋ฌผ์ด๋ณธ ๊ฒฐ๊ณผ
๊ฒฐ๋ก ๋ถํฐ ๋งํ๋ฉด ๋ณดํต ์์ ํ๋ฉด ๊ธฐ์ค์ผ๋ก ์ค๊ณํ๋ค๊ณ ํ๋ค.
๊ทธ ์ด์ ๋
์์ ํ๋ฉด์์ UI๊ฐ ๊นจ์ง๋ฉด ๋ณต๊ตฌ๊ฐ ๊ฑฐ์ ๋ถ๊ฐ๋ฅํ๊ณ
ํฐ ํ๋ฉด์ ์ฌ๋ฐฑ์ด๋ ๋ ์ด์์ ํ์ฅ์ผ๋ก ๋์ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
โ ๊ณ ์ ๋๋ UI
๋ฒํผ ๋์ด, ํฐ์น ์์ญ, ์์ด์ฝ ์ฌ์ด์ฆ, ํ ์คํธ ํฌ๊ธฐ ๋ฑ
์ฌ์ฉ์ฑ์ ์ง์ ์ ์ธ ์ํฅ์ ์ฃผ๋ ์์๋ ๊ณ ์ ๋๋ค.
button height = 48px
icon = 24px
body text = 16px
โ ์ ๋์ ์ผ๋ก ๋์ด๋๋ ๊ฒ
์น์ ๊ฐ๊ฒฉ, hero ์์ญ, ์นด๋ ๊ฐ๊ฒฉ, ์ฌ๋ฐฑ ๋ฑ
๋ ์ด์์ ์์๋ค์ ๋ณดํต ์ ๋์ ์ผ๋ก ํ์ฅ๋๋ค.
์๋ฅผ ๋ค๋ฉด ์ด๋ฐ ์
// ์์ ํ๋ฉด
section spacing = 24px
hero height = 220px
// ํฐ ํ๋ฉด
section spacing = 40px
hero height = 320px
ํต์ฌ์ ์ฝํ ์ธ ๋ ์ ์งํ๊ณ ์ฌ๋ฐฑ์ ํ์ฅํ๋ค๋ ๊ฒ
2. ๋ชจ๋ฐ์ผ ๋์์ธ์์ ๋ง์ด ์ฐ๋ ๊ธฐ๋ณธ ๊ท์น
โ 8pt Spacing System
๋ชจ๋ฐ์ผ UI์์๋ ๋ณดํต 8pt ์์คํ ์ ์ฌ์ฉํ๋ค.
4
8
16
24
32
40
48
64
์์
icon ↔ text = 8
card padding = 16
section gap = 24
โ ํฐ์น ์์ญ ๊ท์น
ํฐ์น ์์ญ ๊ท์น์ ๋ชจ๋ฐ์ผ UX์์ ์ค์ํ ๊ท์น์ด๋ค.
์ต์ ํฐ์น ์์ญ = 44px
๋ฒํผ ๋์ด = 48~56px
์์ด์ฝ = 24px
3. ํ๋ก ํธ์๋์์ ๋์์ธ ์์คํ ์ ์ฉํ๊ธฐ
์ผ๋ฐ CSS ๊ธฐ์ค์์ ๋์์ธ ์์คํ ์
๋์์ธ ํ ํฐ → ๊ณตํต ์คํ์ผ → ์ปดํฌ๋ํธ ์คํ์ผ ๊ตฌ์กฐ๋ก ์ ์ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
ํต์ฌ ๋ชฉ์ ์ ์ผ๊ด์ฑ ์๋ UI ์คํ์ผ์ ์ ์งํ๊ณ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๋ ๊ฒ์ด๋ค.
1) ๋์์ธ ํ ํฐ ์ ์
๋์์ธ ์์คํ
์ ๊ฐ์ฅ ๊ธฐ์ด ๋จ๊ณ๋ ๋์์ธ ํ ํฐ์ด๋ค.
์์, ๊ฐ๊ฒฉ, ํฐํธ ๊ฐ์ ๊ธฐ๋ณธ ์คํ์ผ ๊ฐ์ ๋ณ์๋ก ๊ด๋ฆฌํ๋ค.
CSS์์๋ ๋ณดํต CSS Custom Properties (CSS ๋ณ์)๋ก ์ ์ํ๋ค.
:root {
/* color */
--color-primary: #111111;
--color-secondary: #666666;
--color-background: #ffffff;
/* spacing */
--space-xs: 4px;
--space-sm: 8px;
--space-md: 16px;
--space-lg: 24px;
/* radius */
--radius-sm: 4px;
--radius-md: 8px;
/* font */
--font-body: 16px;
--font-title: 24px;
}
์ด๋ ๊ฒ ์ ์ํ๋ฉด ํ๋ก์ ํธ ์ ์ฒด์์ ๋์ผํ ๊ฐ์ ์ฌ์ฌ์ฉํ ์ ์๋ค.
2) ๋ฆฌ์ ๋ฐ ๊ธ๋ก๋ฒ ์คํ์ผ ์ ์
๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ ์คํ์ผ์ ์ ๊ฑฐํ๊ณ ๊ธฐ๋ณธ ๋ ์ด์์ ๊ท์น์ ์ค์ ํ๋ค.
๋ชจ๋ UI ์ปดํฌ๋ํธ์ ๊ธฐ๋ณธ ์คํ์ผ ํ๊ฒฝ์ ํต์ผ์ํจ๋ค.
*,
*::before,
*::after {
box-sizing: border-box;
}
html,
body {
margin: 0;
padding: 0;
}
body {
font-family: system-ui, sans-serif;
font-size: var(--font-body);
color: var(--color-primary);
}
3) ํ์ดํฌ๊ทธ๋ํผ ์์คํ ์ ์
.text-body {
font-size: 16px;
line-height: 1.5;
}
.text-title {
font-size: 24px;
font-weight: 600;
}
.text-caption {
font-size: 12px;
color: var(--color-secondary);
}
๋ณธ๋ฌธ, ์ ๋ชฉ, ์ค๋ช ๊ธ ๋ฑ
ํ ์คํธ ์คํ์ผ์ ๊ณตํต ํด๋์ค๋ก ์ ์ํ๋ค.
4) ๋ ์ด์์ ์์คํ ์ ์
ํ์ด์ง์ ๊ณตํต ๋ ์ด์์ ๊ท์น์ ๋ง๋ ๋ค. ๋ํ์ ์ธ ์๊ฐ container์ spacing ์์คํ ์ด๋ค.
โ container
.container {
width: 100%;
max-width: 1200px;
margin: 0 auto;
padding: 0 var(--space-md);
}
container๋ ๋ ์ด์์์์ ์์ฃผ ๋ฑ์ฅํ๋ ํจํด์ด๋ค.
container๋ ํ์ด์ง ์ฝํ ์ธ ์ ๊ฐ๋ก ํญ๊ณผ ์ข์ฐ ์ฌ๋ฐฑ์ ํต์ ํ๋ค.
์๋ฅผ ๋ค์ด ํ๋ฉด์ด ๋๋ฌด ๋์ผ๋ฉด ์ํฐ ์์ด ์์ฑ๋ ๊ธ์ฒ๋ผ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ค.
๊ทธ๋์ max-width๊ฐ ์ง์ ๋ container๋ฅผ ์ฌ์ฉํ๋ ๊ฒ!
โ stack (vertical layout)
.stack > * + * {
margin-top: var(--space-md);
}
์ด๋ฐ ํจํด์ ์ปดํฌ๋ํธ ์ฌ์ด ๊ฐ๊ฒฉ์ ์ผ์ ํ๊ฒ ์ ์งํ๋ ๋ฐ ์ฌ์ฉํ๋ค.
5) ์ปดํฌ๋ํธ ์คํ์ผ ์ ์
UI ์์๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํด๋์ค๋ก ์ ์ํ๋ค.
โ ๋ฒํผ ์์
.button {
display: inline-flex;
align-items: center;
justify-content: center;
height: 40px;
padding: 0 var(--space-md);
border-radius: var(--radius-md);
border: none;
cursor: pointer;
}
variant๋ modifier ํด๋์ค๋ก ์ ์ํ๋ค.
.button--primary {
background: var(--color-primary);
color: white;
}
.button--secondary {
background: transparent;
border: 1px solid var(--color-primary);
}
์ฌ์ฉ ์
<button class="button button--primary">
ํ์ธ
</button>
์ด ๊ตฌ์กฐ๋ ๋ณดํต BEM ๋ฐฉ์์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
6) ์ํ ์คํ์ผ ์ ์
.button:hover {
opacity: 0.9;
}
.button:disabled {
opacity: 0.4;
cursor: not-allowed;
}
์ํ ์คํ์ผ์ pseudo class(์์ฌ/๊ฐ์ ํด๋์ค)๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ผ๋ฐ์
7) ๋ฐ์ํ ๊ท์น ์ ์
๋ฐ์ํ ์คํ์ผ์ breakpoint ๊ธฐ์ค์ผ๋ก ๊ด๋ฆฌํ๋ค.
.container {
padding: 0 var(--space-sm);
}
@media (min-width: 768px) {
.container {
padding: 0 var(--space-lg);
}
}
๋๋ถ๋ถ ๋ชจ๋ฐ์ผ ํผ์คํธ ๋ฐฉ์์ผ๋ก
๋ชจ๋ฐ์ผ(max-width: 767px)์ด ๊ธฐ๋ณธ๊ฐ → min-width๋ก ํ์ฅํ๋ ํจํด์ ์ด๋ค.
8) ํ์ผ ๊ตฌ์กฐ
์ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ๋์์ธ ์์คํ ์ ์ ์ํ๋ฉด ์ด๋ฌํ ํ์ผ ๊ตฌ์กฐ๊ฐ ์์ฑ๋๋ค.
styles
โ reset.css
โ tokens.css
โ typography.css
โ layout.css
โ components
โ button.css
โ card.css
โ input.css
๐ญ ์ ๋ฆฌ
๋์์ด๋๊ฐ ๋ง๋ ๊ท์น์ ํ ํฐ์ผ๋ก ๊ฐ์ ํ๋ฉด
- UI ์ผ๊ด์ฑ์ด ์ ์ง๋๊ณ
- ์ ์ง๋ณด์๊ฐ ์ฌ์์ง๊ณ
- ํ ํ์ ์ด ํจ์ฌ ํธํด์ง๋ค.
ํ๋ก ํธ์๋์์ ๋์์ธ ์์คํ ์ ์ ๋ง๋ค์ด ๋๋ฉด UI ๊ฐ๋ฐ ์๋๊ฐ ์ ๋ง ๋ง์ด ๋นจ๋ผ์ง ๊ฒ์ด๋ค.
์์ฒ๋ผ ์ ๋ฆฌํ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด๋ฉด ๋์์ธ ์ผ๊ด์ฑ์ ์ ์งํ๋ฉด์ ํ์ฅ ๊ฐ๋ฅํ CSS ์ํคํ ์ฒ๋ฅผ ๋ง๋ค ์ ์์ ๊ฒ์ด๋ค!

'Dev > +@' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Git ์ปค๋ฐ ์ด๋ ฅ ๋ณ๊ฒฝํ๊ธฐ (์์ฑ์, ๋ ์ง ์์ ํ๊ธฐ) (0) | 2025.12.19 |
|---|---|
| CSS position: sticky ์ ๋๋ก ์ดํดํ๊ธฐ (์ ๊ณ ์ ์ด ์ ๋ ๊น?) (0) | 2023.12.12 |
| ์ฌ์ฉ์ ๊ด์ ์ UI ๊ตฌ์ฑํ๊ธฐ (0) | 2023.09.05 |
| ๊ฐ๋์(Ganache) ๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ถํ๊ธฐ (0) | 2023.06.13 |
| HTML, CSS๋ก ํ ๊ธ ๋ฒํผ ๋ง๋ค๊ธฐ (0) | 2023.06.09 |
๋๊ธ