tooltips tip pagex event chart bar javascript svg d3.js tooltip

javascript - tip - mouseover d3 v4



¿Cómo agregar una información sobre herramientas a un gráfico svg? (3)

Tengo una serie de rectángulos svg (usando D3.js) y quiero mostrar un mensaje al pasar el ratón, el mensaje debe estar rodeado por un cuadro que actúa como fondo. Ambos deberían estar perfectamente alineados entre sí y con el rectángulo (arriba y centrado). ¿Cuál es la mejor manera de hacer esto?

Intenté agregar un texto svg usando los atributos "x", "y", "ancho" y "alto", y luego anteponer un svg rect. El problema es que el punto de referencia para el texto está en el medio (dado que quiero que esté alineado centrado usé text-anchor: middle ), pero para el rectángulo es la coordenada superior izquierda, además quería un poco de margen alrededor del texto lo que lo hace un poco doloroso

La otra opción era usar un div html, lo que sería bueno, porque puedo agregar el texto y el relleno directamente, pero no sé cómo obtener las coordenadas absolutas para cada rectángulo. ¿Hay alguna forma de hacer esto?


¿Puedes usar simplemente el elemento SVG <title> y el navegador predeterminado que lo transmite? (Nota: esto no es lo mismo que el atributo title que puede usar en div / img / spans en html, debe ser un elemento secundario llamado title )

rect { width: 100%; height: 100%; fill: #69c; stroke: #069; stroke-width: 5px; opacity: 0.5 }

<p>Mouseover the rect to see the tooltip on supporting browsers.</p> <svg xmlns="http://www.w3.org/2000/svg"> <rect> <title>Hello, World!</title> </rect> </svg>

Alternativamente, si realmente desea mostrar HTML en su SVG, puede incrustar HTML directamente:

rect { width: 100%; height: 100%; fill: #69c; stroke: #069; stroke-width: 5px; opacity: 0.5 } foreignObject { width: 100%; } svg div { text-align: center; line-height: 150px; }

<svg xmlns="http://www.w3.org/2000/svg"> <rect/> <foreignObject> <body xmlns="http://www.w3.org/1999/xhtml"> <div> Hello, <b>World</b>! </div> </body> </foreignObject> </svg>

... pero entonces necesitaría JS para encender y apagar la pantalla. Como se muestra arriba, una forma de hacer que la etiqueta aparezca en el lugar correcto es ajustar el rect y HTML en el mismo <g> que los coloca juntos.

Para usar JS para encontrar dónde se encuentra un elemento SVG en la pantalla, puede usar getBoundingClientRect() , por ejemplo, http://phrogz.net/svg/html_location_in_svg_in_html.xhtml


La única buena manera que encontré fue usar Javascript para mover una información sobre herramientas <div> . Obviamente, esto solo funciona si tienes SVG dentro de un documento HTML, no de forma independiente. Y requiere Javascript.

function showTooltip(evt, text) { let tooltip = document.getElementById("tooltip"); tooltip.innerHTML = text; tooltip.style.display = "block"; tooltip.style.left = evt.pageX + 10 + ''px''; tooltip.style.top = evt.pageY + 10 + ''px''; } function hideTooltip() { var tooltip = document.getElementById("tooltip"); tooltip.style.display = "none"; }

#tooltip { background: cornsilk; border: 1px solid black; border-radius: 5px; padding: 5px; }

<div id="tooltip" display="none" style="position: absolute; display: none;"></div> <svg> <rect width="100" height="50" style="fill: blue;" onmousemove="showTooltip(evt, ''This is blue'');" onmouseout="hideTooltip();" > </rect> </svg>