Search code examples
cssshapescss-shapes

Create a bell shape with CSS


I am playing with shapes in css and want to make a traditional bell shape (think Christmas bell). Here's the general shape that I'm going for (though I really don't care about the balls on the top and bottom):

enter image description here

Here's what I have so far:

http://jsfiddle.net/bhlaird/NeBtU/

#bell { 
  left:300px;
    position: relative;
}
#bell:before, #bell:after {
    position: absolute;
  content: "";
    left: 50px; top: 0;
    width: 180px;
    height:400px;
    background: #d3d3d3;
    border-radius: 150px 150px 150px 20px;
    -webkit-transform: rotate(15deg);
    -webkit-transform-origin: 0 0;
}
#bell:after { 
    left: 0; 
    -webkit-transform: rotate(-15deg); 
    -webkit-transform-origin:100% 0;
    border-radius: 150px 150px 20px 150px;
}

But, I'm not sure how to get that curved look on the side and bottom. Any help would be appreciated.

EDIT: I've gotten closer by applying a radial-gradient to #bell:before and #bell:after. This gives me the curve on the side, now I just need the curve on the bottom. http://jsfiddle.net/NeBtU/2/

#bell {
    left:300px;
    position: relative;
}
#bell:before, #bell:after {
    position: absolute;
    content:"";
    top: 0;
    width: 180px;
    height:400px;
    background: #d3d3d3;
}
#bell:before {
    left: 50px;
    border-radius: 150px 150px 20px 30px;
    -webkit-transform: rotate(15deg);
    -webkit-transform-origin: 0 0;
    transform: rotate(15deg);
    transform-origin: 0 0;
    background: radial-gradient(-50px 250px, 300px 1200px, transparent 20%, #d3d3d3 20%);
    background: -webkit-radial-gradient(-50px 250px, 300px 1200px, transparent 20%, #d3d3d3 20%);
}
#bell:after {
    left: 0;
    -webkit-transform: rotate(-15deg);
    -webkit-transform-origin:100% 0;
    transform: rotate(-15deg);
    transform-origin:100% 0;
    border-radius: 150px 150px 30px 20px;
    background: radial-gradient(230px 250px, 300px 1200px, transparent 20%, #d3d3d3 20%);
    background: -webkit-radial-gradient(230px 250px, 300px 1200px, transparent 20%, #d3d3d3 20%);
}

Solution

  • Have a look at this one,

    jsFiddle DEMO

    result shape

    css

      #bell {
        left:300px;
        top:20px;
        position: relative;
    }
    #bell:before, #bell:after {
        position: absolute;
        line-height:0;
        content:"\2315";
        color:#d3d3d3;
        font-size:100pt;
        text-indent:30px;
        top: 0;
        width: 180px;
        height:300px;
        background: #d3d3d3;
    }
    #bell:before {
        left: 50px;
        border-radius: 150px 150px 20px 30px;
        -webkit-transform: rotate(15deg);
        -webkit-transform-origin: 0 0;
        transform: rotate(15deg);
        transform-origin: 0 0;
        background: radial-gradient(-50px 250px, 300px 1200px, transparent 20%, #d3d3d3 20%);
        background: -webkit-radial-gradient(-50px 250px, 300px 1200px, transparent 20%, #d3d3d3 20%);
    }
    #bell:after {
        left: 0;
        -webkit-transform: rotate(-15deg);
        -webkit-transform-origin:100% 0;
        transform: rotate(-15deg);
        transform-origin:100% 0;
        border-radius: 150px 150px 30px 20px;
        background: radial-gradient(230px 250px, 300px 1200px, transparent 20%, #d3d3d3 20%);
        background: -webkit-radial-gradient(230px 250px, 300px 1200px, transparent 20%, #d3d3d3 20%);
        line-height:550px;
        content:"\25CF";
        color:#d3d3d3;
        font-size:130pt;
        text-indent:-15px;
    }
    

    ya its not exactly same as in the question, but came close.

    EDITED

    jsFiddle DEMO

    enter image description here