You can give any element “rounded corners” by applying a border-radius
through CSS. You’ll only notice if there is a color change involved. For instance, if the element has a background-color or border that is different than the element it’s above.
.element {
border-radius: 10px;
}
Constituent properties
border-radius
is what we call a “shorthand” property. That means it sets the following individual properties in a single declaration:
border-top-left-radius
border-top-right-radius
border-bottom-right-radius
border-bottom-left-radius
Logical properties
Those are referred to as “physical” properties because they set the radius according to the physical location of the corner (e.g. top-left). But border-radius
is part of the Logical Properies and Values specification, meaning it has logical equivalents of the physical properties:
Physical property | Logical property |
---|---|
border-top-left-radius | border-start-start-radius |
border-top-right-radius | border-start-end-radius |
border-bottom-left-radius | border-end-start-radius |
border-bottom-right-radius | border-end-end-radius |
It’s a bit mind-bendy at first, but the order really matters, especially when working with border-radius
as a shorthand. The order goes like this, where the first direction refers to the block direction and the second direction refers to the inline direction.
Physical property | Logical property |
---|---|
top-left | start-start |
top-right | start-end |
bottom-left | end-start |
bottom-right | end-end |
Syntax
border-radius: <length-percentage [0,∞]>{1,4} [ / <length-percentage [0,∞]>{1,4} ]?
- Initial value:
0
- Applies to: all elements
- Inherited: no
- Computed values: pair of computed <length-percentage> values
- Animation: by computed value
The border-radius
property takes between one and four length or percentage values, where one value sets the radius for all four corners at once, while four sets each individual corner.
/* Single value */
/* Sets all four corners */
border-radius: 10px;
/* Two values /*
/* top-left and bottom-right top-right and bottom-left */
border-radius: 25% 0;
/* Three values */
/* top-left top-right/bottom-left bottom-right */
border-radius: 1rem 1.5rem 1.25rem;
/* Four values */
/* top-left top-right bottom-right bottom-left */
border-radius: 8px 10px 12px 14px;
/* Global values */
border-radius: inherit;
border-radius: initial;
border-radius: revert;
border-radius: revert-layer;
border-radius: unset;
So, if we wanted to set a different radius on the top-left and bottom-right but apply the same radius on the top-right and bottom-left together, we can use the three-value syntax:
.element {
/* top-left top-right/bottom-left bottom-right */
border-radius: 5px 20px 5px;
background: #BADA55;
}
/
)
Elliptical rounding (You may also specify the radiuses in which the corner is rounded by. In other words, the rounding doesn’t have to be perfectly circular, it can be elliptical. This is done using a slash (/
) between two values:
.element {
border-radius: 10px / 30px; /* horizontal radius / vertical radius */
}
Note: Firefox only supported elliptical borders in 3.5+. Older WebKit browsers (e.g. Safari 4 and below) incorrectly treat 40px 10px
the same as 40px / 10px
.
Values
The border-radius
property can accept any valid CSS length unit. That means everything from px
, rem
, em
, ch
, vh
, vw
, and a whole bunch more are fair play.
You may specify the value of border-radius
in percentages. This is particularly useful for creating a circle or ellipse shape, but can be used any time you want the border-radius
to be directly correlated with the element’s width.
.element {
border-radius: 50%;
width: 200px;
}
Note: In Safari percentage values for border-radius
only supported in 5.1+. In Opera, only supported in 11.5+.
Gotchas
There are a few things to watch for when working with the border-radius
property:
Clipped background images
If the element has an image background, it will be clipped at the rounded corner naturally:
.element {
border-radius: 20px;
background: url(bglines.png); /* will get clipped */
}
Background color bleed
Sometimes you can see a background-color
“leak” outside of a border when border-radius
is present (here’s a perfect example). To prevent this you use the CSS background-clip
property:
.element {
border-radius: 10px;
/* Prevent background color leak outs */
-webkit-background-clip: padding-box;
-moz-background-clip: padding;
background-clip: padding-box;
}
Overlapping border radii
Jay Sitter covered what happens when the value of one corner radius is so big that it overlaps the radius of another corner. Like this example, where we’re going for a “pill” shape on the right side with less rounding on the left:
We’re swtting a radius of 40px
on the top-left and bottom-left corners, so why are they so boxy? That’s because the 999em
value of the other two corners is covering them up. Jay digs deep into the math behind this and how to prevent it from happening, so it’s worth reading his article for more context.
Demo
Browser support
This browser support data is from Caniuse, which has more detail. A number indicates that browser supports the feature at that version and up.
Desktop
Chrome | Firefox | IE | Edge | Safari |
---|---|---|---|---|
4* | 3* | 9 | 12 | 3.1* |
Mobile / Tablet
Android Chrome | Android Firefox | Android | iOS Safari |
---|---|---|---|
123 | 124 | 2.1* | 3.2* |
It’s unnecessary now, but for the absolute best possible browser support, you could prefix the property with -webkit-
and -moz-
to ensure legacy browsers can join the fun:
.element {
/* Safari 3-4, iOS 1-3.2, Android 1.6- */
-webkit-border-radius: 12px;
/* Firefox 1-3.6 */
-moz-border-radius: 12px;
/* Opera 10.5, IE 9, Safari 5, Chrome, Firefox 4, iOS 4, Android 2.1+ */
border-radius: 12px;
}
Notice the order of those properties: the vendor prefixes are listed first and the non-prefixed “spec” version is listed last. This is the correct way to do it. Border radius is a particularly good example of why we do it that way. In slightly more complicated version of using border-radius
(where you pass two values instead of one), the older -webkit-
vendor prefix would do something entirely different than the “spec” version. So, if we blindly copy-and-paste the same values to all three properties, we could see different results cross-browser. For the most consistency long-term, it’s best to list the “spec” version last.
It’s pretty realistic these days to drop prefixes and just use vanilla border-radius
, as discussed here.
Here’s each individual property, with vendor prefixes:
.element {
-webkit-border-top-left-radius: 1px;
-webkit-border-top-right-radius: 2px;
-webkit-border-bottom-right-radius: 3px;
-webkit-border-bottom-left-radius: 4px;
-moz-border-radius-topleft: 1px;
-moz-border-radius-topright: 2px;
-moz-border-radius-bottomright: 3px;
-moz-border-radius-bottomleft: 4px;
border-top-left-radius: 1px;
border-top-right-radius: 2px;
border-bottom-right-radius: 3px;
border-bottom-left-radius: 4px;
}
Each of these values can have a space-separated value as well, like 5px 10px
, which behaves the same as a slash-separated value in shorthand (<horizontal-radius>
[space]
<vertical-radius>
).
Nice tutorial!
Is this up to date? I’m not seeing a post-date anywhere.
Anyway. Nice tutorial!
;)
;)
:)
;)
That was really classy.. Tnx
They are not looking alright at all on Android 2.2 and 2.2.1. The default browser.
Your website isn’t even loading hoss
Hello,
I indeed absolutely needed some trick to make the border-radius look smoother on the android browser so I come up with this simple yet effective solution. I just added box-shadow as shown below to my css class:
-webkit-box-shadow: 0 0 1px #000;
The x and y position of the shadow are 0 so the shadow is centered, all wee need is to adjust the blur value expanding it just 1px (in base of need) above the corner edges making them look smoother. Of course the shadow color must be the same as your rounded element’s background/border-color…
There is a small issue just adding this line of code to your css: yes… it will target all -webkit browsers, making the border-radius look ( slightly ) less sharper.
Now, if you are the type of designer that can use small compromises, it should just work for you like this, but if you are a finicking freak like I am, you should absolutely find a way to target your CSS to specific devices.
At the time I’m writing this I didn’t thinked yet at the perfect solution, but you can make good use of media queries limiting the rule wether you use the ‘max-width’ property (to limit the range of devices based on their screen width at least preventing webkit desktop browsers) or the ‘-webkit-device-pixel-ratio’ to target the different android devices based on their pixel density:
@media only screen and (-webkit-device-pixel-ratio:.75){
/*for low density (ldpi) Android layouts */
}
@media only screen and (-webkit-device-pixel-ratio:1){
/*for low density (ldpi) Android layouts */
}
@media only screen and (-webkit-device-pixel-ratio:1.5){
/*for low density (ldpi) Android layouts */
}
Best regard and good designing to everybody. Hope I helped some desperate android border-radius obsessed designer ;)
NIce. Thanks for help :)
If you’re still reading comments, I would love to know why this is not working on my site. I have a drop down menu under “photos” and as can be seen when first hovering the corners are rounded but then they revert back to square corners. I don’t see any errors in the way I’ve formatted the corners and oddly it was working until I changed the border color, then it stopped.
http://danielpaymar.com
css is
mainMenu.ddsmoothmenu ul li ul{
}
Nice tutorial. Aptly explained. You went beyond most other tutorials and explained things others only dream about. Thanks.
that’s some badass you got over there.
nice tut, btw
thanks
Hi ,
I am trying to apply border-radius to div,which have border with gradient color.
But it is not allowing me to apply border-radius.
Below is my code snippet.
.border:nth-child(1) {border-image: -webkit-linear-gradient(#000, #fff) 14% 14% 14% 14% stretch; }
.border{ border-radius:15px; -webkit-border-radius:15px; }
.border {display: inline;float: left;margin: 15px;position: relative;border-width: 20px;width: 160px;height: 160px;}
Lorem Ipsum
how supported IE 6,7,8 Browser.
please post your comments
OMG that green color used in the example is “BADASS” in hex value!!! – #BADA55
Thanks for the tutorial!
Is there any possibility to access the “whitespace” clipped by
border-radius
?f.ex. to change its color to different than the background.
Thanks for another great tutorial!
I just took what I learned and took it a step further to keep rounded corners proportional on responsive images.
A 15 px border radius at 100% on a square image would be
border-radius: 5%
To achieve the same on a 300px x 650px it would be
border-radius: 2.31%/5%
This is calculated by dividing the pixel radius by the width and the height. The corner will be perfectly rounded and stay proportional to the image size when it is scaled.
That is actually what I searched for. Thank you a lot!
Author need to include this comment into article.
Hi Chris, I really appreciate your work and the assistance help you offer. Hope you can help on this one…I am working on round corners for a while and I face a problem with images in the background of a div and round corners with opacity values for the border. It works in firefox but Safari always shows the image up to the outer edge. Do you have an idea how to fix it?
Here is the code:
div { height:250px; width:250px; background-image:url(image.jpg);}
.round {
border-radius: 60px; /* Prevent background color leak outs /
border: 20px solid rgb(18, 50, 51);
border: 20px solid rgba(18, 50, 51, 0.9);
-webkit-background-clip: padding-box;/ for Safari /
-moz-border-radius:360px;/ Firefox – alte Syntax */
}
please just i ask that same css work on background image if that work then how!
Using percentages is perfect for a responsive CSS Circle, but having it break below iOS 5.0 is a problem I’m having.
Is there a good workaround regarding the lack of support for Border Radius Percentages that you noted specifically in relation to responsive website development?
it not woring in IE9
Thank you So much
There is a bug in the Samsung Galaxy S4 default android browser. That the you have to use
instead of
http://stackoverflow.com/questions/17944749/border-radius-style-doesnt-work-in-android-browser
how bout on ie8
Awosome…..Thanks
Fantastic !, thanks.
padding: 5px 0 5px 5px;
width: 100%;
background-color: rgb(73, 180, 31);
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
When I introduce padding in my div, it loses the rounded corner, just shows two rounded corners in the left and the right side corners are left square, how can l display all of my corners rounded?
i see this post in my mobile samsung galaxy y android v.2.3 and all examples look good but when i use the border-radius in my site the image look square i’m confuse i don’t understand what happend, i apply border radius direct to the image element… some idea?
this is my css
img{
-webkit-border-radius:50%;
-moz-border-radius:50%;
border-radius: 50%;
-webkit-box-shadow: 0px 0px 7px 0px rgba(119, 119, 119, 0.5);
-moz-box-shadow: 0px 0px 7px 0px rgba(119, 119, 119, 0.5);
box-shadow: 0px 0px 7px 0px rgba(119, 119, 119, 0.5);
}
Simple and sample.Yeah
Hello
this is working nice, but cannot use border-radius on a canvas element on any Samsung S2 / S4 native browser
Regards,
Iskren
Check out CanIUse.com – it will show what browsers the code will work with and with what versions.
Thank alotzz…
woow
Is there a way to change the border radius based on a keyframe animation? for instance at 20% make the radius 5%, 50% = 20%, 75% = 30%, 100% = 50%…
Hello guy!
I just wanted to thank you guys for your enormous efforts that made Css-tricks into one of the best css and front end development references on the web.
http://mirchu.net/material-design-icons/ its help full for u.. css material design icons
thank you, this is so helpful. xx
Great, and it’s badass color man.
I’m glad I wasn’t the only one who noticed
Now the modern browsers almost support border-radius with single line instead of prefix (-webkit, -moz, -o) and I think we should partially remove prefix for future projects, one more thing that if you are still interested in shape and prefix CSS, let make it easier to set by dropping by my webtool:
http://mystorage.biz/
Then give me your opinion.
Thanks
Thanks a lot. very helpful
Really It’s Super And So Helpful. Thanks
Currently browsing in an Android 2.0.2 native’s browser (this is a really un-updated browser, would not evem handdle any transition at all, bugging most of the pages with an add banner on top). Surprisingly, box shadows seems to work in all cases except when.there’s a percentage value. I will try with the -webkit- prefix and will post if that’s working. Ps: nice read, thanks for the quality content.
I meant border radius, not box shadows :-
Thanks so much!!!!!! :) I used border-radius: 0px 50px 50px 0px; and Work it!
Thank you, it’s great tutorial. You can see the css results by using the border-radius builder on this page: https://css-tools.com/border-radius
I really don’t understand the reasoning for the rules for 2 values. Why not match padding and margins? 2 values = top and bottom.
When we give two values in border-color then first one get applied to top and bottom and second value get
applied to right and left. You have mentioned that wrong. Please check that.
When using border radius some time sharp border shows. how to fix as smooth border?
I have a challenge : Make border-radius scale nicely by a factor relative to the width of the container keeping the circle aspect even on rectangle elements (I mean keeping them from ‘going’ elliptical)
✨ Ana’s got you covered: https://css-tricks.com/various-methods-for-expanding-a-box-while-preserving-the-border-radius/
Hi,
I wonder if there is a way to give a div a border with a pointy end.
So like this:
| \
|______/
Is there a way to do this in HTML?