Free corner and blob shape builder
Border radius generator with eight grips, not four
Every corner in CSS holds two radii, a horizontal one and a vertical one, and this one costs nothing and asks for no account to put all eight under separate control. Drag the grips around the box, switch between %, px and rem without losing the shape, and read the live overlap factor the browser applies when two radii on one side add up to more than the side is long. The outline leaves as the collapsed CSS shorthand, as a Tailwind rounded-[…] value, or as an SVG path of four elliptical arcs.
- 100% free
- No signup
- 8 independent radii
- Live overlap factor
- CSS, Tailwind, SVG
Drag any grip along its edge, or focus one and use the arrow keys — Shift moves ten at a time. Indigo grips are the horizontal radii, orange the vertical ones.
The same declaration on two other boxes
Percentages resolve against each box, so the outline keeps its proportions and the corners change size.
Top-left
drawn at 96 × 72 px
Top-right
drawn at 224 × 72 px
Bottom-right
drawn at 224 × 168 px
Bottom-left
drawn at 96 × 168 px
Overlap factor f = 1.000 — no side is over-subscribed, so the browser draws all eight radii at the values above.
Output
rounded-[30%_70%_70%_30%_/_30%_30%_70%_70%]
Full eight-value form: 30% 70% 70% 30% / 30% 30% 70% 70%
SVG path for the same outline
M 96 0 H 96 A 224 72 0 0 1 320 72 V 72 A 224 168 0 0 1 96 240 H 96 A 96 168 0 0 1 0 72 V 72 A 96 72 0 0 1 96 0 Z
Four arc commands at 320×240px, with the overlap factor already folded in — paste it into an SVG, Figma or Illustrator when the shape has to leave the browser.
Press Ctrl+V anywhere on the page to drop in a border-radius declaration to load all eight radii back into the grips — no need to click the field first.
How to generate a border radius
Three steps from a rectangle to a shorthand a stylesheet, a Tailwind class or a vector editor can take.
Size the box before you round it
Set the width and height sliders to something close to the element you are actually styling, because a percentage radius is measured against those two numbers — horizontally against the width, vertically against the height. A shape tuned on a 320×240 preview and pasted onto a 96px avatar will not look the same, and the two small copies under the preview show you the difference at 56×56 and 160×72 before it surprises you in the layout.
Drag the grips, one per radius
Each grip slides along the edge its radius runs down, so the top edge carries the two horizontal radii of the top corners and the left edge carries the two vertical radii of the left corners. Tick “Separate vertical radii” and four grips become eight — that checkbox is the slash in the shorthand, and it is the difference between a rounded rectangle and a blob. Random blob fills all eight so that each pair on a side adds to 100%, which is the arrangement where the curves meet with no straight run left between them; arrow keys nudge a focused grip by 1, Shift by 10.
Take the shape out in whichever form you need
Copy CSS gives the collapsed shorthand — four values become one when they agree, and the slash is dropped when both axes match, exactly as you would hand-write it. Copy Tailwind wraps the same value as rounded-[…] with underscores where the spaces were. Download SVG rebuilds the outline as a path of four elliptical arcs at the current pixel size, with the overlap factor already applied, for the moment the shape has to exist outside a stylesheet. The field under the buttons runs the other way too: type or paste a declaration and all eight grips jump to it.
Technical specifications
| Radii under control | 8 — a horizontal and a vertical semi-axis for each of the four corners; the vertical set collapses into the horizontal one when the slash is switched off |
|---|---|
| Units | %, px and rem. Percentages resolve horizontally against the box width and vertically against its height; rem is converted at the 16px root default |
| Accepted range | Sliders run 0-100% or 0 to the matching box side in px; typed and pasted values are taken up to 200% and 9,999px, and any negative value is refused because one of them invalidates the whole declaration |
| Overlap correction | f = min(side length ÷ sum of the two radii on that side) across all four sides, per CSS Backgrounds and Borders 3 §5.5, applied to all eight radii and displayed to three decimals |
| Preview box | 80px to 520px on each axis, plus fixed 56×56 and 160×72 copies carrying the same declaration so a percentage shape can be judged at two other sizes |
| Output formats | 3 — the collapsed CSS shorthand, a Tailwind arbitrary value in rounded-[…] form with underscores for spaces, and an SVG path of four elliptical arc commands |
| CSS input | Paste or type any border-radius declaration: 1 to 4 values per side, one slash, %, px, rem or em, with mixed units resolved to px against the current box rather than rejected |
| Downloaded file | A single SVG under 400 bytes, built in the tab from a blob URL, with your fill color and no comment or attribution added to it |
Frequently asked questions
How do I get a pill button when I do not know how tall it will be?
Put an absurdly large length on every corner — 9999px is the convention — and let the overlap rule solve it for you. The browser scales the radii down until no side is over-subscribed, so 9999px on a 200×48 button resolves to exactly 24px per corner and re-resolves correctly the moment the label wraps to a second line. Using 50% instead looks identical on a short button and wrong on a wide one: 50% of a 400px width is a 200px horizontal radius against a 24px vertical one, so the ends flatten into stretched ellipses rather than staying semicircular.
Why does 50% give me an oval instead of a circle?
Because the two axes of a percentage radius resolve against different dimensions: horizontal radii are a percentage of the border box's width, vertical radii a percentage of its height. On the 320×240 default here, 50% means 160px across and 120px down, and a corner whose semi-axes differ is a quarter of an ellipse by definition. A true circle needs either a square box or an absolute length equal to half the shorter side.
What does the slash in a border-radius value actually do?
It separates the four horizontal radii, written before it, from the four vertical radii, written after it. Every corner is really two lengths — border-top-left-radius on its own takes both — so the complete form is eight numbers, a b c d / e f g h, corners running clockwise from top-left on each side of the slash. Omit the slash and both axes take the same number, every corner becomes a quarter-circle, and the shape can only ever be a rounded rectangle; that single omission is why most generators cannot draw a blob.
I increased one corner and all four shrank. What happened?
The overlap correction is global, not per corner. CSS Backgrounds and Borders Level 3 §5.5 says that if the two radii sharing any one side add up to more than that side is long, the browser computes f as the smallest ratio of side length to radius sum across all four sides, then multiplies every one of the eight radii by f. So a bottom-left corner set past the width of the box drags the top two corners down with it. The panel here prints f live, which is usually the fastest way to work out why a value you typed is not the value being drawn.
Why is the image inside my rounded card still square?
border-radius clips the element's own background, border and box-shadow, and nothing belonging to its children. Add overflow: hidden — or overflow: clip, which does the same without creating a scroll container — to the rounded parent, or give the img the same radius directly. Safari has a long-standing habit of leaking square corners when the clipped child is transformed or animated; forcing the parent onto its own layer with isolation: isolate, or masking it with -webkit-mask-image: -webkit-radial-gradient(white, black), is the usual repair.
Can I animate or transition border-radius?
Yes — the eight radii interpolate independently, so a transition between two very different shorthands morphs corner by corner and axis by axis, and mixing px with % works anywhere calc() interpolation is supported. It costs a repaint on every frame, though, because the corner geometry changes rather than the compositing: one hero blob breathing over 12 seconds is free, forty list rows doing it on hover is where the frame budget goes. Animating the shape on a decorative pseudo-element keeps the repaint off the element carrying your text.
What radius should the element nested inside a rounded card have?
Outer radius minus the distance between the two edges, floored at 0 — a 16px card radius with 8px of padding wants 8px inside it. Concentric curves that share a centre look right; two curves of the same radius at different offsets read as a mistake even when nobody can say why. The browser already applies this rule to borders on its own: the inner edge of a 6px border inside a 4px radius is drawn square, because the subtraction went negative.
About the eight numbers behind a rounded corner
border-radius is a shorthand twice over. It stands for four longhand properties, one per corner, and each of those longhands takes two lengths of its own: the horizontal semi-axis of the corner's ellipse and the vertical one. That is where the slash comes from. Everything before it is the four horizontal radii, everything after it the four vertical ones, corners clockwise from top-left on both sides, and the one-, two- and three-value shortcuts fill in exactly as margin does — with the three-value case copying bottom-left from top-right. When the two radii of a corner are equal you get a quarter circle and a rounded rectangle; when they differ you get a quarter ellipse, and four mismatched quarter ellipses are what an organic blob shape actually is. Nothing else in CSS produces that outline as cheaply, which is why the syntax is worth learning rather than approximating it with a clip-path polygon.
The rule that catches people is the overlap correction in CSS Backgrounds and Borders Level 3 §5.5. Radii are allowed to be any non-negative length, including lengths longer than the box, so the specification has to say what happens when two curves on the same side would cross. It takes the ratio of each side's length to the sum of the two radii sitting on that side, picks the smallest of the four ratios, and if it is below 1 multiplies every radius on the element by it. Two things follow. The correction is global, so an over-large bottom corner visibly shrinks the top ones — the factor is printed here for that reason. And the familiar 9999px pill trick is not a hack at all: it is the correction resolving 9999px down to exactly half the shorter side, which is why it survives a change of height that a hard-coded 24px would not. Percentages are the other trap, because the horizontal ones measure against the border box width and the vertical ones against its height, so 50% on anything but a square is an ellipse.
Where the four-slider generators mislead is not the missing slash alone — it is that they hide the geometry. A shape shown on one fixed box, in one unit, with no factor and no way back from a value you already have, tells you nothing about how it will behave when the element resizes. The radius also does more than round the element: it clips the background, so a ramp from the gradient generator follows the curve to the pixel and the declaration for it lands next to this one in the CSS gradient generator; it reshapes the border box, so a shadow from the box shadow generator traces the same curve without being told about it. Two shapes stay out of reach: a concave notch, which needs clipping, and the small solid triangles behind tooltips and dropdowns, which are still built out of collapsed borders in the CSS arrow generator. When the radius is one property of a control rather than the shape itself, assemble it with padding, color and states in the CSS button generator instead.
Where the outline is drawn
Every number on this page is worked out by JavaScript running in the tab you are reading it in. Nothing you type, paste or open is uploaded, logged or kept, which is also why the tools carry on working after you disconnect from the network.
Download SVG builds the file from the path string in this tab and hands it to the browser through a blob URL that is revoked immediately afterwards, so the shape is never rendered on a server and no copy of it exists outside your downloads folder.