18 CSS Play / Pause Button Designs

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.

18 unique buttons 100% copy-paste ready Published
01 / 18
Morph Triangle
Light JS
Morph Triangle — preview
A play triangle that morphs into two pause bars via SVG path interpolation.
02 / 18
Vinyl Record
Light JS
Vinyl Record — preview
A miniature vinyl record.
03 / 18
Equaliser Bars
Light JS
Equaliser Bars — preview
Three vertical bars that animate height while playing and freeze instantly when paused.
04 / 18
Skip Hub
Light JS
Skip Hub — preview
Full media-control cluster with previous, play/pause and next buttons.
05 / 18
Liquid Wave
Light JS
Liquid Wave — preview
A continuous waveform travels across the button while playing and freezes mid-cycle on pause.
06 / 18
Pulse Halo
Light JS
Pulse Halo — preview
Concentric halo rings emanate outward while playing — a soft pulse that signals "live" or "active" without distraction.
Best forradio streams, live broadcasts, and listen-now CTAs.
07 / 18
Toggle Pill
Light JS
Toggle Pill — preview
iOS-style sliding toggle — but for play/pause.
08 / 18
Neon Arcade
Light JS
Neon Arcade — preview
Stacked neon-cyan glow with monospace label.
09 / 18
Minimal Outline
Light JS
Minimal Outline — preview
Refined outline-only button with a hairline border and subtle hover lift.
10 / 18
Gradient Disc
Light JS
Gradient Disc — preview
A `@property`-animated conic gradient rim that rotates while playing — true CSS angle animation, not a keyframes hack.
11 / 18
Voice Memo
Light JS
Voice Memo — preview
Record-style red button with a tiny live waveform indicator.
12 / 18
Floating FAB
Light JS
Floating FAB — preview
Material-style floating action button with elevation that lifts on hover and presses down on click.
Advertisement
13 / 18
Progress Ring
Light JS
Progress Ring — preview
A circular play button wrapped by an SVG progress ring that fills as audio plays.
14 / 18
Magnetic Hover
Light JS
Magnetic Hover — preview
A play button whose icon subtly drifts toward the cursor on hover — a small touch of physicality that signals an interactive surface.
15 / 18
Liquid Drop
Light JS
Liquid Drop — preview
Organic blob shape that morphs its border-radius on play — like a droplet of mercury reshaping itself.
16 / 18
Ripple on Click
Light JS
Ripple on Click — preview
Material-style ink ripple that emanates from the click point on every press.
17 / 18
Cassette Tape
Light JS
Cassette Tape — preview
Skeumorphic mini-cassette with two reels that rotate while playing and freeze instantly on pause.
18 / 18
Live Badge
Light JS
Live Badge — preview
Live-broadcast pill with a breathing background and a tiny presence dot.
Best forlive podcasts, watch-parties, and Twitch-style streams.

Build your own

Tweak the exact look in our visual generators — no signup, instant copy-paste.

FAQ

Frequently asked questions

What's the right HTML for a play / pause button?
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.

Search CodeFronts

Loading…