๐ฑ Tailwind 5์ฅ: ๋ฐ์ํ ๋์์ธ
๐ ๊ฐ์
Tailwind ์ ๋ชจ๋ฐ์ผ ํผ์คํธ breakpoint ์์คํ โ sm, md, lg, xl, 2xl ์ ์์ ์์ฌ๋ก ํ์ฉํ๊ธฐ
๐ ๋ชฉ์ฐจ
- ๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
- ๐ค ์ ์์์ผ ํ๋๊ฐ
- ๐๏ธ ๋น์ ๋ก ๋จผ์ ์ดํดํ๊ธฐ
- ๐ Tailwind Breakpoint ์์คํ
- ๐ฑ ๋ชจ๋ฐ์ผ ํผ์คํธ ์์น
- ๐ป ์ค์ : ์์๋ค ์ปค๋ฎค๋ํฐ ๋ฐ์ํ ๋ ์ด์์
- ๐ง Container ์ ์ฝํ ์ธ ๋๋น ์ ํ
- ๐จ ํํ ์ค์์ ๋ฐ์ํ ํจํด
- ๐ ์ด๋ฒ์ ๋ฐฐ์ด ๋ด์ฉ ์ด์ ๋ฆฌ
- ๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
- ๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
- ๐ ๋ ์์๋ณด๊ธฐ
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 15๋ถ
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
-
sm:,md:,lg:,xl:์ ๋์ฌ๋ฅผ ์์ ์์ฌ๋ก ํ์ฉํด ๋ฐ์ํ UI ๋ฅผ ๋ง๋ค ์ ์๋ค - "๋ชจ๋ฐ์ผ ํผ์คํธ" ๊ฐ ์ ์ค์ํ์ง, ์ด๋ป๊ฒ ์ค๊ณํด์ผ ํ๋์ง ์ค๋ช ํ ์ ์๋ค
- ์ ํต์ ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ Tailwind ๋ก ์ฆ์ ๋ณํํ ์ ์๋ค
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐จ ์์ (๋์์ด๋): "์์ฒ ๋, ํผ๊ทธ๋ง ๋ณด๋ฉด ๋ชจ๋ฐ์ผ ๋ทฐ๋ ๋ฐ์คํฌํ ๋ทฐ๊ฐ ์์ ๋ฌ๋ผ์. ๋ชจ๋ฐ์ผ์ 1์ด, ๋ฐ์คํฌํ์ 3์ด ์นด๋ ๊ทธ๋ฆฌ๋์ธ๋ฐ ๊ตฌํ ๊ฐ๋ฅํด์?"
- ๐ฃ ์์ฒ : "๋ค... ๋ฏธ๋์ด ์ฟผ๋ฆฌ 3๊ฐ ์ฐ๋ฉด ๋๋๋ฐ CSS ํ์ผ์ด ๋ ๊ธธ์ด์ง๊ฒ ๋ค์."
- ๐ฆ ์ํธ (๋ฆฌ๋): "์์ฒ ๋, Tailwind ์์๋
grid-cols-1 md:grid-cols-2 lg:grid-cols-3์ด๋ ๊ฒ ํ ์ค๋ก ๋๋์." - ๐ฃ ์์ฒ : "?! ๋ฏธ๋์ด ์ฟผ๋ฆฌ ์์ด์?"
- ๐ฆ ์ํธ: "์์ด์. Tailwind ๊ฐ ์์์ ์์ฑํด์ค์."
๐ค ์ ์์์ผ ํ๋๊ฐ
๋ชจ๋ฐ์ผ ํธ๋ํฝ์ด ์ ์ฒด ์น ํธ๋ํฝ์ 60% ์ด์์ ์ฐจ์งํ๋ ์๋์ผ. ์์๋ค ์ปค๋ฎค๋ํฐ๋ ์ฌ์ฉ์์ ์ ๋ฐ ์ด์์ด ์ค๋งํธํฐ์ผ๋ก ์ ์ํด.
์ ํต์ ์ธ ๋ฐ์ํ CSS ๋ฅผ ์์ฑํ๋ฉด:
/* ๋ชจ๋ฐ์ผ ๊ธฐ๋ณธ */
.study-grid { display: grid; grid-template-columns: 1fr; gap: 16px; }
/* ํ๋ธ๋ฆฟ */
@media (min-width: 768px) {
.study-grid { grid-template-columns: repeat(2, 1fr); }
}
/* ๋ฐ์คํฌํ */
@media (min-width: 1024px) {
.study-grid { grid-template-columns: repeat(3, 1fr); }
}CSS ํ์ผ 10์ค. Tailwind ๋ก๋?
<div class="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3">HTML ํ ์ค. ๊ทธ๋ฆฌ๊ณ ๋ณ๋ CSS ํ์ผ 0์ค.
๐๏ธ ๋น์ ๋ก ๋จผ์ ์ดํดํ๊ธฐ
Tailwind ๋ฐ์ํ = ์ท ์ฌ์ด์ฆ ํ๊ทธ
์ท์ S / M / L / XL ํ๊ทธ๊ฐ ์๋ฏ์ด, Tailwind ํด๋์ค ์์ ํ๋ฉด ํฌ๊ธฐ ํ๊ทธ๋ฅผ ๋ถ์ด๋ ๊ฑฐ์ผ.
์ผ๋ฐ ํด๋์ค โ ๊ธฐ๋ณธ ์ฌ์ด์ฆ (๋ชจ๋ ํ๋ฉด)
sm:ํด๋์ค โ 640px ์ด์ ํ๋ฉด์์
md:ํด๋์ค โ 768px ์ด์ ํ๋ฉด์์
lg:ํด๋์ค โ 1024px ์ด์ ํ๋ฉด์์
xl:ํด๋์ค โ 1280px ์ด์ ํ๋ฉด์์
2xl:ํด๋์ค โ 1536px ์ด์ ํ๋ฉด์์
๐ก ํ ์ค๋ก ๊ธฐ์ตํ๊ธฐ
์ ๋์ฌ ์์ = ๋ชจ๋ฐ์ผ ๊ธฐ๋ณธ, ์ ๋์ฌ ์์ = ๊ทธ ์ด์ ํ๋ฉด์์ ์ ์ฉ.
๐ Tailwind Breakpoint ์์คํ
๊ธฐ๋ณธ Breakpoint ํ
| ์ ๋์ฌ | ์ต์ ๋๋น | ์ผ๋ฐ์ ๊ธฐ๊ธฐ | CSS |
|---|---|---|---|
| (์์) | 0px | ๋ชจ๋ ํ๋ฉด (๋ชจ๋ฐ์ผ ๊ธฐ๋ณธ) | ๊ธฐ๋ณธ ์คํ์ผ |
sm: | 640px | ํฐ ์ค๋งํธํฐ, ์ํ ํ๋ธ๋ฆฟ | @media (min-width: 640px) |
md: | 768px | ํ๋ธ๋ฆฟ | @media (min-width: 768px) |
lg: | 1024px | ์์ ๋ ธํธ๋ถ | @media (min-width: 1024px) |
xl: | 1280px | ํฐ ๋ ธํธ๋ถ, ๋ฐ์คํฌํ | @media (min-width: 1280px) |
2xl: | 1536px | ๋ํ ๋ชจ๋ํฐ | @media (min-width: 1536px) |
์ค์ ๋ก ์์ฑ๋๋ CSS
/* grid-cols-1: ๊ธฐ๋ณธ ์คํ์ผ */
.grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
/* md:grid-cols-2: 768px ์ด์์์๋ง ์ ์ฉ */
@media (min-width: 768px) {
.md\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
/* lg:grid-cols-3: 1024px ์ด์์์๋ง ์ ์ฉ */
@media (min-width: 1024px) {
.lg\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}Tailwind ๊ฐ ์ด CSS ๋ฅผ ์๋์ผ๋ก ์์ฑํด์ค. ๊ฐ๋ฐ์๋ HTML ํด๋์ค๋ง ์์ฑํ๋ฉด ๋ผ.
๐ฑ ๋ชจ๋ฐ์ผ ํผ์คํธ ์์น
๋ชจ๋ฐ์ผ ํผ์คํธ๋?
Tailwind ๋ Min-Width ๊ธฐ๋ฐ ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํด. ์ฆ:
- ์ ๋์ฌ ์๋ ํด๋์ค = 0px ์ด์ (๋ชจ๋ฐ์ผ ํฌํจ ๋ชจ๋ ํ๋ฉด)
md:= 768px ์ด์์์ ๋ฎ์ด์์
์ด๊ฒ ๋ฐ๋ก ๋ชจ๋ฐ์ผ ํผ์คํธ์ผ. ์์ ํ๋ฉด์ ๊ธฐ๋ณธ์ผ๋ก ์ค๊ณํ๊ณ , ํฐ ํ๋ฉด์์ ์ ์ง์ ์ผ๋ก ๋ณํํด.
โ ์๋ชป๋ ์ ๊ทผ (๋ฐ์คํฌํ ํผ์คํธ ์ฌ๊ณ ๋ฐฉ์)
<!-- ๐ฃ ์์ฒ ์ ์ค์: "๋ฐ์คํฌํ ๊ธฐ์ค์ผ๋ก ๋จผ์ ์ง๊ณ ๋ชจ๋ฐ์ผ์์ ์จ๊ธฐ๋ฉด ๋๊ฒ ์ง" -->
<div class="grid-cols-3 sm:grid-cols-1">
<!-- โ ์ด๊ฑด ๊ฑฐ๊พธ๋ก์ผ! ๊ธฐ๋ณธ์ด 3์ด์ด๊ณ sm ์์ 1์ด๋ก ์ค์ด๋ ค๋ ๊ฑด๋ฐ,
sm: ์ 640px ์ด์์์ ์ ์ฉ์ด๋ผ ๋ชจ๋ฐ์ผ์์๋ ์ ์ฉ ์ ๋จ! -->
</div>โ ์ฌ๋ฐ๋ฅธ ์ ๊ทผ (๋ชจ๋ฐ์ผ ํผ์คํธ)
<!-- ๐ฆ ์ํธ์ ๋ฐฉ์: "๋ชจ๋ฐ์ผ์ด ๊ธฐ๋ณธ, ํฐ ํ๋ฉด์์ ํ์ฅ" -->
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3">
<!-- โ
๊ธฐ๋ณธ 1์ด โ 640px+ ์์ 2์ด โ 1024px+ ์์ 3์ด -->
</div>๋ฐ์ํ ์ฌ๊ณ ์ ํ ์ฒดํฌ๋ฆฌ์คํธ
์คํ์ผ์ ์ ์ฉํ ๋:
1. "๋ชจ๋ฐ์ผ์์ ์ด ์์๊ฐ ์ด๋ป๊ฒ ๋ณด์ฌ์ผ ํ๋๊ฐ?" โ ๊ธฐ๋ณธ ํด๋์ค
2. "ํ๋ธ๋ฆฟ์์ ๋ฌ๋ผ์ง๋๊ฐ?" โ md: ์ ๋์ฌ ์ถ๊ฐ
3. "๋ฐ์คํฌํ์์ ๋ฌ๋ผ์ง๋๊ฐ?" โ lg: ์ ๋์ฌ ์ถ๊ฐ
๐ป ์ค์ : ์์๋ค ์ปค๋ฎค๋ํฐ ๋ฐ์ํ ๋ ์ด์์
๋ฐ์ํ ๋ค๋น๊ฒ์ด์ ๋ฐ
// ๋ชจ๋ฐ์ผ: ํ๋ฒ๊ฑฐ ๋ฉ๋ด, ๋ฐ์คํฌํ: ๊ฐ๋ก ๋ฉ๋ด
function Navbar() {
const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
return (
<nav className="border-b border-gray-200 bg-white">
<div className="mx-auto flex h-16 max-w-6xl items-center justify-between px-4">
{/* ๋ก๊ณ : ํญ์ ๋ณด์ */}
<a href="/" className="flex items-center gap-2 font-bold text-blue-600">
<span>๐</span>
<span className="text-lg">์์๋ค ์ปค๋ฎค๋ํฐ</span>
</a>
{/* ๋ฐ์คํฌํ ๋ฉ๋ด: md ์ด์์์๋ง ๋ณด์ */}
<div className="hidden items-center gap-6 md:flex">
<a href="/studies" className="text-sm text-gray-600 hover:text-blue-600">์คํฐ๋ ์ฐพ๊ธฐ</a>
<a href="/create" className="text-sm text-gray-600 hover:text-blue-600">์คํฐ๋ ๋ง๋ค๊ธฐ</a>
<button className="rounded-lg bg-blue-600 px-4 py-2 text-sm font-medium text-white hover:bg-blue-700">
๋ก๊ทธ์ธ
</button>
</div>
{/* ํ๋ฒ๊ฑฐ ๋ฒํผ: md ๋ฏธ๋ง์์๋ง ๋ณด์ */}
<button
className="md:hidden"
onClick={() => setMobileMenuOpen(!mobileMenuOpen)}
>
<span className="text-2xl">{mobileMenuOpen ? 'โ' : 'โฐ'}</span>
</button>
</div>
{/* ๋ชจ๋ฐ์ผ ๋๋กญ๋ค์ด ๋ฉ๋ด: md ๋ฏธ๋ง์์๋ง ํ์ */}
{mobileMenuOpen && (
<div className="border-t border-gray-100 bg-white px-4 py-4 md:hidden">
<div className="flex flex-col gap-4">
<a href="/studies" className="text-sm text-gray-700">์คํฐ๋ ์ฐพ๊ธฐ</a>
<a href="/create" className="text-sm text-gray-700">์คํฐ๋ ๋ง๋ค๊ธฐ</a>
<button className="w-full rounded-lg bg-blue-600 py-2.5 text-sm font-medium text-white">
๋ก๊ทธ์ธ
</button>
</div>
</div>
)}
</nav>
);
}๋ฐ์ํ ํ์ด๋ก ์น์
function HeroSection() {
return (
// ๋ชจ๋ฐ์ผ: ์ธ๋ก ๋ฐฐ์น, ์ค์ ์ ๋ ฌ / ๋ฐ์คํฌํ: ๊ฐ๋ก ๋ฐฐ์น, ์ข์ฐ ๋ถํ
<section className="bg-gradient-to-br from-blue-600 to-blue-800 px-4 py-16 md:py-24">
<div className="mx-auto max-w-6xl">
<div className="flex flex-col items-center gap-8 text-center md:flex-row md:items-start md:gap-12 md:text-left">
{/* ํ
์คํธ ์์ญ */}
<div className="flex-1">
{/* ๋ชจ๋ฐ์ผ: text-3xl / ๋ฐ์คํฌํ: text-5xl */}
<h1 className="mb-4 text-3xl font-bold text-white md:text-5xl">
ํจ๊ป ์ฑ์ฅํ๋<br className="hidden md:block" /> ๊ฐ๋ฐ์ ์คํฐ๋
</h1>
<p className="mb-8 text-lg text-blue-100 md:text-xl">
React, Next.js, TypeScript ์คํฐ๋๋ฅผ ์ฐพ์๋ณด์ธ์
</p>
{/* ๋ชจ๋ฐ์ผ: ๋ฒํผ ๊ฐ๋ก ๊ฝ ์ฑ์ / ๋ฐ์คํฌํ: ์๋ ๋๋น */}
<div className="flex flex-col gap-3 sm:flex-row">
<button className="w-full rounded-lg bg-white px-6 py-3 font-semibold text-blue-600 sm:w-auto">
์คํฐ๋ ์ฐพ๊ธฐ
</button>
<button className="w-full rounded-lg border-2 border-white px-6 py-3 font-semibold text-white sm:w-auto">
์คํฐ๋ ๋ง๋ค๊ธฐ
</button>
</div>
</div>
{/* ์ด๋ฏธ์ง/์ผ๋ฌ์คํธ: ๋ชจ๋ฐ์ผ์์ ์จ๊น, md ์ด์์์ ํ์ */}
<div className="hidden w-80 md:block">
<div className="rounded-2xl bg-white/20 p-8 text-center text-6xl">
๐
</div>
</div>
</div>
</div>
</section>
);
}๋ฐ์ํ ์ฌ์ด๋๋ฐ ๋ ์ด์์
// ๋ชจ๋ฐ์ผ: ์ฌ์ด๋๋ฐ ์์ (๋๋ก์ด๋ก ๋์ฒด), ๋ฐ์คํฌํ: ์ฌ์ด๋๋ฐ ๊ณ ์
function DashboardLayout({ children }: { children: React.ReactNode }) {
return (
// ๋ชจ๋ฐ์ผ: ๋จ์ผ ์ด / lg: ์ฌ์ด๋๋ฐ(256px) + ๋ฉ์ธ
<div className="min-h-screen lg:grid lg:grid-cols-[256px_1fr]">
{/* ์ฌ์ด๋๋ฐ: ๋ชจ๋ฐ์ผ์์ ์จ๊น */}
<aside className="hidden lg:block bg-gray-900 p-6 text-white">
<nav className="flex flex-col gap-2">
<SidebarLink href="/dashboard">๐ ๋์๋ณด๋</SidebarLink>
<SidebarLink href="/studies">๐ ๋ด ์คํฐ๋</SidebarLink>
<SidebarLink href="/profile">๐ค ํ๋กํ</SidebarLink>
</nav>
</aside>
{/* ๋ฉ์ธ: ๋ชจ๋ฐ์ผ์์ ์ ์ฒด ๋๋น */}
<main className="min-h-screen p-4 md:p-8 bg-gray-50">
{children}
</main>
</div>
);
}๐ง Container ์ ์ฝํ ์ธ ๋๋น ์ ํ
// ํ์ค ํ์ด์ง ์ปจํ
์ด๋ ํจํด
// ์ด๋ ํ์ด์ง์์๋ ์ฌ์ฌ์ฉํ ์ ์๋ ๋ํผ ์ปดํฌ๋ํธ
function Container({ children, className }: { children: React.ReactNode; className?: string }) {
return (
// max-w-6xl: 1152px ์ต๋ ๋๋น
// mx-auto: ๊ฐ์ด๋ฐ ์ ๋ ฌ
// px-4 sm:px-6 lg:px-8: ํ๋ฉด ํฌ๊ธฐ๋ณ ์ข์ฐ ์ฌ๋ฐฑ ์ ์ง์ ์ฆ๊ฐ
<div className={`mx-auto max-w-6xl px-4 sm:px-6 lg:px-8 ${className ?? ''}`}>
{children}
</div>
);
}
// ์ฌ์ฉ ์
function StudyListPage() {
return (
<>
<Navbar />
<Container className="py-8">
<StudyGrid studies={studies} />
</Container>
<Footer />
</>
);
}๐จ ํํ ์ค์์ ๋ฐ์ํ ํจํด
์ค์ 1: hidden ๊ณผ block ์ค์ฉ
{/* โ ์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋ฐ์ผ์์ ๋ฌด์กฐ๊ฑด ์จ๊ฒจ์ง๊ณ md ์์๋ ์จ๊ฒจ์ ธ โ ์๋ ๋ถ๋ช
*/}
<div class="hidden md:hidden">
{/* โ
๋ชจ๋ฐ์ผ์์ ์จ๊ธฐ๊ณ md ์ด์์์ ๋ณด์ด๊ธฐ */}
<div class="hidden md:block">
{/* โ
๋ชจ๋ฐ์ผ์์ ๋ณด์ด๊ณ md ์ด์์์ ์จ๊ธฐ๊ธฐ */}
<div class="block md:hidden">
{/* โ
๋ชจ๋ฐ์ผ์์ flex, md ์์ grid */}
<div class="flex md:grid md:grid-cols-2">์ค์ 2: max-width ๋ฐฉํฅ ํผ๋
{/* โ ์ต๋ ๋๋น Breakpoint โ Tailwind ์ ์๋ ๊ฐ๋
! */}
{/* "md ์ดํ์์๋ง ์ ์ฉ"ํ๊ณ ์ถ์ ๋ ์ด๋ฐ ํด๋์ค๋ ์์ด */}
<div class="max-md:grid-cols-1"> {/* max-md: ๋ Tailwind v3.2+ ์์๋ง ์ง์ */}
{/* โ
Tailwind ๊ธฐ๋ณธ์ min-width. ๋ชจ๋ฐ์ผ ํผ์คํธ๋ก ์ค๊ณํ๋ฉด ์ด๋ฐ ์ญ๋ฐฉํฅ์ด ํ์ ์์ด */}
<div class="grid-cols-1 md:grid-cols-3">โ ๏ธ Tailwind v3.2+ ์์๋
max-md:,max-lg:๊ฐ์ ์ต๋ ๋๋น ๋ณํ๋ ์ง์ํด. ํ์ง๋ง ๋ชจ๋ฐ์ผ ํผ์คํธ ์์น์ ๋ฐ๋ฅด๋ฉด ์ด๊ฒ ํ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด์ผ.
๋ฐ์ํ ํ ์คํธ ํฌ๊ธฐ
{/* ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ํ
์คํธ ํฌ๊ธฐ ์กฐ์ */}
<h1 className="text-2xl sm:text-3xl md:text-4xl lg:text-5xl font-bold">
๊ฐ๋ฐ์ ์คํฐ๋ ๋งค์นญ
</h1>
<p className="text-sm md:text-base lg:text-lg text-gray-600">
ํจ๊ป ์ฑ์ฅํ๋ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ
</p>๐ ์ด๋ฒ์ ๋ฐฐ์ด ๋ด์ฉ ์ด์ ๋ฆฌ
| ๊ฐ๋ | ํด๋์ค ํจํด | ํต์ฌ |
|---|---|---|
| ๊ธฐ๋ณธ Breakpoint | sm:, md:, lg:, xl:, 2xl: | 640/768/1024/1280/1536px |
| ๋ชจ๋ฐ์ผ ํผ์คํธ | ์ ๋์ฌ ์์์ด ๊ธฐ๋ณธ (๋ชจ๋ฐ์ผ) | ํฐ ํ๋ฉด์์ ์ ์ง์ ํ์ฅ |
| ์์ ์จ๊ธฐ๊ธฐ | hidden md:block | ๋ชจ๋ฐ์ผ ์จ๊น, md ์ด์ ํ์ |
| ์์ ๋ณด์ด๊ธฐ | block md:hidden | ๋ชจ๋ฐ์ผ ํ์, md ์ด์ ์จ๊น |
| ๋ฐ์ํ ๊ทธ๋ฆฌ๋ | grid-cols-1 md:grid-cols-2 lg:grid-cols-3 | ๋จ๊ณ๋ณ ์ด ์ ๋ณ๊ฒฝ |
| ์ปจํ ์ด๋ ํจํด | mx-auto max-w-6xl px-4 sm:px-6 lg:px-8 | ํ์ค ํ์ด์ง ๋ ์ด์์ |
๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. "๋ชจ๋ฐ์ผ์์๋ ์์๋ฅผ ์จ๊ธฐ๊ณ , 768px ์ด์์์๋ง ๋ณด์ฌ์ฃผ๊ณ ์ถ๋ค." ์ฌ๋ฐ๋ฅธ Tailwind ์ฝ๋๋?
โ
์ ๋ต: hidden md:block
๐ก ์์ธ ํด์ค:
hidden: ๋ชจ๋ ํ๋ฉด์์ ๊ธฐ๋ณธ์ ์ผ๋กdisplay: none.md:block: 768px ์ด์์์display: block์ผ๋ก ๋ฎ์ด์.- ๊ฒฐ๊ณผ: ๋ชจ๋ฐ์ผ(768px ๋ฏธ๋ง) ์์๋ ์จ๊น, 768px ์ด์์์๋ ๋ณด์.
- ๋ฐ๋ (๋ชจ๋ฐ์ผ์์ ๋ณด์ด๊ณ md ์ด์์์ ์จ๊ธฐ๊ธฐ):
block md:hidden. - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "์จ๊ธฐ๋ ๊ฑด
hidden, ๋ณด์ด๋ ๊ฑดblock/flex/grid. ์์ breakpoint ์ ๋์ฌ ๋ถ์ด๋ฉด ๊ทธ ํฌ๊ธฐ๋ถํฐ ์ ์ฉ."
Q2. Tailwind ์ "๋ชจ๋ฐ์ผ ํผ์คํธ" ์์น์ ๋ํ ์ฌ๋ฐ๋ฅธ ์ค๋ช ์?
โ
์ ๋ต: ์ ๋์ฌ๊ฐ ์๋ ํด๋์ค๊ฐ ๋ชจ๋ฐ์ผ(๊ฐ์ฅ ์์ ํ๋ฉด)์ ์ ์ฉ๋๊ณ , sm:, md:, lg: ์ ๋์ฌ๋ ํด๋น ์ต์ ๋๋น ์ด์์์ ์ ์ง์ ์ผ๋ก ๋ฎ์ด์์ด๋ค.
๐ก ์์ธ ํด์ค:
- Tailwind ๋
min-width๊ธฐ๋ฐ ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํด. ์ด๊ฒ ๋ชจ๋ฐ์ผ ํผ์คํธ์ ํต์ฌ. lg:grid-cols-3์@media (min-width: 1024px)์์์๋ง ์ ์ฉ๋ผ.- ์์ฃผ ํ๋ ์ฐฉ๊ฐ: "lg: ๋ lg ํ๋ฉด์์๋ง ์ ์ฉ๋๊ณ xl ์์ ์ ๋๋ค" โ ํ๋ ค.
lg:๋ 1024px ์ด์ ๋ชจ๋ ํ๋ฉด์ ์ ์ฉ๋ผ. - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "min-width ๊ธฐ๋ฐ = ์์ ๊ฒ์ด ๊ธฐ๋ณธ, ํฌ๋ฉด ๋ฎ์ด์์."
Q3. ์์์ด "๋ด๋น๊ฒ์ด์ ๋ฉ๋ด๋ฅผ ํ๋ธ๋ฆฟ ์ด์์์๋ ๊ฐ๋ก, ๋ชจ๋ฐ์ผ์์๋ ์ธ๋ก ์ ๋ ฌ๋ก ํด์ฃผ์ธ์" ๋ผ๊ณ ์์ฒญํ๋ค. ์ฌ๋ฐ๋ฅธ Tailwind ๋ ์ด์์์?
โ
์ ๋ต: flex flex-col md:flex-row
๐ก ์์ธ ํด์ค:
flex: Flexbox ํ์ฑํ.flex-col: ๊ธฐ๋ณธ(๋ชจ๋ฐ์ผ)์์ ์ธ๋ก ๋ฐฉํฅ.md:flex-row: 768px ์ด์์์ ๊ฐ๋ก ๋ฐฉํฅ์ผ๋ก ๋ณ๊ฒฝ.- ์ด ํจํด์ด ๋ฐ์ํ ๋ค๋น๊ฒ์ด์ ๋ฉ๋ด, ๋ฒํผ ๊ทธ๋ฃน์์ ๊ฐ์ฅ ์์ฃผ ์ฐ๋ ํจํด์ด์ผ.
- ์ถ๊ฐ๋ก
gap-4 md:gap-6์ฒ๋ผ gap ๋ ๋ฐ์ํ์ผ๋ก ์กฐ์ ํ ์ ์์ด. - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "์ธ๋ก ์๊ธฐ์์ ๊ฐ๋ก ๋์ด๋ก =
flex-col md:flex-row."
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
์ค๋ ๊ฐ์ฅ ์ถฉ๊ฒฉ์ ์ด์๋ ๊ฑด grid-cols-1 md:grid-cols-2 lg:grid-cols-3 ํ ์ค์ด ๋ฏธ๋์ด ์ฟผ๋ฆฌ 10์ค์ ๋์ฒดํ๋ค๋ ๊ฑฐ๋ค. ์์ ์ CSS ํ์ผ์์ ๋ฏธ๋์ด ์ฟผ๋ฆฌ ์ธ ๋๋ ์ ๋ง ์ฐพ์์ ์์ ํ๋ ๊ฒ๋ ํ๋ค์๋๋ฐ, ์ด์ HTML ๋ง ๋ณด๋ฉด "๋ชจ๋ฐ์ผ์์ 1์ด, ๋ฐ์คํฌํ์์ 3์ด์ด๊ตฌ๋" ๊ฐ ๋ฐ๋ก ๋ณด์ฌ์ ๋๋ฌด ํธํ๋ค.
์ํธ ๋์ด "๋ชจ๋ฐ์ผ ํผ์คํธ๋ ์ ํ์ด ์๋๋ผ ํ์์์. ์ง๊ธ ๋๋ถ๋ถ์ ์ฌ์ฉ์๊ฐ ์ค๋งํธํฐ์ผ๋ก ์ ์ํ๋๋ฐ ๋ฐ์คํฌํ ๊ธฐ์ค์ผ๋ก ์ค๊ณํ๋ฉด ๋ชจ๋ฐ์ผ UX ๊ฐ ํ์์๋ก ๋ฐ๋ ค์" ๋ผ๊ณ ํ์ จ๋๋ฐ, ์ด ๋ง์ด ๊ฐ์ด์ ๋ฐํ๋ค.
๐ก ์ค๋์ ๊ตํ: "๋ฐ์ํ์ ํฐ ํ๋ฉด์ ์ค์ด๋ ๊ฒ ์๋๋ผ, ์์ ํ๋ฉด์ ๋จผ์ ์ค๊ณํ๊ณ ํฐ ํ๋ฉด์์ ํ์ฑํ๊ฒ ํ์ฅํ๋ ๊ฒ์ด๋ค."
๋ด์ผ ์์๋ค ์ปค๋ฎค๋ํฐ ๋ฉ์ธ ํ์ด์ง ๋ชจ๋ฐ์ผ ๋ ์ด์์ ๋จผ์ ์ก๊ณ ๋ฐ์คํฌํ์ผ๋ก ํ์ฅํด๋ด์ผ๊ฒ ๋ค. ์ค๋์ ์ผ์ฐ ํด๊ทผํด์ ๋ฐ๋ ํ ๋ฐํด ํด์ผ์ง. ๋ชธ๋ ๋ง์๋ ๊ฐ๋ฒผ์์ผ ์ข์ ์ฝ๋๊ฐ ๋์ค์ง! ๐