带有箭头的讲话泡泡

我有一个项目,我需要插入语音泡沫/消息框 。 我试图达到的一般形状是这样的:

用箭头或三角形的CSS讲话泡泡

.bubble { height: 100px; width: 200px; border: 3px solid gray; background: lightgray; position: relative; cursor:pointer; } .triangle { width: 0; border-top: 20px solid black; border-left: 20px solid transparent; border-right: 20px solid transparent; cursor:pointer; } 
 <div class="bubble">Speech bubble </div> <div class="triangle"> </div> 

由于透明边框也是可点击的,因此目前不能通过命中testing。

目标

  • 点击框(可点击/可平放的区域)需要坚持形状的边界(这里的透明边框也是可以放置的,使之无效)。

  • 我需要显示形状在各种内容(图像,gradents,文字…),

问题

我在操作这个形状时遇到的主要问题是:

  • 能够根据指向元素的位置(上/左/右/下侧) 移动气泡周围的三angular形,
  • 当需要强调时,在其周围添加边框或框阴影

有没有解决这些问题?

为了实现这一点,你应该考虑改变你的标记,以使您的html更高效。 这可以使用伪元素来实现。 我会逐一解决每个问题,并在我的回答结束时将其完全放在一起。

首先,

使用伪元素来避免额外的元素

你可以使用伪元素去除多余的.triangle div。 这不仅可以减less你的div数量,还可以帮助定位,因为你可以使用top: left: right:bottom: css属性来根据你的主要元素进行定位。 这可以在下面看到:

 .oneAndOnlyDiv { height: 100px; width: 200px; border: 3px solid gray; background: lightgray; position: relative; } .oneAndOnlyDiv:before { content: ""; position: absolute; top: 100%; left: 20px; width: 0; border-top: 20px solid black; border-left: 20px solid transparent; border-right: 20px solid transparent; } 
 <div class="oneAndOnlyDiv">Main div</div> 

SVG

这不会通过命中testing,因为透明边框也是可点击的

这可以使用svg中的指针事件来完成。
pointer-events:visibleFill; 只会select有涂料的部分。

这个例子使用filter_box-shadow,IE不支持。
也使用两种形状。

 html, body { margin: 0; padding: 0; } .bubble { width: 150px; height: 150px; -webkit-filter: drop-shadow(5px 5px 0px #aaa); filter: drop-shadow(5px 5px 0px #aaa); } .bubble-shape { fill: #1e1; } .shape-text { color: black; } 
 <svg class="bubble" viewBox="0 0 110 110" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="none"> <g class="bubble-shape" style="cursor:pointer; pointer-events:visibleFill;"> <rect x="10" y="10" width="90" height="90" rx="15" ry="15" /> <polygon points="20,94 40,94 30,105" /> </g> </svg>