6.5 KiB
6.5 KiB
Spacing & Layout
Tailwind CSS spacing scale for consistent layouts and visual rhythm.
Spacing Scale
Base unit: 4px (0.25rem)
| Class | Pixels | Class | Pixels | Class | Pixels |
|---|---|---|---|---|---|
0 |
0px | 8 |
32px | 24 |
96px |
1 |
4px | 10 |
40px | 32 |
128px |
2 |
8px | 12 |
48px | 40 |
160px |
3 |
12px | 14 |
56px | 48 |
192px |
4 |
16px | 16 |
64px | 64 |
256px |
6 |
24px | 20 |
80px | 96 |
384px |
Padding & Margin
// All sides
<div className="p-4">All sides (16px)</div>
// Individual sides
<div className="pt-4 pr-6 pb-4 pl-6">Different sides</div>
// Horizontal/Vertical
<div className="px-4 py-2">Horizontal 16px, vertical 8px</div>
// Margin (same syntax with 'm')
<div className="m-4">All sides margin</div>
<div className="mx-auto">Center horizontally</div>
<div className="-mt-4">Negative margin</div>
Space Between Children
// Vertical spacing
<div className="space-y-4">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>
// Horizontal spacing
<div className="flex space-x-4">
<div>Item 1</div>
<div>Item 2</div>
</div>
Flexbox Layouts
Basic Flex
// Horizontal
<div className="flex">
<div>Item 1</div>
<div>Item 2</div>
</div>
// Vertical
<div className="flex flex-col">
<div>Item 1</div>
<div>Item 2</div>
</div>
// Wrap
<div className="flex flex-wrap">
{items}
</div>
Alignment
// Justify (horizontal)
<div className="flex justify-between">Left and right</div>
<div className="flex justify-center">Center</div>
<div className="flex justify-around">Space around</div>
// Align (vertical)
<div className="flex items-center">Vertically centered</div>
<div className="flex items-start">Top aligned</div>
<div className="flex items-end">Bottom aligned</div>
// Combined
<div className="flex items-center justify-between">
<span>Left</span>
<span>Right</span>
</div>
Gap
// Gap between flex items (preferred over margin)
<div className="flex gap-4">
{items}
</div>
// Different horizontal and vertical gaps
<div className="flex flex-wrap gap-x-4 gap-y-2">
{items}
</div>
Grid Layouts
Basic Grid
// Simple grid
<div className="grid grid-cols-3 gap-4">
{items}
</div>
// Responsive grid
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
{items}
</div>
// Game card grid (common pattern)
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4">
{games.map(game => <GameCard key={game.id} game={game} />)}
</div>
Column Spanning
<div className="grid grid-cols-4 gap-4">
<div className="col-span-2">Spans 2 columns</div>
<div>1 column</div>
<div>1 column</div>
<div className="col-span-full">Full width</div>
</div>
Page Layout Patterns
Standard Page
<div className="min-h-screen bg-background">
<header className="border-b border-border">
<div className="container mx-auto px-4 py-4">{/* Header content */}</div>
</header>
<main className="container mx-auto px-4 py-8">
<h1 className="text-4xl font-bold mb-6">Page Title</h1>
<div className="space-y-8">{/* Page sections */}</div>
</main>
<footer className="border-t border-border mt-16">
<div className="container mx-auto px-4 py-8">{/* Footer */}</div>
</footer>
</div>
Two-Column Layout
<div className="container mx-auto px-4 py-8">
<div className="grid grid-cols-1 lg:grid-cols-12 gap-8">
{/* Sidebar (3 columns) */}
<aside className="lg:col-span-3">
<FilterPanel />
</aside>
{/* Main (9 columns) */}
<main className="lg:col-span-9">
<GameGrid />
</main>
</div>
</div>
Card Grid
<div className="container mx-auto px-4 py-8">
<div className="mb-8">
<h1 className="text-4xl font-bold mb-2">Browse Games</h1>
<p className="text-lg text-muted-foreground">Explore the collection</p>
</div>
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4">
{games.map((game) => (
<GameCard key={game.id} game={game} />
))}
</div>
</div>
Container Component
Max-width container with responsive padding:
// Basic
<div className="container mx-auto px-4">
Content
</div>
// Responsive padding
<div className="container mx-auto px-4 md:px-6 lg:px-8">
More padding on larger screens
</div>
Max Widths:
- Mobile: 100% (with padding)
- 2xl (1400px+): 1400px fixed width
Responsive Spacing
// Padding
<div className="p-4 md:p-6 lg:p-8">
Increases on larger screens
</div>
// Margin
<div className="mb-4 md:mb-6 lg:mb-8">
Section margin
</div>
// Gap
<div className="flex gap-2 md:gap-4 lg:gap-6">
{items}
</div>
// Space between
<div className="space-y-4 md:space-y-6 lg:space-y-8">
{items}
</div>
Width & Height
Fixed Widths
<div className="w-64">256px</div>
<div className="w-96">384px</div>
// Percentages
<div className="w-1/2">50%</div>
<div className="w-1/3">33%</div>
<div className="w-2/3">67%</div>
<div className="w-full">100%</div>
Max Widths
<div className="max-w-md">448px max</div>
<div className="max-w-lg">512px max</div>
<div className="max-w-2xl">672px max</div>
// Common pattern for centered content
<article className="max-w-2xl mx-auto">
Centered content with readable width
</article>
Min/Max Heights
<div className="min-h-screen">Full viewport height</div>
<div className="min-h-full">100% of parent</div>
<div className="max-h-96">Max height 384px</div>
Best Practices
1. Use Consistent Spacing Units
// Good: Consistent scale
<div className="mb-4">
<h2 className="mb-2">Title</h2>
<p>Content</p>
</div>
// Bad: Arbitrary values
<div className="mb-[17px]">
<h2 className="mb-[9px]">Title</h2>
</div>
2. Prefer Gap Over Margins
// Good: Using gap
<div className="flex gap-4">
{items}
</div>
// Less ideal: Using margins
<div className="flex">
<div className="mr-4">Item</div>
</div>
3. Maintain Vertical Rhythm
<article className="space-y-6">
<section className="space-y-4">
<h2>Section 1</h2>
<p>Content</p>
</section>
<section className="space-y-4">
<h2>Section 2</h2>
<p>Content</p>
</section>
</article>
4. Responsive Spacing
// Increase spacing on larger screens
<div className="px-4 md:px-6 lg:px-8">Content</div>
Next: Typography - Font system and text styles