Creé un Árbol en D3.js basado en el Node-link Tree de Mike Bostock. El problema que tengo y que también veo en Mike's Tree es que la etiqueta de texto se superpone/solape a los nodos circulares cuando no hay suficiente espacio en lugar de extender los enlaces para dejar algo de espacio.¿Cómo evitar la superposición de elementos de texto en TreeMap cuando se abren elementos secundarios en D3.js?
Como nuevo usuario, no tengo permitido subir imágenes, así que aquí hay un link en Mike's Tree, donde puede ver las etiquetas de los nodos precedentes solapando los siguientes nodos.
He intentado varias cosas para solucionar el problema mediante la detección de la longitud de píxeles del texto con:
d3.select('.nodeText').node().getComputedTextLength();
Sin embargo, esto sólo funciona después de que procesa la página cuando necesito la longitud del elemento de texto más largo antes de que yo hacer.
conseguir el artículo texto más largo antes de que el procesamiento con:
nodes = tree.nodes(root).reverse();
var longest = nodes.reduce(function (a, b) {
return a.label.length > b.label.length ? a : b;
});
node = vis.selectAll('g.node').data(nodes, function(d, i){
return d.id || (d.id = ++i);
});
nodes.forEach(function(d) {
d.y = (longest.label.length + 200);
});
sólo se devuelve la longitud de la cadena, mientras que el uso de
d.y = (d.depth * 200);
hace que todos los eslabones de una longitud estática y no cambia de tamaño tan hermoso cuando nuevos nodos se abren o cierran.
¿Hay alguna manera de evitar esta superposición? Si es así, ¿cuál sería la mejor manera de hacer esto y mantener la estructura dinámica del árbol?
Hay 3 posibles soluciones que puede llegar a, pero no son tan sencillas:
- La detección de longitud de la etiqueta y el uso de una elipse donde se desborda nodos secundarios. (lo que haría que las etiquetas sean menos legibles)
- escalando el diseño dinámicamente al detectar la longitud de la etiqueta y diciendo a los enlaces que se ajusten en consecuencia. (lo cual sería mejor pero parece realmente difícil
- escala el elemento svg y utiliza una barra de desplazamiento cuando las etiquetas comienzan a ejecutarse. (No estoy seguro de que esto sea posible ya que he estado trabajando suponiendo que el SVG necesita tener un establecer alto y ancho)
Wow, lo siento, tardó tanto tiempo en responder, pero no lo vi hasta ahora. Al final, nunca terminé solucionando este problema, pero gracias por su respuesta. Veré si puedo encontrar el código anterior e intento solucionar el problema. – alengel