Skip to main content

Useful JavaScript libraries

Static doesn't mean boring. Once your HTML is served, client-side JavaScript can give your site smooth animations, interactive maps, live charts, rich forms, confetti on payment success, or a client-side search bar — without a single server to maintain.

This page is a curated list of battle-tested, modern JavaScript libraries that pair well with a Flexweg site. Every one of them works by dropping a <script> tag from a free CDN — no build tooling, no npm, no bundler required (though you can use them that way too if you prefer).

How to use any of these

The minimal recipe works for almost every library listed below:

index.html
<!-- In <head> or at the end of <body> -->
<script src="https://cdn.jsdelivr.net/npm/LIBRARY@VERSION/dist/LIBRARY.min.js"></script>

<script>
// Your code using the library
</script>

Replace LIBRARY@VERSION with the right package name and version. Free CDNs that host them: jsDelivr, unpkg, esm.sh.

Pin the version

npm/swiper@11 is safer than npm/swiper (which always serves the latest — so a breaking release can ship your site a broken version overnight). Pick a version when you integrate, bump intentionally.


Animation & motion

GSAP

The industry-standard animation engine — now 100% free for everyone (including commercial use) since early 2025. Used by Apple, Netflix, Nike for their marketing sites. Hand-tunes every property, supports timelines, easings, stagger, ScrollTrigger (scroll-driven animations), morph SVG paths — basically anything you can dream of animating.

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/gsap.min.js"></script>
<script>
gsap.to('.hero', { y: -20, duration: 0.8, ease: 'power2.out' });
</script>

When to reach for it: hero animations, scroll-driven storytelling, complex sequences, morphing shapes.

Motion

The successor to Framer Motion's vanilla build — modern, tiny (~3 KB minified for the core), Web Animations API under the hood. Simpler to learn than GSAP if you don't need its raw power.

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/motion.min.js"></script>
<script>
Motion.animate('.card', { scale: 1.05 }, { duration: 0.3 });
</script>

When to reach for it: micro-interactions, hover effects, page transitions with small bundles.

Lottie Web

Plays After Effects animations as JSON in the browser. Your designer exports a .lottie or .json file from After Effects (via the Bodymovin plugin) — you drop it into a <lottie-player> element and it plays, scalable, vectorial, crisp on every screen.

<script src="https://unpkg.com/@lottiefiles/lottie-player@latest/dist/lottie-player.js"></script>
<lottie-player src="https://assets.lottiefiles.com/packages/lf20_success.json"
background="transparent" speed="1" loop autoplay></lottie-player>

When to reach for it: polished success animations, illustrations, icon transitions, onboarding flows.

Scroll & interactions

Lenis

Buttery-smooth scrolling that respects accessibility. Unlocks the "award-winning site" feel (think Awwwards) in a few lines. Pairs beautifully with GSAP's ScrollTrigger.

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/lenis.min.js"></script>
<script>
const lenis = new Lenis();
function raf(time) { lenis.raf(time); requestAnimationFrame(raf); }
requestAnimationFrame(raf);
</script>

When to reach for it: portfolios, agency sites, long-scroll landing pages.

AOS — Animate On Scroll

The lowest-effort way to add "fade in on scroll" reveals. You add data-aos="fade-up" attributes to your HTML and AOS does the rest. No JavaScript to write.

<link href="https://unpkg.com/[email protected]/dist/aos.css" rel="stylesheet">
<script src="https://unpkg.com/[email protected]/dist/aos.js"></script>

<div data-aos="fade-up">I fade in when you scroll to me</div>

<script>AOS.init();</script>

When to reach for it: marketing sites that need reveals without hand-coding them.

UI components & reactivity

Alpine.js

A reactive JavaScript framework that lives inside your HTML attributes — 15 directives, ~15 KB, no build step. Think "Vue.js for the 95% of sites that don't need a SPA".

<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/cdn.min.js"></script>

<div x-data="{ open: false }">
<button @click="open = !open">Toggle menu</button>
<nav x-show="open">…menu items…</nav>
</div>

When to reach for it: dropdowns, modals, tabs, toggles, counters — anywhere you'd otherwise write repetitive addEventListener + DOM updates.

HTMX

Swap HTML fragments from the server into your page on any user interaction — no JSON, no templating in JS, no frontend framework. Turn your static site dynamic by pointing at an API that returns HTML. Pairs well with serverless functions that return <div> fragments.

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/htmx.min.js"></script>
<button hx-get="/api/more-items" hx-swap="beforeend" hx-target="#list">
Load more
</button>
<ul id="list"></ul>

When to reach for it: load-more buttons, live form validation, dynamic partials without building a frontend framework.

Swiper

The most capable slider/carousel on the web. Touch-friendly, responsive, supports virtualization for huge lists, parallax, coverflow, you name it. Every major e-commerce and media site uses it.

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css">
<script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"></script>

<div class="swiper">
<div class="swiper-wrapper">
<div class="swiper-slide">Slide 1</div>
<div class="swiper-slide">Slide 2</div>
</div>
</div>

<script>new Swiper('.swiper', { loop: true, autoplay: { delay: 3000 } });</script>

When to reach for it: image carousels, testimonials, hero slideshows, product galleries.

Floating UI

The modern replacement for Popper.js — the physics engine behind every well-behaved tooltip, popover, dropdown, autocomplete on the web. Worth pairing with Tippy.js for one-line tooltips.

<script src="https://unpkg.com/@popperjs/core@2"></script>
<script src="https://unpkg.com/tippy.js@6"></script>
<script>tippy('#my-button', { content: 'Hello!' });</script>

When to reach for it: any UI that needs to position itself smartly next to another element without overflowing the viewport.

Forms

Flatpickr

A lightweight, touch-friendly, keyboard-accessible date picker. Works as a drop-in upgrade for <input type="date"> in browsers where that's still ugly.

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/flatpickr.min.css">
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/flatpickr.min.js"></script>
<input id="date">
<script>flatpickr('#date', { dateFormat: 'Y-m-d' });</script>

Choices.js

A prettier <select> — searchable dropdowns, multi-select with tags, async options. Vanilla JS, no jQuery.

Just-Validate

Declarative client-side form validation without writing regexes or error-handling boilerplate. Works with any form, any framework, any style.

Data visualisation

Chart.js

The quickest way to render clean, responsive, animated charts — line, bar, pie, doughnut, radar, polar. 8 chart types, sensible defaults, great documentation. If you just need a chart, this is it.

<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
<canvas id="sales"></canvas>
<script>
new Chart('sales', {
type: 'bar',
data: { labels: ['Jan','Feb','Mar'], datasets: [{ data: [5,12,8] }] },
});
</script>

Apache ECharts

When Chart.js hits its ceiling. Sophisticated financial charts, 3D visualizations, geo maps, huge-dataset performance. Pays back its extra learning curve if you need serious charts.

D3.js

The ultimate low-level data-viz toolkit. D3 doesn't render for you — it gives you data binding, scales, shapes, axes, force layouts, and leaves the rendering to SVG/Canvas/WebGL. Reach for it when you're building custom visualizations nothing else offers.

Maps

Leaflet

The standard for open-source interactive maps. ~40 KB, works with OpenStreetMap tiles (free, no API key), supports markers, popups, GeoJSON layers, clustering. Used by 100k+ sites.

<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css">
<script src="https://unpkg.com/[email protected]/dist/leaflet.js"></script>
<div id="map" style="height: 400px;"></div>
<script>
const map = L.map('map').setView([48.8566, 2.3522], 13);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map);
L.marker([48.8566, 2.3522]).addTo(map).bindPopup('Paris');
</script>

MapLibre GL

A vector-tile map renderer, the open-source fork of Mapbox GL JS. Pick this when Leaflet's raster tiles aren't smooth enough — smoother zoom, rotatable 3D maps, better styling.

Media

PhotoSwipe

A gorgeous, accessible image lightbox — responsive, zoomable, keyboard-navigable, touch-swipeable. Replaces old libraries like Lightbox or Fancybox with a modern, framework-free implementation.

Plyr

A beautiful, accessible HTML5 video/audio player. Consistent look across browsers, custom controls, captions, chapter markers, playlist support. Works with YouTube, Vimeo and raw files.

Vidstack

The newer generation of media player — built on web components, works with HLS/DASH streaming, analytics-friendly, very customizable UI.

Utilities

Day.js

A 2 KB drop-in replacement for Moment.js — 97% smaller, same API. Parse, format, manipulate, compare dates without shipping 70 KB to your users.

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dayjs.min.js"></script>
<script>
console.log(dayjs().format('YYYY-MM-DD'));
console.log(dayjs('2026-04-23').fromNow()); // "a month ago"
</script>

Fuse.js

Fuzzy search over a JavaScript array in ~5 KB. Perfect for client-side search boxes that match partial matches and typos without a backend. Great companion when your dataset is small (< ~1000 items) — for bigger datasets see MiniSearch.

canvas-confetti

The best-in-class confetti library — physics-based particles, shapes, colors, runs on a single canvas. Use it on a purchase confirmation page, a form-submit success, a milestone reached.

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/confetti.browser.min.js"></script>
<script>confetti({ particleCount: 150, spread: 70, origin: { y: 0.6 } });</script>

jsPDF

Generate PDF files client-side from JavaScript — invoices, reports, certificates, event tickets. No server required, the PDF is built in the browser and offered as a download.

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jspdf.umd.min.js"></script>
<script>
const doc = new jspdf.jsPDF();
doc.text('Hello, PDF!', 10, 10);
doc.save('hello.pdf');
</script>

html2canvas

Screenshot any DOM element into a <canvas> — export a business card, a meme, a chart as a PNG. Pairs with jsPDF for "print this section" features.

Performance

vanilla-lazyload

Lazy-load images, videos, iframes and backgrounds with the native IntersectionObserver — keeps above-the-fold snappy on image-heavy pages. Tiny, framework-free.

Use native lazy loading first

Modern browsers support <img loading="lazy"> out of the box. Reach for vanilla-lazyload only when you need things native loading can't do — background images, iframes, CSS-scoped effects.

Pairing these with Flexweg

Everything on this page works out of the box on a Flexweg-hosted site. None of them need a backend, an API key, or a build step. Drop the <script> tag, write a few lines of JS, deploy. For more advanced patterns (proxying secret keys, pulling dynamic data), see:

Where to find more

Static sites can do 95% of what a full app can do, and every library above proves it.