2012-12-07 34 views
8

में मल्टीलाइन एसवीजी टेक्स्ट अक्ष टिक्स मैं एक्स-अक्ष पर अक्ष टिक्स के रूप में प्रत्येक बार के लिए एक लेबल के साथ एक सरल बार ग्राफ प्रस्तुत करने का प्रयास कर रहा हूं। लंबे समय तक एक दूसरे पर चलने वाले लेबल। चूंकि svg टेक्स्ट तत्व शब्द-रैपिंग का समर्थन नहीं करते हैं, इसलिए मैं वैकल्पिक समाधानों की तलाश में हूं।डी 3

उचित <tspan> तत्वों को शामिल करने के लिए लेबल में जाने वाले श्रेणी टेक्स्ट को बदलना पाठ काम नहीं करता है क्योंकि पाठ आंतरिक HTML के रूप में सेट नहीं है बल्कि केवल तत्व का कच्चा पाठ है। मैंने पाठ को हटाने और लेबल को बदलने के लिए लेबल्स को पोस्ट-प्रोसेसिंग भी माना है, लेकिन मुझे अभी तक ऐसा करने का एक शानदार तरीका नहीं मिला है।

दुर्भाग्य से मैं विदेशी ऑब्जेक्ट का उपयोग नहीं कर सकता क्योंकि मुझे आईई 9 समर्थन की आवश्यकता है, लेकिन वही मार्कअप प्रतिस्थापन समस्याएं उस समाधान पर लागू होंगी, वैसे भी।

क्या किसी ने इस समस्या को अतीत में हल किया है या कोई सुझाव है?

+0

बहुत समान http://stackoverflow.com/questions/12677878/change-svg-text-to-css-word-wrapping –

+1

दो महत्वपूर्ण अंतर: 1. चूंकि डी 3 टिक लेबल उत्पन्न कर रहा है, इसलिए मैं आसानी से उनके मार्कअप को प्रतिस्थापित नहीं कर सकता (जैसा कि प्रश्न में बताया गया है)। 2. आईई 9 समर्थन की कमी के कारण मैं विदेशी वस्तु का उपयोग नहीं कर सकता (प्रश्न में जोड़ देगा)। –

+0

क्या आप एक उदाहरण पोस्ट कर सकते हैं कि आप टेक्स्ट को कैसे बढ़ा रहे हैं? – Duopixel

उत्तर

5

आप माइक Bostock द्वारा this example में के रूप में मैन्युअल रैपिंग कर सकते हैं:

function wrap(text, width) { 
    text.each(function() { 
    var text = d3.select(this), 
     words = text.text().split(/\s+/).reverse(), 
     word, 
     line = [], 
     lineNumber = 0, 
     lineHeight = 1.1, // ems 
     y = text.attr("y"), 
     dy = parseFloat(text.attr("dy")), 
     tspan = text.text(null).append("tspan").attr("x", 0).attr("y", y).attr("dy", dy + "em"); 
    while (word = words.pop()) { 
     line.push(word); 
     tspan.text(line.join(" ")); 
     if (tspan.node().getComputedTextLength() > width) { 
     line.pop(); 
     tspan.text(line.join(" ")); 
     line = [word]; 
     tspan = text.append("tspan").attr("x", 0).attr("y", y).attr("dy", ++lineNumber * lineHeight + dy + "em").text(word); 
     } 
    } 
    }); 
} 

vis.selectAll(".tick text") 
    .call(wrap, 100);