CSS inverted border radius
Everybody knows how to make rounded borders, it's right there in the CSS3 spec. Ever wondered how to do borders with radius inverted in pure CSS? I was facing this challenge a while ago and I just wanted to share the results.
You start off witht this HTML structure
<div class="outer">
<div class="inner">
<i class="top left"></i>
<i class="top right"></i>
<div class="content"></div>
<i class="bottom right"></i>
<i class="bottom left"></i>
</div>
</div>
<small>As you can see it takes quite a few extra DOM elements to achieve this.</small>
The following CSS will do the trick
.outer {
overflow: hidden;
}
.inner {
border: 1px solid #888;
}
.inner i {
width: 40px;
height: 40px;
border: 1px solid #888;
border-radius: 50%;
background-color: #fff;
}
.inner .top {
margin-top: -20px;
}
.inner .bottom {
margin-top: -20px;
margin-bottom: -22px;
}
.inner .left {
float: left;
margin-left: -20px;
}
.inner .right {
float: right;
margin-right: -20px;
}
.content {
min-height: 80px;
}
You can control the border radius by changing the width and the height of the .inner i
and adjust the margins accordingly, which is half of the width/height. Except the margin-bottom fo the .bottom
element needs to be substracted by twice the number of pixles of the .inner
border thickness which is this case is 2px. 1px on top and 1px on the bottom.
One thing to note about this is that you will need a solid background color of the parent container. As you can see the .inner i
has a backgournd-color set, so this won't work if you are placing this on a background image or a gradient.
You can see the results at the bottom our Jobs page: https://layer.com/jobs
Written by Nil Gradisnik
Related protips
6 Responses
Like for the clever tip and the clever recruiting tactic. Genius on two levels.
this is amazing stuff - many thanks for the tip!
You could use :before
and :after
with content: "";
instead of the four extra i
elements (then you would only need outer
and inner
(and you might even be able to get rid of one of them if content
could stand in for either of them).
Ha. We all spent forever using this technique for rounded corners, until border-radius finally arrived and we threw off our <div class="top left corner">
shackles.
Freedom! ...now then, I feel like this element could really use some some inverted rounde.... ah crap.
@svieira That was actually my first thought. But you can only apply only one :before
and :after
per element so I'm not sure that would work. And you need the .outer
because of the overflow: hidden
. I'd love to see your solution in action though.
Absolutely clever trick. Thanks for posting that. I may have to try that out on my next site.