Então aqui está o que eu tenho:
<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 ...
}
...
Agora, meu texto de dica de ferramenta muito longo não tem quebra de linha, mesmo que eu use alert (); isso me mostra que o texto realmente TEM duas linhas. (Porém, ele contém um "\", como faço para removê-lo?)
Não consigo fazer o CDATA funcionar em lugar nenhum.
javascript
svg
newline
line-breaks
Sollniss
fonte
fonte
Respostas:
Isso não é algo compatível com o SVG 1.1. O SVG 1.2 possui o
textArea
elemento, com quebra automática de linha, mas não é implementado em todos os navegadores. O SVG 2 não planeja implementaçãotextArea
, mas possui texto com quebra automática .No entanto, dado que você já sabe onde as quebras de linha devem ocorrer, você pode quebrar seu texto em vários
<tspan>
s, cada um comx="0"
edy="1.4em"
para simular linhas reais de texto. Por exemplo:Obviamente, como você deseja fazer isso a partir do JavaScript, terá que criar e inserir manualmente cada elemento no DOM.
fonte
<tspan>s
? Substituir? Dividido?var tspan = document.createElement('tspan') tspan.setAttribute('x','0'); tspan.setAttribute('dy','1.2em'); tspan.textContent = text; tt.appendChild(tspan);
não mostrar nenhum texto.x=0
é uma coordenada absoluta: move o fragmento de texto para a origem do sistema de coordenadas atual . Otransform
atributo nog
elemento define um novo sistema de coordenadas atual e, supondo que o texto esteja alinhado à esquerda, o tspan é movido para a esquerda. Isso funciona como uma instrução de retorno de carro.dy=1.2em
é uma coordenada relativa : move o fragmento de texto por esta quantidade, em relação ao fragmento de texto atual. Isso funciona como uma instrução de alimentação de linha. Combinado, você obtém um CR / LF.Suponho que você já conseguiu resolvê-lo, mas se alguém está procurando uma solução semelhante, isso funcionou para mim:
Existem 3 linhas separadas por quebra de linha.
fonte
Com a solução tspan, digamos que você não saiba com antecedência onde colocar as quebras de linha: você pode usar esta função bacana, que encontrei aqui: http://bl.ocks.org/mbostock/7555321
Isso faz quebras de linha automaticamente para texto longo svg para uma dada largura em pixel.
fonte
Eu acho que isso faz o que você quer:
Ele divide o texto
\\\n
e, para cada um, coloca cada fragmento em um tspan. Em seguida, ele calcula o tamanho da caixa necessária com base no comprimento mais longo do texto e no número de linhas. Você também precisará alterar o elemento de texto de dica de ferramenta para conter três tspans:Isso pressupõe que você nunca tenha mais de três linhas. Se você quiser mais de três linhas, pode adicionar mais tspans e aumentar o comprimento do loop for.
fonte
"\\\n"
ao invés de"\n"
?Adaptei um pouco a solução de @steco, mudando a dependência de
d3
parajquery
e adicionando oheight
do elemento de texto como parâmetrofonte
use HTML em vez de javascript
fonte