javascript – Svg(snapsvg)创建一个讲话泡泡

我正在创建一个聊天程序,屏幕上的一些数字正在与其他人聊天.

我需要完成这个项目的最后一件事就是当一个人说出一些可以放入可扩展的讲话泡泡的东西时.

由于我是使用SVG的新手,这是我的第一个真正的“游戏”项目,我想“让我们使用一些CSS来确保它正确缩放”

所以我做了以下CSS:

.bubble {
    background-color: #eee;
    border: 2px solid #333;
    border-radius: 5px;
    color: #333;
    display: inline-block;
    font: 16px/24px sans-serif;
    padding: 12px 24px;
    position: relative;
}
.bubble:after,.bubble:before {
    border-left: 20px solid transparent;
    border-right: 20px solid transparent;
    border-top: 20px solid #eee;
    bottom: -20px;
    content: '';
    left: 50%;
    margin-left: -20px;
    position: absolute;
}

/* Styling for second triangle (border) */

.bubble:before {
    border-left: 23px solid transparent;
    border-right: 23px solid transparent;
    border-top: 23px solid;
    border-top-color: inherit; /* Can't be included in the shorthand to work */
    bottom: -23px;
    margin-left: -23px;
}

但遗憾的是,这没有用.我后来发现这是因为SVG不支持所有CSS属性.所以现在我有点失落?我不太确定如何在SVG中创建可扩展的语音气泡,我希望你们中的一个人能够指出我正确的方向.

SVG路径我试过:

我设法创建了一个非常小的SVG路径但是我不确定如何使它更大并使其充满文本:

var mesasgeBox = chatSvg.path("M 200.444444444444446,200v-6h10.444444444444446v6h-4l-3.1111111111111107,1.6222222222222236l0.11111111111111072,-1.6222222222222236Z");

解决方法

下面的源需要一个位置(x / y)来知道出现的位置和文本换行的最大宽度.它是作为插件编写的,因此您可以轻松使用它.我没有对它进行优化,可以通过使用font-size缓存字母宽度来提高性能.
字体包装代码基于此解决方How to either determine SVG text box width,or force line breaks after ‘x’ characters?

请使用您喜欢的气泡布局替换插件内的纸张.

Snap.plugin(function (Snap,Element,Paper,glob) {
     Paper.prototype.bubbletext = function (x,y,txt,maxWidth,attributes) {

        var svg = Snap();
        var abc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.";
        var preText = svg.text(0,abc);
        preText.attr(attributes);
        var letterWidth = (preText.getBBox().width / abc.length);
        svg.remove();

        var words = txt.split(" ");
        var widthCalc = 0,activeLine = 0,lines=[''];
        for (var letterCount = 0; letterCount < words.length; letterCount++) {

           var l = words[letterCount].length;
           if (widthCalc + (l * letterWidth) > maxWidth) {
              lines.push('');
              activeLine++;
              widthCalc = 0;
           }
           widthCalc += l * letterWidth;
           lines[activeLine] += words[letterCount] + " ";
        }

        var padding = 10;

        var t = this.text(x+padding,y+15+padding,lines).attr(attributes);

        t.selectAll("tspan:nth-child(n+2)").attr({
           dy: "1.2em",x: x+padding
        });

        var BoxHeight = t.node.clientHeight + (padding * 3);
        var messageBox = this.path("M " + (x-padding) + "," + (y-padding+BoxHeight) + "v-" + BoxHeight + "h" +  (t.node.clientWidth + (padding*3)) + "v"+BoxHeight+"h-6l-9,15l0,-15Z");
        messageBox.attr({
            fill:"rgba(0,255,.3)"
        });
        t.before(messageBox);
        return t;
     };
  });

var div = document.querySelector('div.wrap');
var bubble = Snap('100%','100%').attr({ viewBox: '0  0 200 200' });;
bubble.bubbletext(0,"Hallo Mike how are you. These text is auto wraped and the bubble size automaticaly. The svg result is also scaleable. Please change this text to test.",155,{ "font-size": "15px","fill": "#000"});
div.appendChild(bubble.node);

CODEPEN

UPDATE

将您的气泡布局添加到codepen示例中.

更新2我更新源示例.

相关文章

事件冒泡和事件捕获 起因:今天在封装一个bind函数的时候,发现el.addEventListener函数支持第三个参数...
js小数运算会出现精度问题 js number类型 JS 数字类型只有number类型,number类型相当于其他强类型语言...
什么是跨域 跨域 : 广义的跨域包含一下内容 : 1.资源跳转(链接跳转,重定向跳转,表单提交) 2.资源...
@ &quot;TOC&quot; 常见对base64的认知(不完全正确) 首先对base64常见的认知,也是须知的必须有...
搞懂:MVVM模式和Vue中的MVVM模式 MVVM MVVM : 的缩写,说都能直接说出来 :模型, :视图, :视图模...
首先我们需要一个html代码的框架如下: 我们的目的是实现ul中的内容进行横向的一点一点滚动。ul中的内容...