21 CSS Pricing Tables

16 Pure CSS5 Light JSPublished

21 CSS pricing tables for SaaS plan pages, e-commerce checkouts, and product-suite launches — with monthly/annual and multi-currency toggles, usage-based sliders and bundle calculators, feature-comparison rows and tabbed suites, glassmorphism, neumorphic, gradient-border and ribbon styling, 3D flip cards, and mobile swipe carousels with skeleton loading. Scoped under .prc-NN for no-collision pasting, prefers-reduced-motion guarded, framework-agnostic.

Related21 CSS Pricing Sections47 CSS Toggles & Switches13 CSS Tables21 Tailwind CSS Pricing Tables

Premium template pickPartner: Cruip

Affiliate link

Building the whole landing page, not just this section?

You just browsed 21 pricing tables. Cruip makes complete Tailwind CSS templates for landing pages, SaaS websites and admin dashboards, coded in HTML, React, Next.js and Vue and used by 60K+ developers. Single templates start at $49.

Browse Cruip templates

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

01. Monthly / Annual Toggle Switch (opens in a new tab)

Published

Pure CSS
The single most-copied SaaS pattern: a pill toggle slides between Monthly and Annual billing, and every price on the 3-card grid flips to its discounted yearly value with a smooth vertical roll — zero JavaScript, driven entirely by :has() and a checkbox.

03. Expandable Feature Comparison Rows (opens in a new tab)

Published

Pure CSS
The minimal-first pattern conversion teams love: a clean 3-card grid with one "Compare all features" toggle that smoothly unfolds a full feature matrix beneath — a real, screen-reader-friendly <table> that was there all along, revealed with the grid-rows 0fr→1fr trick.

04. Dark / Light Mode Adaptive Cards (opens in a new tab)

Published

Pure CSS
Theme-aware pricing done the maintainable way: every color in the component reads from a handful of custom properties, so one checkbox retints backgrounds, borders, gradients and type contrast in a single smooth transition — the exact pattern for sites with a global theme toggle.

05. Scale-Up Focused Plan Hover (opens in a new tab)

Published

Pure CSS
The classic conversion micro-interaction: hover (or keyboard-focus) any tier and it lifts, scales up and deepens its shadow while sibling cards ease back and dim — pulling the eye to exactly one plan at a time using :has() sibling logic.

Published

Pure CSS
A continuous comet of light orbits the "Most Popular" card's border — the premium border-beam effect every SaaS landing page wants right now, built with one registered @property angle and a masked conic-gradient. No SVG, no canvas.
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. Interactive Floating Badges (opens in a new tab)

Published

Pure CSS
"Save 20%" and "Best Value" badges that live: they bob gently on an idle loop, then react to card hover by perking up — tilting, scaling and snapping to attention — giving pricing tiers a playful, tactile personality without a single script.

08. CTA Button Morph & Slide-In Icon (opens in a new tab)

Published

Pure CSS
Conversion-grade call-to-action choreography: hover any plan's button and it fills with color from the left, widens its padding, and an arrow slides in from the edge — three coordinated micro-transitions that make "Choose plan" feel irresistible to click.

09. Color Shift Theme Overlays (opens in a new tab)

Published

Pure CSS
Each tier carries its own brand hue: hovering a card floods its accent color through the price, checkmarks, divider and CTA at once — and gently tints the whole section's backdrop to match — all by transitioning a single custom property per card.

10. 3D Flip Card Plans (opens in a new tab)

Published

Pure CSS
Click "View details" and the entire pricing card rotates 180° in 3D space, revealing full specs and fine print on its back face — the flip runs on a hidden checkbox, so it's tappable, keyboard-toggleable and needs zero JavaScript.

11. Interactive Volume Slider Pricing (opens in a new tab)

Published

CSS + JS
The usage-based pricing calculator SaaS teams actually ship: drag a "team size" range slider and every tier's monthly total recalculates live, the per-seat maths updates, and the recommended plan badge jumps to whichever tier is now the best deal.

12. Multi-Tier Tabbed Panels (opens in a new tab)

Published

Pure CSS
For product suites too broad for one grid: three radio-driven tabs ("Marketing", "Sales", "Support") cross-fade entire pricing panels beneath a sliding tab indicator — arrow keys move between tabs natively because they're a real radio group.

13. Tier Overage Meter Visualizer (opens in a new tab)

Published

Pure CSS
Show, don't tell, what each tier covers: capacity meters for projects, storage and seats fill to each plan's limit as the cards scroll into view, with the near-full bars shifting amber — an instant visual answer to "which plan fits my usage?"
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

15. Glassmorphism Frosted Glass Cards (opens in a new tab)

Published

Pure CSS
Ultra-premium frosted glass pricing: translucent cards float over slowly drifting color blobs, with backdrop-filter blur doing the frosting and the moving background proving the glass is real — the aesthetic every AI/fintech landing page is shipping right now.

17. Ribbon & Banner Folds (opens in a new tab)

Published

Pure CSS
Classic e-commerce trust styling: a corner ribbon with true 3D fold-backs, and a drop-down bookmark banner that unfurls on page load — both drawn entirely with borders and clip-path, no images, and both slide into place with a springy entrance.

18. Neumorphic Soft-Press Tiers (opens in a new tab)

Published

Pure CSS
Tactile soft-UI pricing: cards extrude from a matching background with the signature dual light/dark shadows, and pressing a card's button physically sinks it — the shadows invert to inset, mimicking a real button being pushed into the surface.

20. Accordion-Style Mobile Stacking (opens in a new tab)

Published

Pure CSS
One component, two personalities: on desktop it's a straight 3-column comparison; squeeze it into a narrow container and each plan collapses into a tappable accordion with only the essentials visible — powered by container queries, so it adapts to its container, not the viewport.

21. Skeleton Loading States (opens in a new tab)

Published

CSS + JS
The perceived-performance pattern for API-priced products: cards render instantly as shimmering gray skeletons in the exact final geometry, then real prices swap in with a soft crossfade when the (simulated) pricing API responds — zero layout shift from first paint to loaded.
FAQ

Frequently asked questions

What's the difference between a CSS pricing table and a CSS pricing section?
A pricing section is the whole marketing surface — usually a full-width slab with an H2 headline, a billing toggle, three plan cards, and a footer CTA ("Not sure? Talk to sales"). It occupies its own scroll region on a marketing page and its job is to hand the visitor a decision ("pick a plan"). Our sibling css-pricing-sections collection covers 15 patterns for that surface. A pricing table is the more granular UI primitive — either the 3-card comparison grid inside the section, OR a wide feature-comparison table that sits BELOW the section for visitors who want to compare features across all plans before deciding. It's a smaller unit; a real SaaS page (Vercel, Linear, Stripe, Notion, Framer) ships BOTH — the pricing section at the top for the quick decision, the comparison table below for the deep dive. This collection covers the pricing-table surface: the plan cards, the interactive toggles/sliders/tabs that drive them, the ribbons and badges that guide attention, the comparison matrix rows, the accordion mobile fallback. Copy them alongside the pricing section from the sibling collection, or drop a single card into any layout. All 21 designs are scoped under .prc-NN so they never collide with your existing styles.
How do I build a monthly / annual billing toggle in pure CSS?
The canonical recipe is a hidden radio group (<input type='radio' name='billing' id='monthly' checked> + <input type='radio' name='billing' id='yearly'>) that drives price display via the sibling combinator or, cleaner in modern browsers, :has(). Two <span> elements per card hold the monthly and annual prices — CSS shows one and hides the other based on which radio is checked: .prc-01:has(#yearly:checked) .price-monthly { display:none } .prc-01:has(#yearly:checked) .price-yearly { display:block }. A sliding pill indicator inside the toggle rides transform:translateX(100%) on the checked state. Demo #01 in this collection ships the full recipe — real radio inputs so keyboard users get arrow-key navigation and screen-reader announcement for free, aria-live='polite' on the price so the value change is announced when it swaps. The whole switch is ~40 lines of scoped CSS and zero JavaScript. If your billing is more complex (annual saves 17%, quarterly saves 8%, per-seat pricing), the same pattern extends to 3+ radios — the CSS scales linearly. Vercel, Linear, Stripe, Notion, and Framer all ship this exact pattern on their marketing pricing pages.
When should I use a real HTML `<table>` vs CSS Grid for a pricing comparison?
The honest answer depends on what you're comparing. Use real <table> markup when you have 15+ features to compare across 3-5 plans — anything long enough that a visitor needs to scan down a column or across a row. Screen readers announce row/column headers correctly (add scope='col' to the plan headers and scope='row' to each feature name), keyboard users navigate cell by cell with arrow keys when the table is focused, and CSS position:sticky on the <thead> pins the plan headers while scrolling the feature rows — no JavaScript needed. Demo #03 (Expandable Feature Comparison Rows) uses this pattern. Use CSS Grid when you're showing 3-6 plan cards side by side with a handful of key bullets each — a card grid, not a comparison matrix. Grid gives you more layout flexibility (visual popouts, ribbon overlays, hover effects) and mobile-first responsive behavior is cleaner. Demos #04, #05, #06, #08, #09, #10, #15, #16, #17, #18 ship this pattern. Never use CSS Grid for a 20-row feature comparison — you lose the automatic table semantics that assistive tech relies on, and mobile users can't scan the data as a table. And never use a <table> for the 3-card marketing grid — it forces the layout into a rigid 3-column shape that breaks on mobile without JS gymnastics.
How do I animate the 'Most Popular' border glow without hurting Core Web Vitals?
Demo #06 (Most Popular Border-Beam Glow) shows the modern recipe: use @property to declare a typed custom property for the gradient angle (@property --angle { syntax:'<angle>'; initial-value:0deg; inherits:false }), then animate that property with a conic-gradient border via border-image or a mask+background technique. Because the property is typed as <angle>, browsers can interpolate it on the compositor thread — the border rotation runs on GPU, not on the main thread. That means zero INP impact, zero CLS (the border stays exactly the same size while it rotates), and no scroll listener or requestAnimationFrame loop. Older browsers that don't support @property fall back to a static gradient border via @supports gating — visually degraded but still readable. Do NOT animate the border with a <canvas> element (each frame is a paint), don't use a JavaScript loop that mutates style.background (main-thread work), and don't stack a full-size ::before pseudo-element with filter:blur() for the glow — the filter forces the entire card into a compositor layer which can cost 4-8MB of GPU memory on mobile. The @property + conic-gradient version costs ~200KB GPU memory.
Do these pricing-table demos work in Safari and Firefox today?
Every demo works in evergreen Chromium, Safari 15.4+, and Firefox 121+. The two features with narrower support are gated with @supports so older browsers get a graceful fallback: (1) :has() — Chrome/Edge/Opera 105+, Safari 15.4+, Firefox 121+ (December 2023). Demos that use :has() for state-machine logic (billing toggle, dark-mode switch, tab crossfade) fall back to ~ sibling combinators or checkbox-hack patterns where possible. (2) @property for typed custom properties — Chrome/Edge 85+, Safari 16.4+, Firefox 128+ (July 2024). Demos that use it for animated gradients (Most Popular border-beam, gradient border draw-in) fall back to a static gradient. Every backdrop-filter declaration ships with the -webkit-backdrop-filter prefix for Safari. Container queries (Demo #20's mobile accordion) work in Chrome 105+, Safari 16.0+, Firefox 110+. If your target audience still includes IE11 or pre-2023 mobile Safari, the fallback story is the demo without the interactive garnish — the plan cards still render, the prices still display, only the delighter (glow, morph, crossfade) is missing. That's the correct progressive-enhancement contract for a marketing surface where conversion depends on the plan info being visible, not on the animation.
How do Vercel, Linear, Stripe, and Notion structure their pricing pages?
Every modern tier-1 SaaS pricing page follows the same three-surface pattern, and this collection ships every piece: (1) Above the fold — the pricing section: full-width slab with H2 headline, monthly/annual toggle (Demo #01), 3-4 plan cards (Demos #04-#10). One card is visually elevated with a 'Most Popular' badge (Demo #06 border glow, Demo #07 floating badge, Demo #17 corner ribbon). Each card ends with a primary CTA (Demo #08 morphing arrow). (2) Middle of the page — interactive calculators: usage-based tiers get a volume slider (Demo #11 — Twilio SMS, SendGrid emails, Cloudflare Workers, OpenAI API tokens), bundle pricing gets a checkbox matrix (Demo #14 — Notion + Slack + Linear bundles), enterprise multi-product suites get tabbed panels (Demo #12 — Google Workspace, Microsoft 365, Adobe Creative Cloud). (3) Below the fold — the comparison matrix: expandable feature rows (Demo #03) let users compare every feature across every plan without leaving the page. Mobile stacks the whole grid into an accordion (Demo #20). The conversion lift from shipping ALL THREE surfaces vs just the pricing section is real: Stripe's own case study data shows the comparison matrix increases conversion for Enterprise-tier plans by 30-40% because the extra feature detail closes the technical-buyer objection. B2B SaaS pricing pages typically run $15-25 CPM in tier-1 markets — one of the highest-value advertising surfaces on the web.
How do Stripe, Paddle, and Chargebee build usage-based billing calculators?
Usage-based billing (fintech's fastest-growing pricing model — 45% of SaaS pricing pages will include it by 2027 per OpenView benchmarks) needs an interactive calculator that shows the total price responding to the user's usage inputs. Demo #11 (Interactive Volume Slider Pricing) is the canonical pattern: a scoped <input type='range'> drives a CSS custom property (--seats) via a two-line JS oninput handler; that property flows down through the plan card and multiplies the base rate to display the total. The whole calculator is ~30 lines of scoped CSS + 15 lines of vanilla JavaScript, zero framework. Demo #14 (Multi-Product Bundle Checkbox Matrix) extends the pattern to the bundle-pricing surface — check boxes for individual products, checkbox-hack toggles a bundle discount, the total updates via CSS counter() on the checked count plus a small JS adder. Real fintech surfaces (Stripe's own stripe.com/pricing, Paddle's checkout, Chargebee's billing plans, Recurly's usage tiers) all use this exact primitive. High-CPM keywords in this vertical: SaaS billing calculator ($15-25 CPM), Stripe usage-based pricing ($25-45), Cloudflare Workers pricing calculator ($15-25), Twilio SMS pricing calculator ($10-15), OpenAI API pricing calculator ($15-25 — surging as of 2025). Every calculator ships aria-live='polite' on the total so screen readers announce the value change; every range input carries a bound <label>, aria-valuemin, aria-valuemax, and aria-valuenow updated by the JS handler.
How do I meet WCAG 2.2, US SB-478, EU VAT display, and FTC 'junk fees' rules on a pricing page?
Pricing pages are unusually exposed to accessibility and consumer-protection enforcement because they're the point where money is committed. Four hard requirements: (1) WCAG 2.2 tap targets (SC 2.5.5) — every clickable pricing card, plan CTA, billing toggle, and comparison-row expander must be at least 24×24 CSS pixels (2.2 relaxed the earlier 44×44 to 24×24 for pointer devices; keep 44×44 on touch surfaces where the space allows). Every demo in this collection is compliant by default. (2) US California SB-478 (2024) — 'junk fees' law: any mandatory fee (setup fees, per-seat surcharges, mandatory add-ons, activation fees, cancellation fees) MUST be included in the displayed advertised price. You can't show '$29/mo' at the top and reveal '+$5 setup fee, +$3 processing fee, +$2 tax' at checkout. Similar laws are on the books in Colorado (SB23-093), Washington DC, and effective 2026 in Massachusetts. Federal FTC 'Rule on Unfair or Deceptive Fees' (October 2024) codifies this nationally for hotels and event ticketing; SaaS is next. Demo #04 (Adaptive Cards) ships a compliant pattern — the visible price includes all mandatory recurring costs; only truly optional add-ons appear below the line item. (3) EU VAT display (Directive 2011/83/EU Article 6): prices shown to EU consumers must include VAT — you can't show '$29 (excl. VAT)' in the primary display. Your pricing table needs to detect visitor geography (server-side, via IP or a locale cookie) and show VAT-inclusive prices to EU visitors. Adjust the --price-base custom property on the demo cards; the rest of the layout is unchanged. (4) FTC Section 5 — deceptive design: 'dark patterns' that obscure the true cost (misleading toggle defaults, hidden fine print, decoy pricing where the middle plan is visually elevated but functionally worse) invite enforcement. Demo #06's 'Most Popular' glow is legitimate emphasis when the elevated plan is genuinely the best value for the median customer; it becomes a dark pattern when the elevation is manipulating attention toward the highest-margin plan regardless of user value. Ship honest emphasis or ship no emphasis; the middle option is legally the worst.

Related collections

15 CSS 3D Tilt Hover Cards preview

15 CSS 3D Tilt Hover Cards

15 mouse-aware 3D tilt hover cards — e-commerce product spotlight, glassmorphism parallax team card, interactive pricing tier, holographic NFT collectible, pop-out mascot, dark tech grid with border glow, media player album art, blog article preview, cyberpunk neon glow, dashboard KPI widget, minimalist real estate, flip-to-back tilt, mobile app showcase, course learning card, and a Pure CSS touch-friendly tilt. Vanilla JS writes --rx/--ry/--mx/--my; all rendering stays in CSS on the GPU.

24 CSS Animated Cards preview

24 CSS Animated Cards

24 hand-coded CSS animated card patterns organised by what triggers the motion, not by card style. Scroll and entrance triggers: staggered grid reveals, @starting-style mount-in, scroll-driven scale and fade on animation-timeline: view(), View Transitions API card-to-detail morphs, blur-to-sharp lazy image loading, and FLIP re-layout when a filter changes. State-change triggers: add-to-cart success morph, like and save particle burst, expand and collapse to intrinsic height with calc-size(), swipe-to-dismiss on Pointer Events, and skeleton-to-loaded crossfade. Data-driven triggers: count-up KPI metrics, SVG sparkline draw-on-enter, and progress ring fill on load. Ambient idle loops: breathing glow, floating drift, animated gradient mesh backgrounds, conic rotating borders, auto-cycling testimonial decks, and live status pulses. Plus four hover patterns where the effect is the topic itself: cursor spotlight, holographic foil glare, corner ribbon slide, and horizontal accordion expand. Every card is scoped under a .ac-NN prefix for no-collision pasting, guards prefers-reduced-motion, animates compositor-only properties, and ports unchanged to React, Vue, Svelte, Astro, Next.js and Tailwind.

22 CSS Avatars preview

22 CSS Avatars

22 hand-coded CSS avatars for chat apps, team dashboards, comment threads, account menus, and social profiles. Covers circular and squircle shapes, gradient and conic story rings, hexagon clip-path crops, online status dots, notification count badges, verified checkmarks, stacked facepiles with plus-N overflow, initials fallbacks for users without photos, broken-image recovery, avatar pickers, and a size scale system where the ring, badge, and status dot all scale from a single custom property.

Search CodeFronts

Loading…