Jadi inilah yang saya miliki:
<path class="..." onmousemove="show_tooltip(event,'very long text
\\\n I would like to linebreak')" onmouseout="hide_tooltip()" d="..."/>
<rect class="tooltip_bg" id="tooltip_bg" ... />
<text class="tooltip" id="tooltip" ...>Tooltip</text>
<script>
<![CDATA[
function show_tooltip(e,text) {
var tt = document.getElementById('tooltip');
var bg = document.getElementById('tooltip_bg');
// set position ...
tt.textContent=text;
bg.setAttribute('width',tt.getBBox().width+10);
bg.setAttribute('height',tt.getBBox().height+6);
// set visibility ...
}
...
Sekarang teks tooltip saya yang sangat panjang tidak memiliki pemutusan baris, meskipun jika saya menggunakan alert (); ini menunjukkan kepada saya bahwa teks sebenarnya TIDAK memiliki dua baris. (Ini berisi "\" meskipun, bagaimana cara menghapusnya?)
Saya tidak bisa membuat CDATA berfungsi di mana pun.
javascript
svg
newline
line-breaks
sollniss
sumber
sumber
Jawaban:
Ini bukanlah sesuatu yang didukung oleh SVG 1.1. SVG 1.2 memang memiliki
textArea
elemen, dengan pembungkusan kata otomatis, tetapi tidak diterapkan di semua browser. SVG 2 tidak berencana untuk mengimplementasikannyatextArea
, tetapi memiliki teks yang dibungkus otomatis .Namun, mengingat Anda telah mengetahui di mana penggalan baris harus terjadi, Anda dapat memecah teks menjadi beberapa
<tspan>
s, masing-masing denganx="0"
dandy="1.4em"
untuk mensimulasikan baris teks yang sebenarnya. Sebagai contoh:Tentu saja, karena Anda ingin melakukannya dari JavaScript, Anda harus membuat dan memasukkan setiap elemen secara manual ke DOM.
sumber
<tspan>s
? Menggantikan? Membagi?var tspan = document.createElement('tspan') tspan.setAttribute('x','0'); tspan.setAttribute('dy','1.2em'); tspan.textContent = text; tt.appendChild(tspan);
tidak menampilkan teks sama sekali.x=0
adalah koordinat absolut: pindahkan fragmen teks ke sistem koordinat asal saat ini . Thetransform
atribut padag
elemen mendefinisikan saat baru sistem koordinat, dan dengan asumsi bahwa teks yang tersisa-blok, tspan tersebut akan dipindahkan ke sebelah kiri. Ini bertindak seperti instruksi pengembalian kereta.dy=1.2em
adalah koordinat relatif : pindahkan fragmen teks dengan jumlah ini, relatif terhadap fragmen teks saat ini. Ini bertindak seperti instruksi baris-feed. Jika digabungkan, Anda mendapatkan CR / LF.Saya harap Anda sudah berhasil menyelesaikannya, tetapi jika seseorang mencari solusi serupa maka ini berhasil untuk saya:
Ada 3 baris yang dipisahkan dengan linebreak.
sumber
Dengan solusi tspan, katakanlah Anda tidak tahu sebelumnya di mana harus meletakkan jeda baris Anda: Anda dapat menggunakan fungsi bagus ini, yang saya temukan di sini: http://bl.ocks.org/mbostock/7555321
Itu secara otomatis melakukan jeda baris untuk teks panjang svg untuk lebar tertentu dalam piksel.
sumber
Saya pikir ini melakukan apa yang Anda inginkan:
Ini membagi teks
\\\n
dan untuk masing-masing menempatkan setiap fragmen dalam satu tspan. Kemudian menghitung ukuran kotak yang dibutuhkan berdasarkan panjang teks terpanjang dan jumlah baris. Anda juga perlu mengubah elemen teks tooltip agar berisi tiga sendok teh:Ini mengasumsikan bahwa Anda tidak pernah memiliki lebih dari tiga baris. Jika Anda menginginkan lebih dari tiga baris, Anda dapat menambahkan lebih banyak sdt dan menambah panjang loop for.
sumber
"\\\n"
lebih dari itu"\n"
?Saya telah mengadaptasi sedikit solusi dengan @steco, mengalihkan ketergantungan dari
d3
kejquery
dan menambahkanheight
elemen teks sebagai parametersumber
gunakan HTML, bukan javascript
sumber