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

~/css/feature-sections

7 CSS Feature Sections

6 Pure CSS1 with JSPublished 2026-10-05Free · no sign-up

Seven feature section layouts for landing pages: a three-up icon grid, alternating image and text rows, a heading with a checklist, a stats row, tabs that switch a preview, a without-and-with comparison and a big heading beside a compact feature grid.

01. Three-Up Feature Grid

FeaturesGrid

The classic feature row: an icon, a short heading and one sentence for each feature, in a grid that drops from three columns to one by itself with repeat(auto-fit, minmax()). Each feature is a list item, because it is a list of features.

View code
<section class="fs1" aria-labelledby="fs1h"><h3 id="fs1h">Everything you need to sell online</h3><ul><li><span aria-hidden="true">⚡</span><b>Fast checkout</b><p>One page, wallet payments, no forced sign-up.</p></li><li><span aria-hidden="true">📦</span><b>Shipping rules</b><p>Rates by weight, zone or order total.</p></li><li><span aria-hidden="true">📈</span><b>Clear reports</b><p>Sales, margins and repeat buyers at a glance.</p></li></ul></section>
.fs1 { width: 620px; max-width: 100%; box-sizing: border-box; font-family: Inter, system-ui, sans-serif; color: #101828; }
.fs1 h3 { margin: 0 0 16px; font-size: 22px; text-align: center; text-wrap: balance; }
.fs1 ul { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 14px; margin: 0; padding: 0; list-style: none; }
.fs1 li { padding: 16px; border: 1px solid #e4e7ec; border-radius: 14px; background: #fff; }
.fs1 span { display: grid; place-items: center; width: 40px; height: 40px; margin-bottom: 10px; border-radius: 10px; background: #f4ebff; font-size: 20px; }
.fs1 b { display: block; margin-bottom: 4px; font-size: 15px; }
.fs1 p { margin: 0; color: #475467; font-size: 14px; line-height: 1.5; }

02. Alternating Image and Text Rows

FeaturesLayout

Feature rows where the picture swaps sides each time, the zig-zag layout of most product pages. Even rows reverse their order with grid-auto-flow: dense and an explicit column, and every row collapses to picture above text on narrow screens.

View code
<div class="fs2"><section><div class="pic" style="--g:linear-gradient(135deg,#bfdbfe,#3b82f6)" aria-hidden="true"></div><div class="tx"><h3>Plan together</h3><p>Shared boards keep everyone on the same page.</p></div></section><section><div class="pic" style="--g:linear-gradient(135deg,#fbcfe8,#db2777)" aria-hidden="true"></div><div class="tx"><h3>Ship on time</h3><p>Deadlines and reminders that actually help.</p></div></section></div>
.fs2 { display: grid; gap: 18px; width: 560px; max-width: 100%; font-family: Inter, system-ui, sans-serif; container-type: inline-size; }
.fs2 section { display: grid; gap: 14px; align-items: center; }
.fs2 .pic { aspect-ratio: 4 / 3; border-radius: 14px; background: var(--g); }
.fs2 h3 { margin: 0 0 6px; color: #101828; font-size: 19px; }
.fs2 p { margin: 0; color: #475467; font-size: 14px; line-height: 1.5; }
@container (min-width: 440px) {
  .fs2 section { grid-template-columns: 1fr 1fr; gap: 24px; }
  .fs2 section:nth-child(even) .pic { order: 2; }
}

03. Heading with Checklist

FeaturesList

A focused selling point: a heading, one sentence and a checklist of what is included, beside a call to action. The ticks are drawn with CSS on real list items, and the two halves sit side by side only when there is room.

View code
<section class="fs3"><div><h3>Launch in a weekend</h3><p>Our starter kit includes everything a new shop needs on day one.</p><a href="#kit">Get the kit</a></div><ul><li>Product, cart and checkout pages</li><li>Email templates for every order step</li><li>Shipping and tax set up</li><li>A 30-minute onboarding call</li></ul></section>
.fs3 { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 20px; width: 580px; max-width: 100%; box-sizing: border-box; padding: 22px; border-radius: 18px; background: #111827; color: #cbd5e1; font: 14px/1.6 Inter, system-ui, sans-serif; }
.fs3 h3 { margin: 0 0 6px; color: #fff; font-size: 21px; }
.fs3 p { margin: 0 0 14px; }
.fs3 a { display: inline-block; padding: 10px 16px; border-radius: 8px; background: #34d399; color: #052e16; font-weight: 800; text-decoration: none; }
.fs3 a:focus-visible { outline: 3px solid #a7f3d0; outline-offset: 2px; }
.fs3 ul { display: grid; gap: 8px; margin: 0; padding: 0; list-style: none; }
.fs3 li { display: flex; gap: 10px; }
.fs3 li::before { content: ""; flex: none; width: 10px; height: 5px; margin-top: 7px; border-left: 2px solid #34d399; border-bottom: 2px solid #34d399; transform: rotate(-45deg); }

04. Feature Stats Row

FeaturesNumbers

Three big numbers with short captions, a quick way to back up a claim. It is a description list, so each number is tied to what it measures, and the separators between items are borders that disappear when the row wraps.

View code
<dl class="fs4"><div><dt>Average page load</dt><dd>0.9s</dd></div><div><dt>Checkout completion</dt><dd>+18%</dd></div><div><dt>Setup time</dt><dd>1 day</dd></div></dl>
.fs4 { box-sizing: border-box; display: flex; flex-wrap: wrap; width: 560px; max-width: 100%; margin: 0; border: 1px solid #e4e7ec; border-radius: 16px; background: #fff; font-family: Inter, system-ui, sans-serif; overflow: hidden; }
.fs4 div { flex: 1 1 150px; display: flex; flex-direction: column-reverse; padding: 18px; border-left: 1px solid #e4e7ec; margin-left: -1px; }
.fs4 dt { color: #475467; font-size: 13px; }
.fs4 dd { margin: 0; color: #101828; font-size: 30px; font-weight: 800; }

05. Feature Tabs with Preview

FeaturesTabs

A list of features on one side and a preview panel on the other; picking a feature swaps the preview. It follows the ARIA tabs pattern with arrow keys and roving tabindex, and the layout stacks on phones.

View code
<div class="fs5"><div role="tablist" aria-label="Features" aria-orientation="vertical"><button role="tab" id="fs5a" aria-selected="true" aria-controls="fs5p">Inbox</button><button role="tab" id="fs5b" aria-selected="false" aria-controls="fs5p" tabindex="-1">Calendar</button><button role="tab" id="fs5c" aria-selected="false" aria-controls="fs5p" tabindex="-1">Reports</button></div><div role="tabpanel" id="fs5p" aria-labelledby="fs5a"><div class="scr" style="--g:linear-gradient(135deg,#1d4ed8,#0e7490)"></div><p>All customer messages in one place.</p></div></div>
.fs5 { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 14px; width: 520px; max-width: 100%; font-family: Inter, system-ui, sans-serif; }
.fs5 [role=tablist] { display: grid; gap: 6px; align-content: start; }
.fs5 [role=tab] { padding: 12px 14px; border: 1px solid #2a3350; border-radius: 10px; background: #151b2e; color: #94a3b8; font: 600 14px Inter, system-ui, sans-serif; text-align: left; cursor: pointer; }
.fs5 [aria-selected=true] { border-color: #818cf8; color: #fff; background: #1e2546; }
.fs5 [role=tab]:focus-visible { outline: 2px solid #a5b4fc; outline-offset: 2px; }
.fs5 .scr { aspect-ratio: 16 / 10; border-radius: 12px; background: var(--g); }
.fs5 p { margin: 8px 0 0; color: #cbd5e1; font-size: 14px; }
var tabs = document.querySelectorAll('.fs5 [role=tab]'), panel = document.getElementById('fs5p'), data = [['linear-gradient(135deg,#1d4ed8,#0e7490)', 'All customer messages in one place.'], ['linear-gradient(135deg,#7c3aed,#db2777)', 'Bookings and reminders, synced everywhere.'], ['linear-gradient(135deg,#047857,#65a30d)', 'Weekly numbers without a spreadsheet.']];
function sel(i) { tabs.forEach(function (t, j) { t.setAttribute('aria-selected', i === j); t.tabIndex = i === j ? 0 : -1; }); panel.setAttribute('aria-labelledby', tabs[i].id); panel.querySelector('.scr').style.setProperty('--g', data[i][0]); panel.querySelector('p').textContent = data[i][1]; tabs[i].focus(); }
tabs.forEach(function (t, i) { t.onclick = function () { sel(i); }; t.onkeydown = function (e) { if (e.key === 'ArrowDown' || e.key === 'ArrowUp') { e.preventDefault(); sel((i + (e.key === 'ArrowDown' ? 1 : tabs.length - 1)) % tabs.length); } }; });

06. Without Us and With Us

FeaturesComparison

Two columns contrasting the old way with the new way, a persuasive pattern for landing pages. The crosses and ticks are decorative; each list has a heading, so the meaning comes from the words Without and With rather than the icons.

View code
<div class="fs6"><section class="no"><h3>Without a system</h3><ul><li>Orders tracked in spreadsheets</li><li>Stock counts out of date</li><li>Late replies to customers</li></ul></section><section class="yes"><h3>With Stockroom</h3><ul><li>Orders synced automatically</li><li>Live stock across channels</li><li>Every message in one inbox</li></ul></section></div>
.fs6 { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px; width: 540px; max-width: 100%; font: 14px Inter, system-ui, sans-serif; }
.fs6 section { padding: 18px; border-radius: 14px; }
.fs6 .no { background: #fef3f2; color: #7a271a; } .fs6 .yes { background: #ecfdf3; color: #054f31; }
.fs6 h3 { margin: 0 0 10px; font-size: 16px; }
.fs6 ul { display: grid; gap: 8px; margin: 0; padding: 0; list-style: none; }
.fs6 li { display: flex; gap: 8px; }
.fs6 .no li::before { content: "✕"; color: #d92d20; font-weight: 800; }
.fs6 .yes li::before { content: "✓"; color: #079455; font-weight: 800; }

07. Icon List with Big Heading

FeaturesHero

A large heading on the left and a two-by-two grid of small features on the right, a dense section that still breathes. Container queries switch it from stacked to side by side, so it adapts to the space it is placed in rather than the screen.

View code
<section class="fs7"><div class="in"><h3>Built for teams that move fast</h3><ul><li><b>Roles</b>Control who can edit what.</li><li><b>History</b>Undo any change in one click.</li><li><b>Comments</b>Discuss right on the work.</li><li><b>Exports</b>PDF, CSV and image.</li></ul></div></section>
.fs7 { width: 600px; max-width: 100%; container-type: inline-size; font-family: Inter, system-ui, sans-serif; }
.fs7 .in { display: grid; gap: 18px; padding: 22px; border-radius: 18px; background: #0f172a; }
.fs7 h3 { margin: 0; color: #fff; font-size: 26px; line-height: 1.15; text-wrap: balance; }
.fs7 ul { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin: 0; padding: 0; list-style: none; color: #94a3b8; font-size: 13px; }
.fs7 b { display: block; margin-bottom: 2px; color: #e2e8f0; font-size: 15px; }
@container (min-width: 500px) { .fs7 .in { grid-template-columns: 1fr 1.3fr; align-items: center; } }
@container (max-width: 260px) { .fs7 ul { grid-template-columns: 1fr; } }

About these CSS Feature Sections

One idea per feature

Each feature needs a short heading and one sentence. If you need a paragraph, it deserves its own section. Lists of features are real lists, so screen readers announce how many there are.

Let the grid choose the columns

repeat(auto-fit, minmax(170px, 1fr)) fits as many columns as there is room for and wraps the rest, so the same CSS works from phones to wide screens without media queries.

Container queries for reusable sections

A section placed in a sidebar or a full-width band should adapt to its own width, not the screen's. container-type: inline-size on the section and @container rules make it portable.

Icons support, words explain

Decorative icons get aria-hidden. In comparisons, write Without and With in the headings rather than relying on red crosses and green ticks.

Frequently asked questions

How many features should a section show?

Three to six. More than that becomes a feature list; consider a table or a dedicated page.

Do the alternating rows need extra classes?

No. :nth-child(even) reorders every other row, and the stacked mobile layout is the default.

Can I use real screenshots?

Yes. Replace the gradient placeholders with images that have width, height and alt text.