How can I draw a box around text with SVG?

前端 未结 2 742
谎友^
谎友^ 2020-12-09 17:48

How can I create a box (rect?) that resizes itself to fit the the text inside of it using SVG?

相关标签:
2条回答
  • 2020-12-09 18:37

    Sorry the answer took me so long, but I was learning how to use ECMAScript with an XML DOM.

    Alright. So suppose you have your document structure like so:

    <svg
     xmlns="http://www.w3.org/2000/svg"
     xmlns:svg="http://www.w3.org/2000/svg"
     xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
     xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
     version="1.1"
    
     width="800"
     height="600"
     id="example_text">
    
        <g id="layer1">
    
            <text
             x="123.4"
             y="567.8"
             id="text_holder">
    
                <tspan id="tspan1">Text</tspan>
                <tspan id="tspan2">More text</tspan>
    
            </text>
        </g>
        <script type="text/ecmascript">
    
    function create_from_rect (client_rect, offset_px) {
        if (! offset_px) {offset_px=0;}
        var box = document.createElementNS(
            document.rootElement.namespaceURI,
            'rect'
        );
    
        if (client_rect) {
            box.setAttribute('x', client_rect.left - offset_px);
            box.setAttribute('y', client_rect.top - offset_px);
            box.setAttribute('width', client_rect.width + offset_px * 2);
            box.setAttribute('height', client_rect.height + offset_px * 2);
        }
    
        return box;
    }
    
    function add_bounding_box (text_id, padding) {
        var text_elem = document.getElementById(text_id);
        if (text_elem) {
            var f = text_elem.getClientRects();
            if (f) {
                var bbox = create_from_rect(f[0], padding);
                bbox.setAttribute(
                    'style',
                    'fill: none;'+
                    'stroke: black;'+
                    'stroke-width: 0.5px;'
                );
                text_elem.parentNode.appendChild(bbox);
            }
        }
    }
    
    add_bounding_box('text_holder', 5);
    
    </script>
    </svg>
    

    Adding the <script> tag at the bottom of the root <svg> element causes it to execute after it's created the DOM structure above it, just like JavaScript on a web page.

    0 讨论(0)
  • 2020-12-09 18:37

    Would the following approach make things any simpler?

        var text_elem = document.getElementById(text_id);
        var bbox = text_elem.getBBox();
    

    and then use bbox's width and height to draw a rect?

    0 讨论(0)
提交回复
热议问题