Multi-Column Layout
The Problem
Creating newspaper-style multi-column text or masonry/Pinterest-style layouts has historically required JavaScript libraries or complex CSS Grid hacks. AI agents often reach for these heavier solutions without considering CSS Multi-Column Layout, a native CSS module that handles column-based content flow with just a few properties. Despite excellent browser support, multi-column layout remains widely underused — particularly for its ability to flow content vertically through columns without any JavaScript.
The Solution
CSS Multi-Column Layout splits content into multiple columns using the columns property system. Content flows top-to-bottom within each column, then continues at the top of the next column — exactly like a newspaper. This vertical flow is the key distinction from CSS Grid, which fills rows left-to-right.
The module works for both inline text content (articles, paragraphs) and block-level elements (cards, images), making it versatile for a range of layout patterns.
Core Principles
column-count vs column-width
The two fundamental approaches to defining columns:
/* Fixed number of columns */
.fixed-columns {
column-count: 3;
}
/* Minimum column width — browser decides the count */
.flexible-columns {
column-width: 250px;
}
/* Shorthand: column-width then column-count */
.shorthand {
columns: 250px 3; /* At least 250px wide, at most 3 columns */
}
column-count creates exactly that many columns regardless of container width. column-width sets a minimum width — the browser calculates how many columns fit and may make them wider than the specified value, but never narrower. For responsive layouts, column-width alone is usually the better choice because it adapts to the viewport without media queries.
Gap and Rules
.styled-columns {
column-count: 3;
column-gap: 2rem; /* Space between columns */
column-rule: 1px solid hsl(0 0% 80%); /* Vertical divider */
}
column-gap controls the space between columns (defaults to 1em). column-rule draws a vertical line between columns, using the same syntax as border. The rule does not take up space — it is painted in the middle of the gap.
break-inside for Preventing Card Splits
When block-level elements (cards, figures, list items) are placed in a multi-column container, the browser may split them across column boundaries. Prevent this with:
.card {
break-inside: avoid;
}
This is essential for masonry-style card layouts where each card should remain intact within a single column.
Code Examples
Magazine Text Layout
Classic newspaper-style multi-column text using column-count with column-gap and column-rule. Text flows naturally from one column to the next.
Width-Based Responsive Columns
Using column-width without column-count lets the browser automatically determine how many columns fit. This is naturally responsive — no media queries needed. The specified width is a minimum; the browser may use wider columns but never narrower.
Masonry-Style Card Gallery
Block-level cards in a multi-column container with break-inside: avoid to prevent cards from splitting across columns. Cards have varying heights to show the masonry effect.
Without break-inside: avoid, the browser would split cards across column boundaries, cutting a card in half with the top in one column and the bottom in the next. This property is essential for any block-level content inside a multi-column container.
Column Spanning
Use column-span: all to create a full-width element that breaks out of the column flow. This is useful for headings, pull-quotes, or section dividers that should stretch across all columns.
Note that column-span only accepts all or none — you cannot span a specific number of columns. The spanning element breaks the column flow, and a new column context begins below it.
Columns vs Grid Comparison
Multi-column layout and CSS Grid both create multi-column appearances, but they flow content in fundamentally different directions. Columns flow content vertically (top-to-bottom, then the next column), while Grid flows content horizontally (left-to-right, row by row).
In the multi-column layout, items are ordered 1-2-3 down the first column, 4-5-6 down the second, and 7-8-9 down the third. In the CSS Grid, items fill row by row: 1-2-3 across the first row, 4-5-6 across the second, and 7-8-9 across the third.
Use multi-column when content should flow vertically like a newspaper — long text, image galleries, masonry card layouts.
Use CSS Grid when items should fill rows left-to-right — product grids, dashboards, form layouts, or any design where horizontal order matters.
Common AI Mistakes
- Ignoring multi-column layout entirely. AI agents almost always reach for CSS Grid or JavaScript when asked to create masonry layouts or newspaper-style text. Multi-column layout is simpler and more appropriate for these use cases.
- Using
column-countwhencolumn-widthis better. A fixed column count breaks on narrow viewports.column-widthprovides natural responsiveness without media queries. - Forgetting
break-inside: avoidon block-level content. Without it, cards, images, and other block elements get split across column boundaries — a very common visual bug. - Expecting
column-spanto accept numeric values. Onlycolumn-span: allorcolumn-span: noneare valid. You cannot span 2 of 3 columns. - Confusing multi-column flow direction with Grid. Content flows top-to-bottom in multi-column layout. If horizontal (row-by-row) ordering is required, CSS Grid is the correct tool.
- Using
margin-bottomwithoutbreak-inside: avoid. In a column container, margin on block items does not prevent column breaks. Always combine margins withbreak-inside: avoidfor card-style layouts.
When to Use
Multi-Column Layout is ideal for
- Newspaper or magazine-style text flowing across columns
- Masonry/Pinterest-style layouts with varying-height cards
- Lists that should distribute items across columns (navigation links, tag clouds)
- Any content that should flow vertically through columns before moving to the next
Use CSS Grid instead when
- Items must fill rows left-to-right (product grids, dashboards)
- You need precise control over both row and column placement
- Items need to span specific rows and columns
- Horizontal ordering of items matters to the design