๐Ÿ“ฑ Tailwind 5์žฅ: ๋ฐ˜์‘ํ˜• ๋””์ž์ธ

2026๋…„ 3์›” 5์ผ ์ˆ˜์ •๋จ

๐Ÿ“‹ ๊ฐœ์š”

Tailwind ์˜ ๋ชจ๋ฐ”์ผ ํผ์ŠคํŠธ breakpoint ์‹œ์Šคํ…œ โ€” sm, md, lg, xl, 2xl ์„ ์ž์œ ์ž์žฌ๋กœ ํ™œ์šฉํ•˜๊ธฐ

๐Ÿ“‹ ๋ชฉ์ฐจ


๐Ÿ“Œ ์ด ๋ฌธ์„œ๋ฅผ ์ฝ๊ธฐ ์ „์—

โฑ๏ธ ์˜ˆ์ƒ ์ฝ๊ธฐ ์‹œ๊ฐ„: 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>

๐Ÿ ์ด๋ฒˆ์— ๋ฐฐ์šด ๋‚ด์šฉ ์ด์ •๋ฆฌ

๊ฐœ๋…ํด๋ž˜์Šค ํŒจํ„ดํ•ต์‹ฌ
๊ธฐ๋ณธ Breakpointsm:, 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 ๊ฐ€ ํ›„์ˆœ์œ„๋กœ ๋ฐ€๋ ค์š”" ๋ผ๊ณ  ํ•˜์…จ๋Š”๋ฐ, ์ด ๋ง์ด ๊ฐ€์Šด์— ๋ฐ•ํ˜”๋‹ค.

๐Ÿ’ก ์˜ค๋Š˜์˜ ๊ตํ›ˆ: "๋ฐ˜์‘ํ˜•์€ ํฐ ํ™”๋ฉด์„ ์ค„์ด๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์ž‘์€ ํ™”๋ฉด์„ ๋จผ์ € ์„ค๊ณ„ํ•˜๊ณ  ํฐ ํ™”๋ฉด์—์„œ ํ’์„ฑํ•˜๊ฒŒ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค."

๋‚ด์ผ ์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ฉ”์ธ ํŽ˜์ด์ง€ ๋ชจ๋ฐ”์ผ ๋ ˆ์ด์•„์›ƒ ๋จผ์ € ์žก๊ณ  ๋ฐ์Šคํฌํƒ‘์œผ๋กœ ํ™•์žฅํ•ด๋ด์•ผ๊ฒ ๋‹ค. ์˜ค๋Š˜์€ ์ผ์ฐ ํ‡ด๊ทผํ•ด์„œ ๋Ÿฐ๋‹ ํ•œ ๋ฐ”ํ€ด ํ•ด์•ผ์ง€. ๋ชธ๋„ ๋งˆ์Œ๋„ ๊ฐ€๋ฒผ์›Œ์•ผ ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ๋‚˜์˜ค์ง€! ๐Ÿƒ


๐Ÿ”— ๋” ์•Œ์•„๋ณด๊ธฐ