ToollyX
no sign-up · instant · free

Button Style Generator

Design a button with a genuinely interactive preview — the generated CSS, hover state and all, is applied directly to the button you're editing. Independent normal and hover styling, optional gradients, and nine ready-made presets. Runs entirely in your browser.

STATESNormal + Hover
PRESETS9 built-in
PREVIEWReal CSS, live
PROCESSEDBrowser-local
UPLOADNone needed
728 × 90 — Leaderboard Ad
Hover and click the button above — the preview uses real CSS states, not a simulation
CSS Output
Presets
Text & Shape
Label
Font
Weight
Uppercase
Font Size15px
Padding X24px
Padding Y12px
Radius8px
Border0px
Colors
Background
Text
Shadow Y2px
Shadow Blur8px
Shadow Color
Gradient background
Use a two-color gradient instead of a flat background
Press effect
Add a subtle scale-down on :active for tactile feedback
Preview disabled state
Show how the button looks with the disabled attribute
Real Hover, Not a Simulated One
Most button generators fake the hover preview with JavaScript. This one injects the exact generated CSS — including :hover, :active and :disabled — into the page, so hovering and clicking the preview button shows precisely what the copied code will do, with independent Normal/Hover color editing and nine ready-made presets.
728 × 90 — Leaderboard Ad

Designing a Button That Feels Responsive, Not Just Styled

  • Change more than one property on hover. A background shift alone reads as flat; pairing it with a small shadow increase and a 1-2px upward lift is what makes a button feel like it's physically responding to the cursor.
  • Keep the press effect subtle. A 3-5% scale-down on :active is enough to register as tactile feedback — anything larger starts to look like a bug rather than a deliberate interaction.
  • Test the disabled state at the same zoom level as everything else. Opacity-based disabling can look identical to a slightly muted normal button if the contrast drop isn't checked directly against its own enabled version.
  • Reserve gradients for one clear call-to-action per screen. A gradient button next to several solid ones reads as the primary action; a page where every button is gradient loses that signal entirely.

Features

Real interactive preview
Hover and click the actual button — no simulated states, just real CSS.
Independent hover styling
Background, text, shadow, lift and scale all customizable separately from normal.
Optional gradients
Switch any solid background to a two-color gradient with one toggle.
Tactile press effect
A subtle :active scale-down for genuine click feedback.
Nine ready-made presets
Primary, Outline, Ghost, Gradient, Pill and more, ready to adjust.
100% browser-based
Every value is computed client-side — nothing about your button ever leaves the page.

A Preview That Can't Lie About What the CSS Does

The usual way a button generator shows a hover state is to fake it — swap a class with JavaScript on mouseenter, or render a second static "hover preview" box next to the normal one. Both approaches can quietly drift from what the actually-exported CSS produces, since the preview and the output are two separate code paths that happen to agree today. This generator injects the literal generated stylesheet — the same :hover, :active and :disabled rules that get copied — directly onto the preview button, scoped to its own class. Hovering the button on this page runs the browser's real pseudo-class matching, not a simulation of it, which means what's seen here is exactly, not approximately, what ships.

This matters most for exactly the details that are easiest to get subtly wrong by hand: a transition that only animates background-color while a shadow change jumps instantly, or a hover state whose text color technically passes contrast but looks slightly off against the new background it was never actually checked against. Because the preview and the export are the same CSS, catching that kind of mismatch happens naturally while adjusting sliders, rather than after pasting the code into a real project and noticing the hover looks different than expected.

Normal and Hover Are Two Genuinely Separate Decisions

Treating hover as "the normal state, but darker" is a reasonable starting instinct, but it undersells how much a hover state actually needs to communicate on its own — that the element is interactive, that the cursor is currently over it, and ideally that clicking it will do something worth doing. That's three separate signals riding on one CSS rule, which is why the strongest hover states usually combine a color shift with a shadow change and a small position shift rather than relying on any single property alone. Editing Normal and Hover as two independent tabs here, rather than one shared color with an auto-darken slider, is what makes it possible to design a hover state that does more than restate the same button slightly dimmer.

Outline and Ghost buttons make the case for independent editing even more directly: their hover state usually isn't a darker version of the normal state at all, it's a completely different treatment — a transparent background filling in solid, or a colored border appearing where there wasn't one before. An auto-darken approach has no sensible way to derive "transparent becomes solid green" from a single base color, because that transformation isn't a variation on one value, it's a structurally different rule. That is exactly the gap a two-state model closes.

728 × 90 — Leaderboard Ad

The Details That Separate a Demo Button From a Real One

A button styled to look disabled but still clickable is worse than one that's neither, because it actively signals the wrong thing to a user. This generator's disabled preview uses the real HTML disabled attribute, not a CSS class pretending to be disabled — which means it also inherits the browser's own default behavior of blocking clicks and removing the element from the normal tab order, on top of whatever visual dimming the exported CSS applies. A button that only looks disabled via styling but is missing the actual attribute remains fully clickable and focusable, which is a subtle but real accessibility gap worth checking for directly rather than assuming a muted color automatically implies the control is inert.

Type carries a similar amount of easy-to-underrate weight. A label set in a normal 400 weight can visually recede into surrounding body text, especially at a smaller size, which is why most real interface buttons sit somewhere between 500 and 700 — heavy enough to read as a distinct, tappable element rather than a sentence fragment. Uppercase text paired with slightly widened letter-spacing is a common pattern for compact buttons specifically because all-caps at normal spacing can look cramped and harder to scan; opening the spacing up by even half a pixel per character noticeably improves that without needing a larger font size. Neither of these replaces good color contrast or an obvious shape — they're the layer that decides whether a technically-correct button also feels honest and effortless to use, not just correct on paper.

From a Tuned Preview to a Component Library Entry

A typical path: start from Primary or whichever preset is closest to an existing brand color, adjust the hover tab until the lift and shadow feel right against the live preview, then decide whether Press Effect and a Disabled variant are needed for this specific button's real use — a form's submit button almost always needs both, a purely decorative link button usually needs neither. From there the exported CSS is close to production-ready as a single reusable .button class; matching its accent color against an existing design token, or building the corner shape further with the border radius generator for anything more distinctive than a standard rounded rectangle, are the two most common next steps before it goes into a real component library.

It's also worth building the full set a real product actually needs — primary, secondary and destructive variants at minimum — rather than perfecting one button in isolation and copy-pasting it three times with the background swapped. Running each variant through the same Normal/Hover/Disabled checklist individually catches the inconsistencies that tend to surface only once several buttons sit next to each other on a real page: a destructive button whose hover lift is noticeably smaller than its sibling's, or a secondary variant whose disabled state reads as barely different from its normal one.

Verified by ToollyX Team · Last updated July 2026

Frequently Asked Questions

728 × 90 — Leaderboard Ad

Related Tools