13 Tailwind CSS Tables

10 Pure Tailwind3 Tailwind + JSPublished

13 Tailwind CSS tables for SaaS pricing comparisons, admin dashboards, shopping carts, crypto price trackers, and class timetables — spanning responsive stack-to-card layouts, sticky headers with pinned first columns, :has()-driven row states with live totals, frosted-glass and neumorphic surfaces, and an FDA Nutrition Facts panel. Scoped under .ttb-NN for no-collision pasting, prefers-reduced-motion guarded, framework-agnostic.

Related13 CSS Tables22 Tailwind CSS Image Gallery21 Tailwind CSS Tooltips20 Tailwind CSS Popovers

Premium template pickPartner: Cruip

Affiliate link

Building the whole admin dashboard, not just this layout?

You just browsed 13 Tailwind table styles. Mosaic by Cruip is a complete Tailwind CSS admin dashboard template, coded in HTML, React, Next.js, Vue and Laravel, with a Figma version too. It costs $69.

View Mosaic dashboard

Mosaic by Cruip. We may earn a commission, at no extra cost to you.

02. Tailwind CSS Pricing Comparison Table with Billing Toggle (opens in a new tab)

Published

Tailwind v4
A three-tier SaaS feature matrix with a lifted, glowing Pro column — upgraded with a working monthly / yearly billing toggle in zero JavaScript. Two radio inputs drive every price on the table through group-has-[#ttb02-yearly:checked]/pricing:, and feature rows are grouped under section headings so the matrix scans like Stripe's, not like a spreadsheet.

03. Tailwind Admin Dashboard Data Table with Sticky Header, Filter & Sort (opens in a new tab)

Published

Tailwind + JS
A GitHub-dark user-management grid that finally does what it draws: status filter pills that actually filter, a live search box, and sortable User and Revenue columns with real aria-sort. The header stays pinned with sticky top-0, and every visual state — pressed pill, sorted column, arrow direction — is an aria-* variant, so the script only ever sets attributes.

04. Dark Neon Crypto Price Table in Tailwind CSS (opens in a new tab)

Published

Pure Tailwind
A cyberpunk market tracker where hovering the body dims every row to 40% and the hovered row glows back with a cyan laser rail — group-hover/tb:opacity-40 plus hover:opacity-100!, two classes and no script. The original's bar charts became SVG sparklines that draw themselves in with a stroke-dashoffset keyframe, over a gradient area fill.

05. Tailwind Shopping Cart Table with Quantity Stepper & Live Totals (opens in a new tab)

Published

Tailwind + JS
A light, warm checkout cart that actually works: steppers recalculate every line, the subtotal, shipping and total; removing an item swipes the row out and collapses it; and a free-shipping progress bar tells the shopper how far they are from the threshold. The summary moves beside the table at wide container sizes — the layout every Tier-1 storefront uses.

06. Glassmorphism Striped Table in Tailwind CSS (opens in a new tab)

Published

Pure Tailwind
A campaign-analytics table frosted over drifting gradient orbs, with zebra stripes written as odd:bg-white/7 even:bg-white/2 so the blurred colour shows through at two intensities. Progress bars now grow in on first paint with starting:w-0, and a supports-[backdrop-filter:blur(1px)]: fallback keeps it legible where blur is unavailable.
Newsletter

Enjoying these demos? Get new ones by email.

A short email when a new collection ships. Unsubscribe any time.

at

Almost there: check your inbox to confirm.Manage

07. Tailwind Table with Sticky First Column & Horizontal Scroll (opens in a new tab)

Published

Tailwind v4
A wide FY 2025 revenue sheet whose product column stays pinned with sticky left-0 while fifteen month and quarter columns scroll beneath it. The upgrade: the separating shadow is now scroll-driven — invisible at rest, fading in only once content actually slides under the column — with a static shadow fallback for engines without animation-timeline.

08. Minimal Editorial Table Design in Tailwind CSS (opens in a new tab)

Published

Pure Tailwind
A magazine-style review index set in Newsreader's optical-size serif: borderless rows, a heavy masthead rule, two hairlines framing the header and a terracotta arrow that slides in on hover. Ratings became a score plus a hairline meter instead of ★ glyphs a screen reader spells out, and titles are real links with an animated underline.

10. Tailwind Weekly Class Schedule Timetable (opens in a new tab)

Published

Pure Tailwind
A studio class schedule — time slots down, days across, colour-coded sessions, a highlighted Today column — upgraded with a zero-JavaScript class-type filter: the legend chips are checkboxes, and unticking one fades every matching session through group-has-[#ttb10-yoga:not(:checked)]/tt:. The time column is now sticky, so the schedule stays readable when it scrolls on a phone.

11. Nutrition Facts Label in Tailwind CSS (opens in a new tab)

Published

Pure Tailwind
An FDA-style Nutrition Facts panel rebuilt as one semantic table: nutrient names are row headers, the % Daily Value column is a real column header, and the label's famous rule hierarchy — 10px, 5px and 1px bars — is just border-t-[10px], border-t-[5px] and border-t. Set in Libre Franklin, the closest open match to the label's Helvetica, with the calorie figure fluid via clamp().

12. Neumorphic Table Design in Tailwind CSS (opens in a new tab)

Published

Pure Tailwind
A soft-UI product analytics grid where card, well, chips and quota rings are all sculpted from one surface colour by paired light/dark shadows — now @theme tokens (shadow-ttb12-out, shadow-ttb12-in) instead of repeated literals. Hover a row and its chips press in via group-hover/row:shadow-ttb12-in; quota rings are a single conic-gradient fed by a --pct custom property.

13. Tailwind Table with Frosted Glass Sticky Header (opens in a new tab)

Published

Pure Tailwind
An orders table whose sticky header is a pane of frosted glass: rows blur and saturate as they scroll beneath it, while column titles stay pin-sharp on a tinted rim-lit strip. The upgrade adds a matching sticky glass footer with the running total, so the number that matters never scrolls away, and a solid-tint fallback where backdrop-filter is missing.
FAQ

Frequently asked questions

How do I make a Tailwind table stack into cards on mobile without writing a media query?
Demo 01 does it with display utilities, and Tailwind's md: prefix is the query. On mobile the <table>, <thead>, <tbody>, <tr> and <td> are all set to block, the header row is visually hidden, and each cell prints its own label with before:content-[attr(data-label)] reading a data-label attribute. At the md breakpoint you flip everything back with md:table, md:table-row and md:table-cell, and re-hide the pseudo-labels. The common bug is forgetting to hide that before: label at md, so every desktop cell shows its column name twice. Keep the real <thead> in the markup even while it's visually hidden — screen readers still rely on it to associate each stacked value with its column.
How does the pricing table's monthly/annual billing toggle work without JavaScript?
Demo 02 keeps it pure CSS: one visually hidden <input type=checkbox> marked peer drives the swap. Each tier holds two price nodes — the monthly figure is visible and carries peer-checked:hidden, the annual figure starts hidden and appears with peer-checked:inline. The sliding knob reads the same peer via peer-checked:translate-x-full. Wrap the track in a <label> so the whole switch is clickable, and keep the checkbox in the DOM with sr-only rather than display:none, so it still takes focus and the space bar toggles it. The usual mistake: putting the price spans outside the peer's later-sibling scope. peer-checked: can only style elements that come after the peer inside the same parent, so if a price sits before the checkbox the toggle silently does nothing.
How do I keep the table header visible while the body scrolls?
Both Demo 03 and Demo 13 pin the header with sticky top-0, but placement is the catch. position: sticky on a <thead> or <tr> is unreliable across engines, so apply sticky top-0 z-10 to each header <th> instead. The table must live inside a height-capped scroll box — max-h-[...] overflow-y-auto — because sticky only sticks within a scrolling ancestor; with no capped container the header has nothing to stick against and just scrolls away with everything else. Give the header cells an opaque bg- (Demo 13 uses a frosted backdrop-blur pane) or body rows bleed through the transparent strip as they pass under it. The z-10 keeps the header painting above body content during the scroll — drop it and the first data row renders on top of the header.
How do I pin the first column while the rest of the table scrolls horizontally?
Demo 07's wide revenue sheet pins the product column with sticky left-0 on the first cell of every row while the wrapper scrolls via overflow-x-auto. Give that pinned cell an opaque background — it sits over the scrolling columns, and without a bg- the month columns slide visibly underneath it. Mind the corner: the top-left cell is both a sticky header (top-0) and a sticky column (left-0), so it needs a higher z- than either axis alone, otherwise one axis wins and clips it. A right-edge shadow — a shadow- utility or an after: pseudo — sells the pin by separating the frozen column from the scroll region. Mark those cells <th scope=row> so the pinned labels are announced as each row's header rather than read as plain data.
How do I restyle an entire table row when its checkbox is ticked using :has()?
Demo 09 styles the whole row from the checkbox with the parent selector: the <tr> carries has-[:checked]:bg-..., has-[:checked]:line-through and a left accent rail via has-[:checked]:border-l-. Tailwind compiles that to a real :has() rule, so the row reacts with no JavaScript. The progress bar scales the same idea up, though a live count of how many boxes are ticked does need a small script — CSS can't total matches across siblings. Two gotchas: :has() is absent in very old engines, so treat the row tint as progressive enhancement, not load-bearing state; and line-through on the <tr> inherits down, so an inner badge you don't want struck needs no-underline to opt out. Keep each control a real <input type=checkbox> paired with a <label> so it stays keyboard-operable.
What's the cleanest way to zebra-stripe a Tailwind table?
Demo 06 stripes with structural variants — odd:bg-white/5 and even:bg-transparent on each body <tr>, which compile to :nth-child() rules. Because this is a glass table over gradient orbs, the stripes are semi-transparent (/5, /10) so the blurred background still reads through; a solid fill would kill the effect. Put the variants on the <tr>, not on individual <td>, or the stripe breaks at every cell border. One subtlety: odd: and even: count all siblings, so a hidden or column-spanning row inside the <tbody> flips the alternation from that point down — keep spacer rows out of the body. Treat striping as decoration only; never let row colour carry meaning, since the tint is invisible to screen readers and to anyone who can't separate the two shades.
Are these tables accessible to screen readers?
Yes, because they're built on real table semantics rather than <div> grids. Column headers use <th scope=col>, and where a row has its own label — Demo 11's nutrient names, Demo 07's pinned product column — that cell is <th scope=row>, so a reader announces "Protein, 12 grams" instead of a bare number. Add a <caption> naming the table. When you visually hide the header to stack into cards (Demo 01), keep the real <thead> in the DOM with sr-only, never hidden, so structure survives. The sortable grid in Demo 03 should expose aria-sort on the active header and keep its control a real <button>. Finally, colour-only cues — the crypto up/down tint, the struck checked row — need a text or icon equivalent, since tint alone fails on contrast and for colour-blind users.
When should I use a table versus cards, and when should I avoid one?
Use a <table> when the data is genuinely two-dimensional — a value sitting at the intersection of a row and a column — which is exactly Demo 10's day-by-time timetable, Demo 07's product-by-month revenue, and Demo 11's nutrient-by-metric panel. Reach for cards or a <dl> instead when each row is really one entity with a few attributes and no cross-column comparison; forcing that into a table adds header overhead for nothing, which is why Demo 01 collapses into cards at mobile where side-by-side comparison is impossible anyway. Never use a table for page layout. If a table is so wide it always needs horizontal scroll on desktop (Demo 07), first ask whether some columns can move into a detail view. And be sparing with the heavy glass and neumorphic treatments (Demos 06, 12, 13) on dense grids — the blur and soft shadows trade legibility for style exactly where legibility matters most.

Related collections

30 CSS Badges preview

30 CSS Badges

30 hand-coded CSS badges for status indicators, notifications, membership tiers, live-data displays, and SEO / DevOps / financial dashboards — upload progress, typing indicator, transit line status, Core Web Vitals, ECG heartbeat, CI/CD build pipeline, countdown ring, live price ticker, keycap shortcut, wax seal, conference lanyard, and holographic collectibles. Copy-paste HTML and CSS, WCAG 2.2 accessible, MIT licensed.

20 CSS Banners & Alerts preview

20 CSS Banners & Alerts

20 hand-coded CSS banner and alert bars for e-commerce storefronts, SaaS dashboards, marketing sites, and compliance-bound products. Covers GDPR cookie consent with a real preferences panel, promo bars with countdown timers, free-shipping threshold progress, app-install smart banners, maintenance and incident status bars, newsletter signup bars, age verification gates, limited-stock urgency banners, live event announcements, browser upgrade notices, geo and currency switchers, sticky top announcement bars, bottom cookie bars, inline form validation alerts, icon-aligned alert banners, left-border accent alerts, diagonal stripe promos, full-width hero banners, animated gradient border alerts, and a text-wrapping laboratory that shows five strategies for the unbreakable string that breaks more banners than anything else. Every bar is scoped under a .ba-NN prefix for no-collision pasting, guards prefers-reduced-motion, carries the correct aria-live and role semantics, and ports unchanged to React, Vue, Svelte, Astro, Next.js and Tailwind.

25 CSS Blockquotes preview

25 CSS Blockquotes

25 CSS blockquotes for article pull quotes, testimonial cards, docs callout admonitions, statement banners, and social-post embeds. Covers giant decorative quotation marks, minimalist hairline and classic left borders, animated gradient and glowing neon borders, glassmorphism and aurora backgrounds, brutalist cards, speech bubbles, thick accent rails, highlighted mark text, newspaper multi-column layouts, an expandable read-more disclosure, a scroll-snap testimonial slider, and one-click copy.

Search CodeFronts

Loading…