SolutionsCase StudiesAI ToolsResourcesAboutContact
Get Your Free AI Automation Audit Book a Free 30-Minute Strategy Call
Playground~/frontend Open editor

~/css/blog-layouts

8 CSS Blog Layouts

8 Pure CSSPublished 2026-10-04Free · no sign-up

Eight blog building blocks: a post card grid, a comfortable article layout, a magazine featured post with a recent list, a minimal dated post list, an article with a sticky table of contents, an author box, a related posts row and a blog index header with categories.

01. Blog Post Card Grid

BlogGrid

A responsive grid of post cards with an image area, category, title, excerpt and date. Each card's title is the link, which keeps one clear link per card instead of several, and the grid adapts from one to three columns with auto-fill.

View code
<div class="bg1">
  <article><div class="im" style="--c:#fde68a"></div><p class="cat">Guides</p><h3><a href="#">Pricing handmade work</a></h3><time datetime="2026-09-28">28 Sep</time></article>
  <article><div class="im" style="--c:#bfdbfe"></div><p class="cat">Studio</p><h3><a href="#">Inside our glaze kitchen</a></h3><time datetime="2026-09-14">14 Sep</time></article>
  <article><div class="im" style="--c:#bbf7d0"></div><p class="cat">Shipping</p><h3><a href="#">Packing ceramics safely</a></h3><time datetime="2026-09-02">2 Sep</time></article>
</div>
.bg1 { box-sizing: border-box; max-width: 100%; width: 560px; display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 16px; font-family: Inter, system-ui, sans-serif; }
.bg1 article { position: relative; }
.bg1 .im { aspect-ratio: 16 / 10; border-radius: 12px; background: var(--c); }
.cat { margin: 10px 0 2px; color: #1d4ed8; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; }
.bg1 h3 { margin: 0 0 4px; font-size: 15px; line-height: 1.35; }
.bg1 a { color: #101828; text-decoration: none; }
.bg1 a::after { content: ""; position: absolute; inset: 0; }
.bg1 a:hover { text-decoration: underline; }
.bg1 a:focus-visible { outline: none; }
.bg1 article:has(a:focus-visible) { outline: 2px solid #2563eb; outline-offset: 4px; border-radius: 12px; }
.bg1 time { color: #5d6679; font-size: 13px; }

02. Article Reading Layout

ArticleTypography

A comfortable reading layout with a measure of about 65 characters, a byline with the date, generous line height and spacing between paragraphs. The ch unit caps the line length, which is one of the biggest factors in readability.

View code
<article class="bl2">
  <p class="kick">Guides</p>
  <h1>How to photograph ceramics in daylight</h1>
  <p class="by">By Ana Ruiz &middot; <time datetime="2026-09-28">28 September 2026</time> &middot; 6 min read</p>
  <p>Soft, indirect light shows glaze texture without harsh reflections. Place pieces near a north-facing window and turn off overhead lights.</p>
  <p>Use a plain backdrop a few shades lighter than the piece, and shoot slightly from above so the rim and interior both show.</p>
</article>
.bl2 { box-sizing: border-box; max-width: 100%; width: 520px; color: #344054; font: 16px/1.75 Georgia, "Times New Roman", serif; }
.bl2 > * { max-width: 65ch; }
.kick { margin: 0; color: #b45309; font: 700 12px Inter, system-ui, sans-serif; letter-spacing: .1em; text-transform: uppercase; }
.bl2 h1 { margin: 6px 0 8px; color: #101828; font: 800 clamp(24px, 4.5vw, 32px)/1.2 Inter, system-ui, sans-serif; letter-spacing: -.02em; }
.by { margin: 0 0 18px; color: #5d6679; font: 13.5px Inter, system-ui, sans-serif; }
.bl2 p + p { margin-top: 0; }

04. Simple Post List

MinimalList

A text-only post list for personal blogs: dates aligned in a narrow column on the left and titles on the right. It loads instantly, reads well, and uses tabular numbers so the dates line up perfectly.

View code
<ul class="bl4">
  <li><time datetime="2026-09-28">2026-09-28</time><a href="#">Notes on pricing small batches</a></li>
  <li><time datetime="2026-09-12">2026-09-12</time><a href="#">What I learned from my first trade fair</a></li>
  <li><time datetime="2026-08-30">2026-08-30</time><a href="#">A calmer way to plan launches</a></li>
</ul>
.bl4 { box-sizing: border-box; max-width: 100%; width: 460px; margin: 0; padding: 0; list-style: none; font: 15px Inter, system-ui, sans-serif; }
.bl4 li { display: grid; grid-template-columns: 100px minmax(0, 1fr); gap: 14px; padding: 12px 0; border-bottom: 1px solid #eef0f4; }
.bl4 time { color: #5d6679; font: 13px "JetBrains Mono", monospace; font-variant-numeric: tabular-nums; }
.bl4 a { color: #101828; font-weight: 600; text-decoration: none; }
.bl4 a:hover { color: #1d4ed8; text-decoration: underline; }
.bl4 a:focus-visible { outline: 2px solid #2563eb; outline-offset: 2px; }
@media (max-width: 420px) { .bl4 li { grid-template-columns: 1fr; gap: 2px; } }

05. Post with Table of Contents

DocsSidebar

An article layout with a sticky table of contents beside the text, the pattern for long guides. The contents is a nav landmark with links to section ids, and it moves above the article on narrow screens instead of disappearing.

View code
<div class="bl5">
  <nav aria-label="On this page"><p>On this page</p><ul><li><a href="#s1">Light</a></li><li><a href="#s2">Backdrop</a></li><li><a href="#s3">Angles</a></li></ul></nav>
  <article><h2 id="s1">Light</h2><p>Use soft daylight from one side.</p><h2 id="s2">Backdrop</h2><p>Pick a plain colour lighter than the piece.</p><h2 id="s3">Angles</h2><p>Shoot from slightly above to show the rim.</p></article>
</div>
.bl5 { box-sizing: border-box; max-width: 100%; width: 560px; display: grid; grid-template-columns: 150px minmax(0, 1fr); gap: 24px; font-family: Inter, system-ui, sans-serif; }
.bl5 nav { position: sticky; top: 16px; align-self: start; padding-left: 12px; border-left: 2px solid #262d3e; }
.bl5 nav p { margin: 0 0 8px; color: #9aa4b8; font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .08em; }
.bl5 ul { display: grid; gap: 6px; margin: 0; padding: 0; list-style: none; }
.bl5 nav a { color: #c9d1e2; font-size: 14px; text-decoration: none; }
.bl5 nav a:hover { color: #fff; }
.bl5 a:focus-visible { outline: 2px solid #7c9cff; outline-offset: 2px; }
.bl5 h2 { margin: 0 0 4px; color: #fff; font-size: 17px; }
.bl5 article p { margin: 0 0 16px; color: #aab3c7; font-size: 14.5px; line-height: 1.6; }
@media (max-width: 480px) { .bl5 { grid-template-columns: 1fr; } .bl5 nav { position: static; } }

06. Author Box

AuthorBio

The author box at the end of an article: avatar, name, a short bio and links to more posts and social profiles. A real author bio helps readers judge expertise; keep it accurate and link to a page with the author's other work.

View code
<aside class="bl6" aria-label="About the author">
  <span class="av" aria-hidden="true">AR</span>
  <div><p class="nm">Written by <b>Ana Ruiz</b></p><p>Ceramicist and studio owner for nine years. Writes about running a small craft business.</p><p class="lk"><a href="#">More posts by Ana</a> &middot; <a href="#">Instagram</a></p></div>
</aside>
.bl6 { box-sizing: border-box; max-width: 100%; width: 440px; display: flex; gap: 16px; padding: 18px; border: 1px solid #e4e7ec; border-radius: 16px; background: #f9fafb; font: 14px/1.55 Inter, system-ui, sans-serif; color: #475467; }
.bl6 .av { flex: none; display: grid; place-items: center; width: 56px; height: 56px; border-radius: 50%; background: #fecaca; color: #7f1d1d; font-weight: 800; }
.bl6 p { margin: 0 0 6px; }
.nm { color: #101828; }
.lk a { color: #1d4ed8; font-weight: 600; }
.lk a:focus-visible { outline: 2px solid #2563eb; outline-offset: 2px; }

08. Blog Index Header with Categories

BlogHeader

The top of a blog index: a title, one line of description and a row of category links with the current one marked by aria-current. The category row wraps on small screens and doubles as the blog's secondary navigation.

View code
<header class="bl8">
  <h1>The Studio Journal</h1>
  <p>Notes on making, selling and shipping handmade work.</p>
  <nav aria-label="Categories"><a href="#" aria-current="page">All</a><a href="#">Guides</a><a href="#">Studio</a><a href="#">Shipping</a><a href="#">Business</a></nav>
</header>
.bl8 { box-sizing: border-box; max-width: 100%; width: 520px; font-family: Inter, system-ui, sans-serif; }
.bl8 h1 { margin: 0; color: #101828; font-size: clamp(26px, 5vw, 36px); letter-spacing: -.02em; }
.bl8 p { margin: 6px 0 16px; color: #475467; font-size: 16px; }
.bl8 nav { display: flex; flex-wrap: wrap; gap: 6px; }
.bl8 a { padding: 6px 12px; border-radius: 999px; color: #344054; font-weight: 600; font-size: 14px; text-decoration: none; }
.bl8 a:hover { background: #f2f4f7; }
.bl8 a[aria-current] { background: #101828; color: #fff; }
.bl8 a:focus-visible { outline: 2px solid #2563eb; outline-offset: 2px; }

About these CSS Blog Layouts

Line length

Long text is easiest to read at roughly 60 to 75 characters per line. max-width: 65ch on the article caps the measure at any screen size.

One link per card

Make the post title the link and stretch its click area over the whole card with a positioned pseudo-element, so each card has one clear link instead of several.

Headings in order

Keep a logical heading order: the page or blog title as h1, featured posts as h2 and list items as h3, which helps screen reader navigation and search engines.

Show the author

A short, accurate author bio with a link to the author's other work helps readers judge expertise. Avoid inventing credentials or titles.

Frequently asked questions

Do these layouts need JavaScript?

None of them do.

How do I make the contents sticky?

position: sticky with a top offset on the nav, as in the table of contents demo.

Are dates important?

Yes. Show publish and update dates in time elements so readers know how current a post is.