Aktualisieren des SVG-Element Z-Index mit D3
Was ist ein effektiver Weg, um ein SVG-element an die Spitze der z-Reihenfolge, mit der D3-Bibliothek?
Meinem speziellen Szenario ist ein Kreisdiagramm, welches die highlights (durch hinzufügen einer stroke
zu den path
), wenn sich die Maus über einem bestimmten Stück. Der code-block für die Erzeugung, meine Grafik ist unter:
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);
});
Habe ich versucht, ein paar Möglichkeiten, aber kein Glück so weit. Mit style("z-index")
und ruft classed
beide haben nicht funktioniert.
Den "top" - Klasse wie folgt definiert ist in mein CSS:
.top {
fill: red;
z-index: 100;
}
Den fill
Aussage ist es, sicherzustellen, dass ich wusste, es war ein-und ausschalten richtig. Es ist.
Ich habe gehört, mit sort
ist eine option, aber ich bin unklar, wie es umgesetzt würde, um das "selektierte" element nach oben.
UPDATE:
Ich fest, meine Besondere situation mit dem folgenden code, fügt einen neuen Bogen zu den SVG auf die mouseover
Ereignis zu zeigen, ein highlight.
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();
});
InformationsquelleAutor der Frage Evil Closet Monkey | 2012-11-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als eine der Lösungen präsentiert von der Entwickler: "verwenden D3 - sort-operator zum Sortieren der Elemente." (siehe https://github.com/mbostock/d3/issues/252)
In diesem Licht, könnte man das Sortieren der Elemente durch den Vergleich Ihrer Daten, oder Positionen, wenn Sie dataless-Elemente:
InformationsquelleAutor der Antwort futurend
Wie bereits in den anderen Antworten, SVG nicht haben eine Vorstellung von einem z-index. Stattdessen wird die Reihenfolge der Elemente im Dokument bestimmt die Reihenfolge, in der Zeichnung.
Abgesehen von der Neuanordnung der Elemente manuell, es gibt einen anderen Weg für bestimmte Situationen:
Arbeiten mit D3 Sie haben oft bestimmte Arten von Elementen, die sollten immer gezogen werden, auf andere Typen von Elementen.
Zum Beispiel, wenn die Verlegung aus Grafiken, links sollten immer gesetzt werden unterhalb der Knoten. Mehr im Allgemeinen, einige hintergrund-Elemente müssen in der Regel platziert werden, unter alles andere, während einige highlights und overlays sollten gelegt werden.
Wenn Sie diese Art von situation, fand ich, dass die Schaffung übergeordneten Gruppe Elemente für diejenigen Gruppen von Elementen ist der beste Weg zu gehen. In SVG, können Sie die
g
element. Zum Beispiel, wenn Sie links, der sollte immer unten Knoten, tun Sie den folgenden:Nun, wenn Sie malen Sie Ihre links und Knoten, wählen Sie wie folgt vor (die Selektoren beginnen mit
#
Referenz-element-id):Nun, alle links werden immer angehängt werden, strukturell, bevor alle Knoten-Elemente. So, der SVG zeigt alle links, die unter allen Knoten, egal wie oft und in welcher Reihenfolge Sie hinzufügen oder entfernen von Elementen. Natürlich, alle Elemente des gleichen Typs (d.h. innerhalb des gleichen Containers) wird noch Gegenstand der Reihenfolge, in der Sie Hinzugefügt wurden.
InformationsquelleAutor der Antwort notan3xit
Da SVG nicht über Z-index aber die Reihenfolge der DOM-Elemente, bringen Sie es nach vorne durch:
Kann man dann z.B. nutzen insertBeforeum es wieder auf
mouseout
. Dies jedoch erfordert, dass Sie in der Lage sein, um das Ziel Geschwister-Knoten-element eingefügt werden soll, vor.DEMO: werfen Sie einen Blick auf diese JSFiddle
InformationsquelleAutor der Antwort swenedo
SVG nicht, z-index. Z-Reihenfolge wird bestimmt von der Reihenfolge der SVG-DOM-Elemente in Ihrem container.
Soweit ich das beurteilen konnte (und ich habe versucht, diese ein paar mal in der Vergangenheit), D3 nicht bieten Methoden für das abnehmen und Wiederanbringen ein einzelnes element, um es auf der Vorderseite oder ähnliches.
Es ist ein
.order()
Methodedie eine Neuverteilung der Knoten entsprechend der Reihenfolge erscheinen Sie in der Auswahl. In Ihrem Fall, Sie brauchen, um ein einzelnes element auf der Vorderseite. Also, technisch gesehen, könnten Sie resort die Auswahl mit dem gewünschten element in der front (oder am Ende, kann mich nicht erinnern, die obersten), und rufen Sie dannorder()
.Oder Sie könnte überspringen d3 für diese Aufgabe und verwenden nur JS (bzw. jQuery) erneut einfügen, dass einzelne DOM element.
InformationsquelleAutor der Antwort meetamit
Ich umgesetzt futurend die Lösung in meinem code und es hat funktioniert, aber mit der großen Zahl der Elemente, die ich mit war, war es sehr langsam. Hier ist die alternative Methode der Verwendung von jQuery, der arbeitete schneller, für meine Besondere Visualisierung. Es stützt sich auf die svgs, die Sie wollen auf der Oberseite mit einer Klasse gemeinsam (in meinem Beispiel die Klasse wird darauf hingewiesen, in meinen Daten als d....- Taste). In meinem code gibt es eine
<g>
mit der Klasse "Standorte" enthält alle SVGs ich bin re-organisieren.So, wenn Sie die Maus auf einen bestimmten Datenpunkt, der code ermittelt alle anderen Daten Punkte mit SVG-DOM-Elemente mit einer bestimmten Klasse. Dann trennt und wieder fügt dem SVG-DOM-Elemente, die mit diesen Daten Punkte.
InformationsquelleAutor der Antwort lk145
Erweitern wollte, was @notan3xit beantwortet, anstatt zu schreiben, eine ganze neue Antwort (aber ich habe nicht genug reputation).
Andere Weise zu lösen, die element-order-problem ist die Verwendung von 'insert' eher als 'append' beim zeichnen . So werden die Wege immer zusammen gelegt werden, bevor die anderen svg-Elemente(dies nimmt an, dass Ihr code bereits funktioniert die enter() für links, bevor Sie die enter() für die anderen svg-Elemente).
d3 insert-api: https://github.com/mbostock/d3/wiki/Selections#insert
InformationsquelleAutor der Antwort Ali
Die einfache Antwort ist die Verwendung von d3 Bestellung von Methoden. Zusätzlich zu d3.wählen Sie('g').um(), die es gibt .lower() und .raise() in version 4. Diese änderungen, wie Elemente angezeigt werden. Bitte konsultieren Sie die Dokumentation für mehr Informationen - https://github.com/d3/d3/blob/master/API.md#selections-d3-selection
InformationsquelleAutor der Antwort evanjmg
Es hat mich Alters zu finden, wie Sie Sie optimieren die Z-Ordnung in ein bestehendes SVG. Ich brauchte es eigentlich im Rahmen von d3.Pinsel mit tooltip-Verhalten. Um die beiden Funktionen arbeiten gut zusammen (http://wrobstory.github.io/2013/11/D3-brush-and-tooltip.html), müssen Sie die d3.Pinsel werden die ersten in der Z-Reihenfolge (1. gezeichnet werden, auf der Leinwand, dann bedeckt der rest der SVG-Elemente), und es wird erfassen alle Maus-events, egal was oben drauf (mit höheren Z-Indizes).
Forum die meisten Kommentare sagen, dass Sie sollten hinzufügen der d3.Pinsel zuerst in deinem code, dann per "Zeichnung" - code. Für mich war es aber nicht möglich, da lud ich eine externe SVG-Datei. Sie können einfach fügen Sie die Bürste jederzeit und ändern der Z-Reihenfolge später mit:
Im Rahmen einer d3.Pinsel-setup wird wie folgt Aussehen:
d3.js insert () - Funktion API: https://github.com/mbostock/d3/wiki/Selections#insert
Hoffe, das hilft!
InformationsquelleAutor der Antwort mskr182
Version 1
In der Theorie, wird die folgende sollte gut funktionieren.
Der CSS-code :
Dieser CSS-code fügen Sie einen Schlag auf den ausgewählten Pfad.
Der JS-code :
Diese JS-code entfernt zunächst den Pfad aus der DOM-Struktur, und dann fügt er als letztes Kind seiner Eltern. Dies stellt sicher, dass der Pfad gezeichnet wird auf der Oberseite der alle anderen Kinder der gleichen Eltern.
In der Praxis, dieser code funktioniert in Chrome, sondern bricht in einigen anderen Browsern. Ich habe versucht es in Firefox 20 auf meinem Linux Mint Rechner und konnte es nicht bekommen, um zu arbeiten. Irgendwie, Firefox schlägt fehl, zum auslösen der
:hover
Stile und ich habe noch keinen Weg gefunden, dieses Problem zu beheben.Version 2
So kam ich mit einer alternative. Es kann ein bisschen 'dirty', aber zumindest funktioniert es und es erfordert keine Schleife über alle Elemente (wie einige der anderen Antworten).
Der CSS-code :
Anstatt die
:hover
pseudoselector, ich benutze ein.hover
KlasseDer JS-code :
Auf mouseover, füge ich die
.hover
Klasse für meinen Pfad. Auf mouseout, Entferne ich es.Wie im ersten Fall, wird der code auch entfernt den Pfad aus der DOM-Struktur, und dann fügt er als letztes Kind seiner Eltern.
InformationsquelleAutor der Antwort John Slegers
Können Sie Tun, wie diese Auf der Maus Über Ziehen Sie es nach oben.
};
Wenn Sie wollen Push-To-Back
InformationsquelleAutor der Antwort RamiReddy P