Chad J Treadway
Chad J Treadway

Reputation: 422

Pure CSS Rounded Ribbon

I am trying to achieve the below using pure CSS, is it possible? If I can figure out a way to hide the bottom part to the top of the bottom rounded corner that would work. But I am lost at what would work...

Designers Design what I have thus far

.ribbon, .ribbon * {
box-sizing: border-box;
-moz-box-sizing: border-box;
}
.ribbon {
    width: 600px;
    margin: 40px auto 10px;
    padding: 0 10px 4px;
    position: relative;
    color: black;
    background: #eee;
}
.ribbon h3 {
    display: block;
    height: 40px;
    width: 620px;
    margin: 0;
    padding: 5px 10px 5px 30px;
    position: relative;
    left: -30px;
    color: white;
    background: rgb(193,0,0);
    box-shadow: 0 1px 2px rgba(0,0,0,0.3);
}
.ribbon h3::before {
    content: '';
    display: block;
    width: 0;
    height: 0;
    position: absolute;
    bottom: -11px;
    z-index: 10;
    left: 0;
}
.ribbon.round h3 {
    border-radius: 10px 0px 0px 0px;
}
.ribbon.round h3::before {
    width: 20px;
    height: 30px;
    bottom: -20px;
    border: none;
    background: rgb(61,0,0);
    border-radius: 10px 0px 0px 10px;
}

Fiddle to what I have currently http://jsfiddle.net/yoderman94/Gdgwq/

Upvotes: 2

Views: 2507

Answers (3)

aleation
aleation

Reputation: 4844

The fiddle: http://jsfiddle.net/aleation/gCrhQ/

The code:

.ribbon, .ribbon * {
    box-sizing: border-box;
    -moz-box-sizing: border-box;
}
.ribbon {
    width: 600px;
    margin: 40px auto 10px;
    padding: 0;
    position: relative;
    color: black;
    background: #eee;
}
.ribbon h3 {
    display: block;
    height: 40px;
    width: 100%;
    margin: 0;
    padding: 9px 0 0 10px;
    color: white;
    background: rgb(193,0,0);
    box-shadow: 0 1px 2px rgba(0,0,0,0.3);
}
.ribbon h3::before,
.ribbon p::before{
    content: '';
    display: block;
    width: 0;
    height: 0;
    position: absolute;
    bottom: -11px;
    z-index: 10;
    left: 0;
    width: 14px;
}
/* Round */

.ribbon.round h3::before{
    height: 45px;
    top: 0px;
    left: -14px;
    border: none;
    background: rgb(193,0,0);
    border-top-left-radius: 7px 4px;
}

.ribbon.round p::before{
    height: 7px;
    top: 40px;
    left: -14px;
    border: none;
    background: rgb(61,0,0);
    border-top-left-radius: 7px 4px;
    border-bottom-left-radius: 7px 4px;
}

.ribbon p{
    margin: 0;
    padding: 20px;
}

Upvotes: 2

nice ass
nice ass

Reputation: 16719

Simply make your z-index value negative:

.ribbon h3::before {
  z-index: -1;
}

That will place it under the heading.

To keep the rounded top, add another block with lower z-index, and fill it with the same background as the heading:

Example: http://jsfiddle.net/K7e96/

Upvotes: 4

cjd82187
cjd82187

Reputation: 3593

Here's a new fiddle, its like 99% there (only tested in Chrome), need to play with the shadows a bit more. http://jsfiddle.net/jrTAA/2/

.ribbon.round h3 {
    border-radius: 5px 0px 0px 0px;
}
.ribbon.round h3::before, .ribbon.round h3::after {
    width: 20px;
    height: 8px;
    bottom: -8px;
    border: none;
    border-top:2px solid rgb(193,0,0);
    border-left:1px solid rgb(193,0,0);    
    border-bottom:1px solid rgb(193,0,0);    
    background: rgb(61,0,0);
    border-radius: 5px 0px 0px 5px;
    box-shadow: 0 1px 2px rgba(0,0,0,0.3), inset 2px 1px 2px rgba(0,0,0,0.3);
}

Upvotes: 3

Related Questions