A CSS play / pause button is the toggle that starts and stops media playback in a player UI. These 18 hand-coded designs are ready-to-ship controls for audio players, podcast apps, video players, and music UIs — copy the markup, wire your media handler, and ship.
A play triangle that morphs into two pause bars via SVG path interpolation. The icon never disappears — it transforms — which feels meaningfully more premium than a hard swap.
A miniature vinyl record. While playing it spins continuously; on pause the rotation slows to a stop with a subtle ease-out — the canonical music-app metaphor done as a single CSS button.
Three vertical bars that animate height while playing and freeze instantly when paused. Doubles as both a button and a "now playing" indicator — perfect for podcast and audio UIs.
Full media-control cluster with previous, play/pause and next buttons. The central button uses a morph icon with a gradient halo while playing — the canonical pattern for music players and podcast apps.
A continuous waveform travels across the button while playing and freezes mid-cycle on pause. Built with an SVG path + CSS transform — perfect for audio players and music-streaming UIs.
Concentric halo rings emanate outward while playing — a soft pulse that signals "live" or "active" without distraction. Ideal for radio streams, live broadcasts, and listen-now CTAs.
iOS-style sliding toggle — but for play/pause. The thumb glides between two icons inside a single rounded track. Reads instantly as a state-bearing control, not just a button.
Stacked neon-cyan glow with monospace label. The play / pause icon sits inside a glowing ring that pulses while playing — synthwave 80s arcade vibes for gaming, retro media, and dev tools.
Refined outline-only button with a hairline border and subtle hover lift. The icon morphs cleanly between play and pause — an editorial, restrained pattern for content-heavy sites.
A `@property`-animated conic gradient rim that rotates while playing — true CSS angle animation, not a keyframes hack. Feels like a turntable or a high-end audio interface dial.
Record-style red button with a tiny live waveform indicator. The waveform animates while playing back; freezes when paused. Specifically tuned for voice notes, podcasts, and dictation UIs.
Material-style floating action button with elevation that lifts on hover and presses down on click. The icon morphs between play and pause — a polished pattern for full-screen video and tutorial overlays.
A circular play button wrapped by an SVG progress ring that fills as audio plays. Tick the percentage from your real <code>timeupdate</code> events — gold/cream palette suited to podcast and audiobook UIs.
A play button whose icon subtly drifts toward the cursor on hover — a small touch of physicality that signals an interactive surface. Click to play; the icon morphs and the magnet effect releases.
Organic blob shape that morphs its border-radius on play — like a droplet of mercury reshaping itself. Mint-fresh palette for wellness and meditation apps.
Material-style ink ripple that emanates from the click point on every press. Click feedback that reads as tactile instantly — a subtle but premium detail.
Skeumorphic mini-cassette with two reels that rotate while playing and freeze instantly on pause. Warm tactile detail for retro music players, lo-fi radio apps, and nostalgic brand moments.
Live-broadcast pill with a breathing background and a tiny presence dot. Click to join — the dot starts pinging, the gradient shifts to "on-air" warm red. Perfect for live podcasts, watch-parties, and Twitch-style streams.
A single button type=button with aria-pressed reflecting the playing state, and an aria-label that updates between Play and Pause. A single toggle button beats two separate buttons because it's exactly one tap target, one keyboard focus stop, and one screen-reader announcement.
How do I morph a play icon into a pause icon in pure CSS?
Two reliable techniques: (1) two SVGs stacked — fade/scale one out and the other in via :checked or aria-pressed; or (2) a single SVG path with the d attribute animated via CSS — newer browsers support transition on path d. The first works everywhere; the second feels more premium.
Should a play button keep animating while paused?
No. The visual rule is: motion = playing, stillness = paused. Spinning vinyl freezes, equaliser bars flatten, waveforms stop mid-cycle. This is what users expect and it's the strongest single signal of state.
Are these accessible to keyboard and screen-reader users?
Yes. Each demo is a real button with aria-pressed, an updating aria-label, and a visible focus state. Continuous animations honour prefers-reduced-motion. The toggle works with Space and Enter keys, and screen readers announce both the role and the current state.
Do these play / pause buttons work in any framework?
Yes. Plain HTML, CSS and (where used) vanilla JS — no dependencies. Drop into React, Vue, Svelte, Astro or plain HTML; bind your own click handler to start/stop your audio or video element. MIT licensed.