Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pure CSS Speech Bubble with Border

Tags:

css

So I'm working on a pure css speech bubble http://bit.ly/zlnngM but I'd like to have the border surround the entire speech bubble as seen here http://bit.ly/zUgeZi . I'm using the following markup;

<div class="speech-bubble"><p>This is a speech bubble created using only CSS. No images to be found here...</p></div

and I've so far styled it as follows;

.speech-bubble {
margin: 3em;
width: 320px;
padding: 10px;
background-color:rgba(250, 250, 250, 0.95);
color: #666;
font: normal 12px "Segoe UI", Arial, Sans-serif;
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
border-radius: 10px;
border: 10px solid rgba(0,0,0,0.095);
}

.speech-bubble:before
{
content: "";
border: solid 20px transparent; /* set all borders to 10 pixels width */
border-top: 0; /* we do not need the top border in this case */
border-bottom-color:rgba(250, 250, 250, 0.95);
width: 0;
height: 0;
overflow: hidden;
display: block;
position: relative;
top: -30px; /* border-width of the :after element + padding of the root element */
margin: auto;
}

.speech-bubble p {
margin-top: -15px;
font-size: 1.25em;
}

As you can see I can only add a border to the content box (.speech-bubble) but not the callout (.speech-bubble:before) My border will also need to be transparant. Not sure if this matters but it's something to bear in mind. Any advice?

like image 685
Jedda Avatar asked Jan 17 '12 14:01

Jedda


1 Answers

You're pretty close. You just need to use both a :before and an :after to layer another triangular border.

Here's a jsfiddle: http://jsfiddle.net/rgthree/DWxf7/ and the CSS used:

.speech-bubble {
    position:relative;
    width: 320px;
    padding: 10px;
    margin: 3em;
    background-color:#FFF;
    color: #666;
    font: normal 12px "Segoe UI", Arial, Sans-serif;
    -moz-border-radius: 10px;
    -webkit-border-radius: 10px;
    border-radius: 10px;
    border: 10px solid rgba(0,0,0,0.095);
}
.speech-bubble p {
    font-size: 1.25em;
}

.speech-bubble:before,
.speech-bubble:after {
    content: "\0020";
    display:block;
    position:absolute;
    top:-20px;  /* Offset top the height of the pointer's border-width */
    left:20px;
    z-index:2;
    width: 0;
    height: 0;
    overflow:hidden;
    border: solid 20px transparent;
    border-top: 0;
    border-bottom-color:#FFF;
}
.speech-bubble:before {
    top:-30px; /* Offset of pointer border-width + bubble border-width */
    z-index:1;
    border-bottom-color:rgba(0,0,0,0.095);
}
like image 69
rgthree Avatar answered Sep 28 '22 18:09

rgthree