2010-06-08 16 views
11

मैं एक बॉक्स (रेक्ट?) कैसे बना सकता हूं जो एसवीजी का उपयोग कर इसके अंदर के पाठ को फिट करने के लिए स्वयं का आकार बदलता है?मैं एसवीजी के साथ पाठ के चारों ओर एक बॉक्स कैसे आकर्षित कर सकता हूं?

+0

यह भी देखें: http://stackoverflow.com/questions/2938779/svg-scaling-text-to-fit-container –

+0

उस प्रश्न में उल्लिखित व्यूपोर्ट विशेषता का उत्तर यहां दिए गए कुछ भी नहीं है। –

+0

bbox https://bl.ocks.org/mbostock/1160929 – marioosh

उत्तर

7

क्षमा करें, जवाब मुझे इतना लंबा लगा, लेकिन मैं सीख रहा था कि एक XML डोम के साथ ईसीएमएस्क्रिप्ट का उपयोग कैसे करें।

ठीक है। तो तुम इतनी तरह अपने दस्तावेज़ संरचना है लगता है:

<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> 

जड़ <svg> तत्व यह एक वेब पेज पर बाद यह यह ऊपर डोम संरचना बनाई है निष्पादित करने के लिए, बस जावास्क्रिप्ट तरह का कारण बनता है के तल पर <script> टैग को जोड़ने से।

+0

के साथ अच्छा उदाहरण धन्यवाद, मैं आपके उत्तर से बेहद प्रभावित हूं। मुझे उम्मीद से पूरा करने के लिए यह और अधिक काम है। –

+0

मुझे यह जोड़ना चाहिए कि मैंने फ़ायरफ़ॉक्स में प्रदर्शित होने पर यह कोशिश की और यह काम करता है, लेकिन मुझे क्रोम में काम करने में परेशानी हो रही है। – amphetamachine

1

क्या निम्न दृष्टिकोण चीजों को आसान बना देगा?

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

और फिर एक आयत खींचने के लिए बॉक्स की चौड़ाई और ऊंचाई का उपयोग करें?

+0

क्या आप समझा सकते हैं कि इससे यह आसान कैसे होगा? मैं आपके द्वारा प्रदान किए गए कोड का उपयोग कैसे करूं? –

+0

जब तक कि मैं आपको सही ढंग से समझ नहीं पा रहा हूं, आप जो भी करना चाहते हैं वह पाठ के चारों ओर एक आयताकार खींचता है, इसलिए आयत को टेक्स्ट तत्व के एक्स, वाई और बॉक्स की चौड़ाई और ऊंचाई के साथ ही तैयार किया जाना चाहिए। मैंने कोड का परीक्षण नहीं किया है, लेकिन मुझे लगता है कि यह अनुमान लगाएगा कि बीबॉक्स के लिए जांच न करना आवश्यक नहीं होगा। जब मैंने कहा कि मेरा दृष्टिकोण चीजों को सरल बनायेगा तो मैं अत्यधिक आशावादी था; यह नाटकीय रूप से नहीं, बल्कि होगा – JamieJag

संबंधित मुद्दे

 संबंधित मुद्दे