Tailwind CSS

Layout: Container, Columns & Aspect Ratio

20 min Lesson 18 of 35

Layout: Container, Columns & Aspect Ratio in Tailwind CSS

Tailwind provides powerful layout utilities beyond Flexbox and Grid. The container class centers and constrains content width, columns create magazine-style layouts, and aspect ratio utilities maintain perfect proportions for images and videos.

Advanced Layout Utilities

These utilities complement Flexbox and Grid by providing specialized layout solutions: containers for responsive max-widths, columns for flowing multi-column text, and aspect ratios for maintaining proportions across different screen sizes.

Container Utility

The container class centers content and applies responsive max-widths based on breakpoints. It's essential for creating consistent, centered layouts.

Basic Container Usage

<!-- Basic container -->
<div class="container">
  Centered content with responsive max-width
</div>

<!-- Container with horizontal padding -->
<div class="container mx-auto px-4">
  Centered with padding
</div>

<!-- Container with custom padding per breakpoint -->
<div class="container mx-auto px-4 sm:px-6 lg:px-8">
  Responsive padding
</div>

<!-- Full-width container (no max-width) -->
<div class="container max-w-full px-4">
  Full width with padding
</div>

Container Breakpoint Widths

<!-- Default Tailwind container breakpoints:
  None (100%)     - No max-width
  sm: 640px       - Container is 640px max
  md: 768px       - Container is 768px max
  lg: 1024px      - Container is 1024px max
  xl: 1280px      - Container is 1280px max
  2xl: 1536px     - Container is 1536px max
-->

<!-- Container centers automatically at each breakpoint -->
<div class="container mx-auto">
  Automatically responsive width
</div>

<!-- Override container at specific breakpoint -->
<div class="container lg:max-w-4xl">
  Custom max-width on large screens
</div>

Container Configuration

<!-- Customizing container in tailwind.config.js -->
<!--
module.exports = {
  theme: {
    container: {
      center: true,           // Always center containers
      padding: '2rem',         // Default padding
      screens: {
        sm: '640px',
        md: '768px',
        lg: '1024px',
        xl: '1280px',
        '2xl': '1400px',      // Custom 2xl breakpoint
      },
    },
  },
}
-->

<!-- Responsive padding configuration -->
<!--
module.exports = {
  theme: {
    container: {
      center: true,
      padding: {
        DEFAULT: '1rem',
        sm: '2rem',
        lg: '4rem',
        xl: '5rem',
        '2xl': '6rem',
      },
    },
  },
}
-->

Practical Container Examples

<!-- Page header with container -->
<header class="bg-white shadow">
  <div class="container mx-auto px-4 py-6">
    <nav class="flex items-center justify-between">
      <div class="text-2xl font-bold">Logo</div>
      <div class="space-x-6">
        <a href="#">Home</a>
        <a href="#">About</a>
        <a href="#">Contact</a>
      </div>
    </nav>
  </div>
</header>

<!-- Main content with container -->
<main class="container mx-auto px-4 py-8">
  <h1 class="text-4xl font-bold mb-6">Page Title</h1>
  <p class="text-lg">Content here...</p>
</main>

<!-- Full-width section with contained content -->
<section class="bg-gray-100 py-16">
  <div class="container mx-auto px-4">
    <h2 class="text-3xl font-bold mb-8">Section Title</h2>
    <div class="grid grid-cols-1 md:grid-cols-3 gap-6">
      <!-- Cards -->
    </div>
  </div>
</section>

<!-- Narrow container for articles -->
<article class="container mx-auto px-4 max-w-3xl py-12">
  <h1 class="text-5xl font-bold mb-4">Article Title</h1>
  <p class="text-lg leading-relaxed">
    Long-form content is more readable in narrower containers...
  </p>
</article>

Container Best Practices

Always add mx-auto to center containers unless configured globally. Add horizontal padding (px-4, px-6, etc.) to prevent content from touching screen edges. For article content, use narrower max-widths (like max-w-3xl) for better readability.

Multi-Column Layouts

The columns utility creates responsive, flowing multi-column layouts similar to newspaper and magazine designs. Content automatically flows from one column to the next.

Column Count Utilities

<!-- Fixed column count -->
<div class="columns-1">One column</div>
<div class="columns-2">Two columns</div>
<div class="columns-3">Three columns</div>
<div class="columns-4">Four columns</div>
<div class="columns-5">Five columns</div>
<div class="columns-6">Six columns</div>
<div class="columns-7">Seven columns</div>
<div class="columns-8">Eight columns</div>
<div class="columns-9">Nine columns</div>
<div class="columns-10">Ten columns</div>
<div class="columns-11">Eleven columns</div>
<div class="columns-12">Twelve columns</div>

<!-- Auto columns (browser decides based on column width) -->
<div class="columns-auto">Automatic column count</div>

<!-- Responsive column counts -->
<div class="columns-1 md:columns-2 lg:columns-3">
  Responsive columns
</div>

Column Width Utilities

<!-- Set column width (browser decides count) -->
<div class="columns-3xs">Min 16rem columns</div>
<div class="columns-2xs">Min 18rem columns</div>
<div class="columns-xs">Min 20rem columns</div>
<div class="columns-sm">Min 24rem columns</div>
<div class="columns-md">Min 28rem columns</div>
<div class="columns-lg">Min 32rem columns</div>
<div class="columns-xl">Min 36rem columns</div>
<div class="columns-2xl">Min 42rem columns</div>
<div class="columns-3xl">Min 48rem columns</div>
<div class="columns-4xl">Min 56rem columns</div>
<div class="columns-5xl">Min 64rem columns</div>
<div class="columns-6xl">Min 72rem columns</div>
<div class="columns-7xl">Min 80rem columns</div>

Column Gap Utilities

<!-- Control spacing between columns -->
<div class="columns-2 gap-0">No gap</div>
<div class="columns-2 gap-1">0.25rem gap</div>
<div class="columns-2 gap-2">0.5rem gap</div>
<div class="columns-2 gap-4">1rem gap</div>
<div class="columns-2 gap-6">1.5rem gap</div>
<div class="columns-2 gap-8">2rem gap</div>
<div class="columns-2 gap-10">2.5rem gap</div>
<div class="columns-2 gap-12">3rem gap</div>

<!-- Responsive gaps -->
<div class="columns-2 gap-4 lg:gap-8">
  Responsive column gap
</div>

Column Break Control

<!-- Control where content breaks between columns -->

<!-- Break before element -->
<div class="columns-2">
  <p>First paragraph...</p>
  <p class="break-before-column">
    This paragraph starts in new column
  </p>
</div>

<!-- Break after element -->
<div class="columns-2">
  <p class="break-after-column">
    This paragraph forces break after
  </p>
  <p>This starts in new column</p>
</div>

<!-- Avoid breaks inside element -->
<div class="columns-2">
  <div class="break-inside-avoid">
    <img src="image.jpg" alt="Image">
    <p>Caption stays with image</p>
  </div>
</div>

<!-- Allow breaks inside (default) -->
<div class="columns-2">
  <p class="break-inside-auto">
    Long paragraph can break across columns
  </p>
</div>

Practical Column Examples

<!-- Magazine-style article layout -->
<article class="container mx-auto px-4 py-12">
  <h1 class="text-4xl font-bold mb-8">Article Title</h1>

  <div class="columns-1 md:columns-2 lg:columns-3 gap-8 text-justify">
    <p class="mb-4">
      First paragraph of article content...
    </p>

    <div class="break-inside-avoid mb-4">
      <img src="photo.jpg" class="w-full rounded-lg mb-2" alt="Photo">
      <p class="text-sm text-gray-600 italic">Photo caption</p>
    </div>

    <p class="mb-4">
      More article content continues flowing...
    </p>

    <blockquote class="break-inside-avoid border-l-4 border-blue-500 pl-4 italic my-4">
      "Important quote stays together"
    </blockquote>

    <p>Final paragraphs...</p>
  </div>
</article>

<!-- Masonry-style image gallery -->
<div class="columns-2 md:columns-3 lg:columns-4 gap-4">
  <img src="1.jpg" class="w-full mb-4 rounded-lg break-inside-avoid" alt="1">
  <img src="2.jpg" class="w-full mb-4 rounded-lg break-inside-avoid" alt="2">
  <img src="3.jpg" class="w-full mb-4 rounded-lg break-inside-avoid" alt="3">
  <img src="4.jpg" class="w-full mb-4 rounded-lg break-inside-avoid" alt="4">
  <img src="5.jpg" class="w-full mb-4 rounded-lg break-inside-avoid" alt="5">
  <img src="6.jpg" class="w-full mb-4 rounded-lg break-inside-avoid" alt="6">
</div>

<!-- Feature list in columns -->
<div class="columns-2 lg:columns-3 gap-6">
  <div class="break-inside-avoid mb-6">
    <h3 class="font-bold text-lg mb-2">Feature 1</h3>
    <p class="text-gray-600">Description...</p>
  </div>
  <div class="break-inside-avoid mb-6">
    <h3 class="font-bold text-lg mb-2">Feature 2</h3>
    <p class="text-gray-600">Description...</p>
  </div>
  <!-- More features -->
</div>

Columns vs. Grid

Use columns for flowing content (like articles) where order is determined by reading flow. Use Grid when you need precise control over item placement. Columns work better for varying-height content, while Grid is better for uniform layouts.

Aspect Ratio Utilities

Aspect ratio utilities maintain perfect width-to-height proportions as elements resize. Essential for responsive images, videos, and embedded content.

Aspect Ratio Classes

<!-- Common aspect ratios -->
<div class="aspect-auto">Natural aspect ratio</div>
<div class="aspect-square">1:1 ratio (square)</div>
<div class="aspect-video">16:9 ratio (video)</div>

<!-- Custom aspect ratios with arbitrary values -->
<div class="aspect-[4/3]">4:3 ratio</div>
<div class="aspect-[21/9]">21:9 ratio (cinema)</div>
<div class="aspect-[3/2]">3:2 ratio (photography)</div>
<div class="aspect-[2/3]">2:3 ratio (portrait)</div>

Aspect Ratio with Images

<!-- Maintain aspect ratio for images -->
<div class="aspect-square w-64">
  <img src="photo.jpg"
       class="w-full h-full object-cover rounded-lg"
       alt="Square image">
</div>

<!-- Video aspect ratio -->
<div class="aspect-video w-full">
  <img src="thumbnail.jpg"
       class="w-full h-full object-cover"
       alt="Video thumbnail">
</div>

<!-- Portrait aspect ratio -->
<div class="aspect-[2/3] w-48">
  <img src="portrait.jpg"
       class="w-full h-full object-cover rounded-lg"
       alt="Portrait">
</div>

Aspect Ratio with Videos and Iframes

<!-- Responsive video embed -->
<div class="aspect-video w-full">
  <iframe src="https://youtube.com/embed/..."
          class="w-full h-full rounded-lg"
          allowfullscreen>
  </iframe>
</div>

<!-- Video element -->
<div class="aspect-video w-full max-w-4xl">
  <video class="w-full h-full object-cover rounded-lg" controls>
    <source src="video.mp4" type="video/mp4">
  </video>
</div>

<!-- Map embed -->
<div class="aspect-[4/3] w-full">
  <iframe src="https://maps.google.com/..."
          class="w-full h-full rounded-lg border-0">
  </iframe>
</div>

Responsive Aspect Ratios

<!-- Different ratios at different breakpoints -->
<div class="aspect-square md:aspect-video lg:aspect-[21/9] w-full">
  <img src="hero.jpg"
       class="w-full h-full object-cover"
       alt="Responsive aspect ratio">
</div>

<!-- Grid of aspect ratio cards -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
  <div class="aspect-video">
    <img src="1.jpg" class="w-full h-full object-cover rounded-lg" alt="1">
  </div>
  <div class="aspect-video">
    <img src="2.jpg" class="w-full h-full object-cover rounded-lg" alt="2">
  </div>
  <div class="aspect-video">
    <img src="3.jpg" class="w-full h-full object-cover rounded-lg" alt="3">
  </div>
</div>

Object Fit and Object Position

These utilities control how images and videos fit within their aspect ratio containers and where they're positioned.

Object Fit Utilities

<!-- Object fit controls how content fills container -->

<!-- Contain: entire image visible, may have empty space -->
<div class="aspect-video w-64">
  <img src="tall.jpg" class="w-full h-full object-contain" alt="Contained">
</div>

<!-- Cover: fills container, may crop image (most common) -->
<div class="aspect-video w-64">
  <img src="tall.jpg" class="w-full h-full object-cover" alt="Covered">
</div>

<!-- Fill: stretches to fill, may distort -->
<div class="aspect-video w-64">
  <img src="tall.jpg" class="w-full h-full object-fill" alt="Filled">
</div>

<!-- None: original size, may overflow or have space -->
<div class="aspect-video w-64 overflow-hidden">
  <img src="tall.jpg" class="w-full h-full object-none" alt="None">
</div>

<!-- Scale down: like contain, but won't upscale -->
<div class="aspect-video w-64">
  <img src="small.jpg" class="w-full h-full object-scale-down" alt="Scale down">
</div>

Object Position Utilities

<!-- Control which part of image is visible when cropped -->

<!-- Corner positions -->
<img src="landscape.jpg" class="object-cover object-top" alt="Top">
<img src="landscape.jpg" class="object-cover object-top-right" alt="Top right">
<img src="landscape.jpg" class="object-cover object-right" alt="Right">
<img src="landscape.jpg" class="object-cover object-bottom-right" alt="Bottom right">
<img src="landscape.jpg" class="object-cover object-bottom" alt="Bottom">
<img src="landscape.jpg" class="object-cover object-bottom-left" alt="Bottom left">
<img src="landscape.jpg" class="object-cover object-left" alt="Left">
<img src="landscape.jpg" class="object-cover object-top-left" alt="Top left">
<img src="landscape.jpg" class="object-cover object-center" alt="Center (default)">

<!-- Practical example: faces always visible -->
<div class="aspect-square w-32">
  <img src="portrait-with-face-at-top.jpg"
       class="w-full h-full object-cover object-top"
       alt="Face visible">
</div>

Complete Aspect Ratio Card Example

<!-- Product card with perfect aspect ratios -->
<div class="bg-white rounded-lg shadow-lg overflow-hidden">
  <!-- Image with 4:3 aspect ratio -->
  <div class="aspect-[4/3]">
    <img src="product.jpg"
         class="w-full h-full object-cover hover:scale-110
                transition-transform duration-500"
         alt="Product">
  </div>

  <div class="p-6">
    <h3 class="text-xl font-bold mb-2">Product Name</h3>
    <p class="text-gray-600 mb-4">Description...</p>
    <div class="flex items-center justify-between">
      <span class="text-2xl font-bold">$99</span>
      <button class="bg-blue-600 text-white px-6 py-2 rounded-lg">
        Buy Now
      </button>
    </div>
  </div>
</div>

<!-- Profile card with square avatar -->
<div class="flex items-center gap-4 p-4 bg-white rounded-lg shadow">
  <div class="aspect-square w-16 flex-shrink-0">
    <img src="avatar.jpg"
         class="w-full h-full object-cover rounded-full"
         alt="Avatar">
  </div>
  <div>
    <h4 class="font-bold">John Doe</h4>
    <p class="text-sm text-gray-600">Web Developer</p>
  </div>
</div>

Exercise 1: Magazine Article Layout

Create a magazine-style article page:

  • Use container with centered content and padding
  • Article title and intro in single column
  • Main content in 2 columns on tablet, 3 on desktop
  • Include at least 2 images that don't break across columns
  • Add a pull quote that stays together
  • Ensure proper column gaps (2rem on desktop)

Exercise 2: Video Gallery

Build a responsive video gallery:

  • Grid layout: 1 column mobile, 2 tablet, 3 desktop
  • Each video thumbnail in 16:9 aspect ratio
  • Use object-cover for thumbnails to fill container
  • Add play button overlay (centered)
  • Hover effect: scale thumbnail to 105%
  • Include video title and duration below thumbnail

Exercise 3: Masonry Image Gallery

Create a Pinterest-style masonry gallery:

  • Use columns utility: 2 on mobile, 3 on tablet, 4 on desktop
  • Images of varying heights
  • Ensure images don't break across columns
  • Add hover overlay with image title
  • Include spacing between images (1rem gap)
  • Each image should have rounded corners

Overflow Control

Overflow Utilities

<!-- Overflow behavior -->
<div class="overflow-auto">Scrollbars when needed</div>
<div class="overflow-hidden">Clips overflow content</div>
<div class="overflow-visible">Overflow visible (default)</div>
<div class="overflow-scroll">Always show scrollbars</div>

<!-- Directional overflow -->
<div class="overflow-x-auto">Horizontal scroll only</div>
<div class="overflow-y-auto">Vertical scroll only</div>
<div class="overflow-x-hidden">Hide horizontal overflow</div>
<div class="overflow-y-scroll">Always vertical scrollbar</div>

<!-- Overscroll behavior (bounce effect) -->
<div class="overscroll-auto">Default scroll behavior</div>
<div class="overscroll-contain">Prevent scroll chaining</div>
<div class="overscroll-none">No bounce/glow effects</div>

<!-- Directional overscroll -->
<div class="overscroll-x-contain">Horizontal scroll contained</div>
<div class="overscroll-y-none">No vertical overscroll</div>

Best Practices for Layout Utilities

  • Use container for consistent page layouts with max-widths
  • Choose columns for flowing content, Grid for structured layouts
  • Always add break-inside-avoid to elements in columns that shouldn't split
  • Use aspect-ratio with object-cover for consistent image sizes
  • Position objects with object-{position} when using object-cover
  • Test column layouts at different breakpoints
  • Add overflow utilities to prevent layout breaking

Summary

Tailwind's advanced layout utilities provide specialized solutions for common design challenges:

  • Container: Centers content with responsive max-widths (container, mx-auto)
  • Columns: Creates flowing multi-column layouts (columns-{n}, columns-{size})
  • Column Control: Manages breaks and gaps (break-inside-avoid, gap-{n})
  • Aspect Ratio: Maintains proportions (aspect-square, aspect-video, aspect-[w/h])
  • Object Fit: Controls content sizing (object-cover, object-contain, etc.)
  • Object Position: Controls content positioning (object-{position})
  • Overflow: Manages content that exceeds boundaries (overflow-{type})

These utilities complement Flexbox and Grid, providing complete layout control for modern responsive designs. Master them to create professional, flexible layouts that work beautifully across all screen sizes.