
Sticky Footer to Bottom of Page (Flexbox & CSS Grid)
position:fixed, no calc(100vh - 180px), no JavaScript measuring anything. Both the Grid and the Flexbox recipe are wired to a live switch so you can watch them behave identically.Published
25 hand-coded CSS footer designs for SaaS marketing pages, e-commerce storefronts, agency portfolios, documentation sites, mobile apps, and local business sites. Covers sticky-to-bottom flexbox, responsive 4-column, SaaS mega footer, e-commerce with payment icons, SOC 2 / GDPR / HIPAA compliance badges, embedded Google Maps + office hours, mobile-first collapsible accordion, newsletter signup, animated SVG wave, and language + currency switcher. 16 Pure CSS + 9 Light JS. Scoped under .ft-NN for no-collision pasting, prefers-reduced-motion guarded, framework-agnostic.
Related22 CSS Headers31 CSS Hero Sections8 CSS Navbar Designs20 CSS Social Buttons

position:fixed, no calc(100vh - 180px), no JavaScript measuring anything. Both the Grid and the Flexbox recipe are wired to a live switch so you can watch them behave identically.Published

repeat(auto-fit, minmax()) track definition. The markup is the accessible version most templates get wrong — each category is its own <nav> named by its own visible heading, so screen-reader users can jump straight to Support instead of wading through forty links.Published

Published

text-underline-offset rather than a fake border.Published
currentColor so the whole rail re-themes with one token. No image sprites, no 12 network requests for card logos, no blurry PNGs on a retina display.Published

color-scheme plus the light-dark() function, so a single token list serves both themes with no duplicated [data-theme="dark"] block. Three states, because "follow my system" is a real preference and a two-state toggle silently overrides it.Published

Published

<details> so it works before a single byte of JavaScript loads, with a genuinely smooth height animation using the 0fr → 1fr grid technique.Published
Published

Published

background-position. Roughly 1KB, no images, no canvas, and it stops dead under prefers-reduced-motion.PublishedUpdated

break-inside and text-wrap are doing their jobs. The one place columns beats Grid — flowing content, not a fixed matrix.PublishedUpdated

PublishedUpdated

tel:, mailto:, a map URL) with a copy-to-clipboard shortcut for the times a visitor is on a desktop and wants the address, not a dialer. The card grid reflows on its own; the hover tilt is transform-only.PublishedUpdated

git log for fun: everything set in a monospace grid measured in ch, an ASCII rule, a blinking block caret, and a build stamp that makes the site feel like a deployed artefact rather than a page. Restrained, fast, and no ASCII-art clichés.PublishedUpdated

<audio> element with the four lines shown in the notes.PublishedUpdated

text-shadow at four radii for the classic tube bloom, a flicker on a steps() curve that stutters like a failing ballast, and — the part most neon demos get wrong — body copy that stays at full contrast so the footer is still legible.PublishedUpdated

PublishedUpdated

subgrid so every column's heading, list and secondary link sit on the same baselines even when the lists are different lengths. This is the one layout problem plain auto-fit grids cannot solve — and subgrid solves it in two lines.PublishedUpdated

PublishedUpdated

clip-path.PublishedUpdated

<details> disclosure, smooth panel animation, deep-linkable answers, and the JSON-LD you need for FAQPage.PublishedUpdated

PublishedUpdated

Intl.NumberFormat — including the placement, separators and symbol conventions each locale expects. Native selects, correct lang and hreflang attributes, RTL-safe layout.PublishedUpdated

preserveAspectRatio is set to slice.PublishedUpdated
display: flex; flex-direction: column; min-height: 100vh on the body/wrapper with flex: 1 on the main content, OR display: grid; grid-template-rows: 1fr auto; min-height: 100vh on the body wrapper. Both approaches are Pure CSS, zero JavaScript, framework-agnostic. Fixed footers (position: fixed; bottom: 0) belong to specific UI patterns — mobile bottom tab bars, cookie consent banners, urgent CTAs — NOT to standard site footers. A fixed site footer fights every modal, overlay, and mobile keyboard the browser puts up; the sticky-to-bottom pattern is what visitors expect.display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: clamp(24px, 3vw, 48px) on the footer's column container. The auto-fit + minmax combo lets columns reflow from 4-across on desktop → 2 on tablet → 1 on mobile without a single media query. Demo 02 (Responsive 4-Column Footer with Category Links) is the canonical implementation. Approach 2 (progressive disclosure — Demo 08, Mobile-First Collapsible Accordion Footer): keep the multi-column layout on desktop but wrap each column heading in a <details><summary> that becomes clickable ONLY under a mobile breakpoint via @media (max-width: 640px) { summary { pointer-events: auto } } — dense footers like Amazon, Airbnb, and Booking.com use this pattern because 6 columns of 8 links each = 48 links crammed above the fold on mobile, which is worse than 6 collapsed drawers. Both approaches ship WCAG-2.2-AA-compliant focus rings on interactive elements.currentColor or fill: var(--brand). Avoid the classic 2010s pattern of loading a payment-icons sprite PNG (extra HTTP request, blurry on retina) or fetching from a CDN (third-party request, blocks LCP). For SSL / security badges: link out to the actual certificate authority's badge page if you must show them, but the trust signal from a McAfee SECURE seal is genuinely lower today than five years ago — clean site design + real testimonials + real return policy language outperforms trust seals in every 2024-2026 conversion study. Instead of legacy seals, prioritize a real return policy link, a real customer service phone/email, and Trustpilot / Google Reviews integration.<details> with the column heading in <summary>, then use @media (min-width: 641px) { .footer details { pointer-events: none } .footer details[open] summary::after, .footer summary::after { display: none } .footer details > :not(summary) { display: block !important; height: auto !important; overflow: visible !important; } } to force-open the details on desktop while suppressing the disclosure caret. Under 641px, native <details> gives you keyboard-accessible expand/collapse for free — Space/Enter opens, Escape closes (browser-native), screen readers announce the disclosure state. Zero JavaScript needed. The pattern Amazon, Airbnb, Booking.com, Wayfair, and Shopify all use because it survives graceful degradation and works with keyboard-only users on the first tab..ft-NN selector, every keyframe, every custom property is framework-agnostic. What changes is where you put the markup. React: extract the footer markup into src/components/Footer.jsx and import from your root layout / page template. Next.js App Router: app/(marketing)/layout.tsx imports and renders <Footer />. Vue 3: single-file component <template><footer class="ft-01">...</footer></template>. Svelte / SvelteKit: src/routes/+layout.svelte renders <Footer />. Astro: src/components/Footer.astro imported by src/layouts/BaseLayout.astro. For any interactive footer (Demo 06 dark-mode toggle, Demo 08 mobile accordion, Demo 13 newsletter signup, Demo 20 contact form, Demo 22 FAQ accordion, Demo 24 language switcher, Demo 25 wave animation), strip the IIFE wrapper from the demo's JS and call the init function from your framework's mount hook (useEffect in React, onMounted in Vue, onMount in Svelte). Next.js App Router requires 'use client' at the top of components that use browser APIs like localStorage or window listeners. Tailwind CSS: the pattern is mechanical translation of each .ft-NN class to utility classes, plus custom-property tokens registered in your @theme block. For fastest ports, wrap the whole footer in a scoped class and paste the demo CSS as-is inside a @layer components block.<footer>, which is a landmark role screen readers announce as "content info". Navigation regions inside the footer use <nav aria-label="Footer navigation"> so a screen reader user hearing multiple nav landmarks can distinguish them. Icon-only social links carry aria-label="Follow us on Twitter" (never bare icons). Form inputs in newsletter captures pair every <input> with a real <label> — either visible or visually hidden via clip-path: inset(50%) when the visual design demands a placeholder-only field. All interactive elements show a visible :focus-visible ring at 2px minimum thickness and 3:1 contrast against the surrounding background per WCAG 2.4.13 (Focus Appearance, Level AA, added Oct 2023). Hit targets meet the WCAG 2.5.5 44×44 CSS pixel minimum. Every animation (wave motion, gradient drift, hover effects) is wrapped in @media (prefers-reduced-motion: reduce) { animation: none } so the ~15% of adults with vestibular disorders + the ~35% who self-report motion sensitivity don't get nauseated by the footer. Contrast ratios on link text meet the WCAG 1.4.3 4.5:1 minimum in both light and dark themes. Language switchers (Demo 24) correctly update the <html lang="..."> attribute via JS so screen readers pronounce the right language.15 hand-coded CSS aspect-ratio demos for video embeds, product galleries, IAB ad slots, native dialogs, and CLS-safe placeholders: 16:9 iframe YouTube embed with click-to-load facade + up-next rail, 21:9 full-screen hero video with min-height/max-height:100svh guardrails + Ken Burns drift, 1:1 Instagram-style square grid with 2×2 feature tile, 4:3 magazine card image cover, 9:16 vertical stories rail (TikTok/Reels/Shorts pattern) with scroll-snap + segment bars, 4:5 apparel product image gallery with radio-driven state + 1:1 thumbnails, 1:1 zoom thumbnail carousel with pointer-tracked --zx/--zy magnifier, prevent-layout-shift placeholder with live PerformanceObserver CLS meter (before/after side-by-side lab), dynamic content fallback with three policies (bend/strict/auto) via :has() toggle, IAB ad banner slots (728×90 leaderboard, 300×250 medium rectangle, 300×600 half-page, 320×50 mobile) with skeletons + container-query mobile swap, responsive modal dialog sized min(92vw, 88svh×16/9, 1080px) with @starting-style animation, responsive OpenStreetMap iframe wrapper with 16:9 → 1:1 container-query narrow swap, media query orientation live HUD + resize:both container-ratio playground, object-fit logo cloud with contain/cover/fill switcher via :has(), and side-by-side padding-top hack (height:0 + padding-top:56.25%) → modern aspect-ratio migration comparison with live ratio picker. 11 truly Pure CSS + 4 with a tiny optional vanilla JS snippet (facade swap, pointer magnifier, CLS meter, native dialog). Every demo is scoped under a unique .car-NN prefix so it drops into any project without CSS collisions, ships prefers-reduced-motion guards, and is framework-agnostic (works as-is in React, Vue, Svelte, Astro, Next.js, Remix, or plain HTML).
6 production CSS bento grid layouts with 12 hand-coded designs — Apple-style product showcase, SaaS feature value-prop matrix, analytics dashboard overview, creative portfolio, e-commerce category hub, and link-in-bio social hub. Each topic ships 2 sub-variants side-by-side so visitors see both a keynote aesthetic and a paper-doc variant at once. Container queries, CSS Grid, zero dependencies, copy-paste ready.
20 hand-coded CSS blog and editorial layouts for magazine homepages, news sites, personal archives, newsletter back-issues, recipe and podcast blogs, developer tutorials, and long-form journalism. Covers a magazine homepage with hero plus editor-picks rail, a news homepage with breaking-news ticker, blog archives with sticky year separators, Substack-style issue-numbered archives, recipe card grids with prep-time badges, podcast episode lists with waveforms, long-form articles with scroll-driven reading progress, drop caps and floated pull quotes via first-letter, Medium-style 65ch centred reader layouts, dev tutorials with a sticky code panel beside prose, interview transcripts with alternating speakers, case-study pages with stat counters, video blogs with an episode rail, full-bleed photo essays, news articles with sticky related-stories sidebars, documentation pages with prev/next chapter nav, a standalone blog post card, a scroll-snap category filter bar, an inline newsletter callout that breaks out of the prose column, and a horizontal featured-post rail. 12 are pure CSS with zero JavaScript. Every layout is scoped under a .bl-NN prefix for no-collision pasting, guards prefers-reduced-motion, and ports unchanged to React, Vue, Svelte, Astro, Next.js and Tailwind.