¿Cuál es una forma eficaz de llevar un elemento SVG a la parte superior del orden z, utilizando la biblioteca D3?
Mi escenario específico es un gráfico circular que resalta (agregando un stroke
al path
) cuando el mouse está sobre una pieza determinada. El bloque de código para generar mi gráfico se encuentra a continuación:
svg.selectAll("path")
.data(d)
.enter().append("path")
.attr("d", arc)
.attr("class", "arc")
.attr("fill", function(d) { return color(d.name); })
.attr("stroke", "#fff")
.attr("stroke-width", 0)
.on("mouseover", function(d) {
d3.select(this)
.attr("stroke-width", 2)
.classed("top", true);
//.style("z-index", 1);
})
.on("mouseout", function(d) {
d3.select(this)
.attr("stroke-width", 0)
.classed("top", false);
//.style("z-index", -1);
});
Probé algunas opciones, pero hasta ahora no tuve suerte. Usar style("z-index")
y llamar a classed
ambos no funcionó.
La clase "superior" se define de la siguiente manera en mi CSS:
.top {
fill: red;
z-index: 100;
}
La fill
declaración está ahí para asegurarme de que sabía que se estaba encendiendo / apagando correctamente. Está.
Escuché que usar sort
es una opción, pero no tengo claro cómo se implementaría para llevar el elemento "seleccionado" a la parte superior.
ACTUALIZAR:
Arreglé mi situación particular con el siguiente código, que agrega un nuevo arco al SVG en el mouseover
evento para mostrar un punto culminante.
svg.selectAll("path")
.data(d)
.enter().append("path")
.attr("d", arc)
.attr("class", "arc")
.style("fill", function(d) { return color(d.name); })
.style("stroke", "#fff")
.style("stroke-width", 0)
.on("mouseover", function(d) {
svg.append("path")
.attr("d", d3.select(this).attr("d"))
.attr("id", "arcSelection")
.style("fill", "none")
.style("stroke", "#fff")
.style("stroke-width", 2);
})
.on("mouseout", function(d) {
d3.select("#arcSelection").remove();
});