2012-01-15 29 views
47

Tạo DIV sử dụng CSS để vẽ hình tam giác ở bên trái. Cố gắng áp dụng một hộp bóng đồng nhất cho cả phụ huynh và phần tử giả (xem hình ảnh) và mã.CSS Speech Bubble with Box Shadow

Điều này có khả thi không? Hoặc tôi tốt hơn bằng cách sử dụng hình ảnh biên giới cho điều này?

(Top: Trước khi Shadow, Trung: CSS Box-Shadow, Bottom: mong muốn kết quả)

Elements Before Box-Shadow is added

Elements with box-shadow added

The desired result

.bubble{ 
    height: 200px; 
    width: 275px; 

    opacity: 0; 

    margin-top: 41px; 

    float: right; 

    background-color: #F2F2F2; 

    -webkit-border-radius: 5px; 
    -webkit-box-shadow: 0px 0px 6px #B2B2B2; 
} 

.bubble::after { 
     height: 0px; 
     width: 0px; 

     content: "\00a0"; 

     display: block; 

     margin-left: -10px; 
     margin-top: 28px; 

     border-width: 10px 10px 10px 0; 
     border-style: solid; 
     border-color: transparent #F2F2F2 transparent transparent; 

     -webkit-box-shadow: 0px 0px 6px #B2B2B2; 
    } 

Trả lời

98

Thay vì sử dụng hack hình tam giác, bạn chỉ có thể xoay một div bằng cách sử dụng transform và nhận được box-shadow thực. Vì bạn chỉ muốn bóng ở một bên của div (mặt tam giác có thể nhìn thấy), bạn phải làm cho số blur nhỏ hơn và thấp hơn opacity.

Demo: http://jsfiddle.net/ThinkingStiff/mek5Z/

HTML:

<div class="bubble"></div> 

CSS:

.bubble{ 
    background-color: #F2F2F2; 
    border-radius: 5px; 
    box-shadow: 0px 0px 6px #B2B2B2; 
    height: 200px; 
    margin: 20px; 
    width: 275px; 
} 

.bubble::after { 
    background-color: #F2F2F2; 
    box-shadow: -2px 2px 2px 0 rgba(178, 178, 178, .4); 
    content: "\00a0"; 
    display: block; 
    height: 20px; 
    left: -10px; 
    position: relative; 
    top: 20px; 
    transform:    rotate(45deg); 
     -moz-transform: rotate(45deg); 
     -ms-transform:  rotate(45deg); 
     -o-transform:  rotate(45deg); 
     -webkit-transform: rotate(45deg); 
    width: 20px; 
} 

Output:

enter image description here

+3

@LordVarlin Gần đây tôi đã sử dụng nó cho nút quay lại iPhone vì vậy tôi không phải sử dụng hình ảnh. Để vui hơn, bạn có thể sử dụng 'transform: skew();' để thay đổi góc của tam giác. – ThinkingStiff

+1

Tôi đã xem Fiddle bằng Firefox 14 và nó hiển thị hình chữ nhật thay vì hình tam giác. Tại sao vậy? Chuyển đổi CSS được hỗ trợ trong FF14, phải không? – thomthom

+0

Hóa ra đó là biến đổi skew mà Firefox không thích ... – thomthom

4

Tôi biết Đó là một chút khó khăn nhưng, có vẻ tốt với tôi. Đây là fiddle http://jsfiddle.net/dzfj6/

HTML

<div class="bubble"> 
    <div class="triangle"></div> 
    <div class="border"></div> 
    <div class="content">some content</div> 
</div> 

CSS

.bubble 
{ 
    height: 200px; 
    width: 275px; 
    float:right; 
    margin-top: 41px; 
    margin-left:11px; 
    background-color: #f2f2f2; 
    -webkit-border-radius: 5px; 
    -webkit-box-shadow: 0px 0px 5px #b2b2b2; 
    position:relative; 
    z-index:1; 
} 

.triangle 
{ 
    position:absolute; 
    top:12px; 
    width: 0; 
    height: 0; 
    border-top: 15px solid transparent; 
    border-bottom: 15px solid transparent; 
    border-right: 10px solid #f2f2f2; 
    margin-left:-9px; 
    z-index:3; 
} 
.border 
{   
    position:absolute; 
    top:12px; 
    width: 0; 
    height: 0; 
    border-top: 15px solid transparent; 
    border-bottom: 15px solid transparent; 
    border-right: 10px solid #e0e0e0; 
    margin-left:-10px; 
    z-index:2; 
} 

.content{ 
    padding:10px; 
} 

Thay vì box-shadow, bạn chỉ có thể sử dụng border cho Buble.

-4

Không sử dụng box-shadow.

height: 200px; 
    width: 275px; 
    float:right; 
    margin-top: 41px; 
    margin-left:11px; 
    background-color: #f2f2f2; 
    -webkit-border-radius: 5px; 
    -webkit-box-shadow: 0px 0px 5px #b2b2b2; 
    position:relative; 
    z-index:1; 
7

Đây là một complete working example đầy đủ (S) CSS, với biến cho chiều rộng bóng kích thước mũi và một biên giới không bắt buộc.

Bí quyết là lấy bù trừ và chuyển đổi sang phải để đạt được điểm hoàn hảo và sử dụng overflow:hidden khi cần thiết để cắt mũi bong bóng của bạn (đặc biệt nếu bạn cần viền).

Ví dụ trong câu trả lời ở trên không hiệu quả với chúng tôi vì bóng được cắt và được đặt trên khu vực bong bóng chính.

Giảm cấp độ trong IE7/8.

HTML:

<div class="chat"> 
    <div class="bubble"> 
     <span class='tail'>&nbsp;</span> 
     <p>The path of the righteous man is beset on all sides by the iniquities of the selfish and the tyranny of evil men. Blessed is he who, in the name of charity and good will, shepherds the weak through the valley of darkness, for he is truly his brother's keeper and the finder of lost children.</p><p>And I will strike down upon thee with great vengeance and furious anger those who would attempt to poison and destroy My brothers. And you will know My name is the Lord when I lay My vengeance upon thee.</p> 
    </div> 
</div> 

SCSS:

$shadow_radius = 6px; 
$nose_size = 12px; 
$shadow = 0 1px $shadow_radius #B2B2B2; 
$border = 1px solid #bbb 

.chat { 
    font-family:  sans-serif; 
    font-size:  small; 
} 

.bubble { 
    background-color: #F2F2F2; 
    border-radius: 5px; 
    border:   $border; 
    box-shadow:  $shadow; 
    display:   inline-block; 
    padding:   10px 18px; 
    margin-left:  ($shadow_radius + $nose_size); 
    margin-right: ($shadow_radius + $nose_size); 
    position:   relative; 
    vertical-align: top; 
} 

.tail { 
    position: absolute; 
    top:  $nose_size; 
    left: -($shadow_radius + $nose_size); 
    height: ($shadow_radius + $nose_size); 
    width: ($shadow_radius + $nose_size); 
    overflow: hidden; 
} 
.tail:before { 
    border:   $border; 
    background-color: #F2F2F2; 
    box-shadow:  $shadow; 
    content:   "\00a0"; 

    display:   block; 
    position:   absolute; 
    top:    0px; 
    left:    $nose_size; 
    height:   $nose_size; 
    width:    $nose_size; 
    -webkit-transform: skew(-45deg); 
    -moz-transform: skew(-45deg); 
} 
2

Một giải pháp khác là sử dụng filter: drop-shadow(0 1px 2px rgba(0,0,0,.5)); Nó chỉ đặt cái bóng xung quanh hình dạng đối tượng.