Ich zeichne ein Streudiagramm mit d3.js. Mit Hilfe dieser Frage:
Ermitteln Sie die Größe des Bildschirms, der aktuellen Webseite und des Browserfensters
Ich benutze diese Antwort:
var w = window,
d = document,
e = d.documentElement,
g = d.getElementsByTagName('body')[0],
x = w.innerWidth || e.clientWidth || g.clientWidth,
y = w.innerHeight|| e.clientHeight|| g.clientHeight;
So kann ich mein Diagramm wie folgt an das Fenster des Benutzers anpassen:
var svg = d3.select("body").append("svg")
.attr("width", x)
.attr("height", y)
.append("g");
Jetzt möchte ich, dass sich etwas um die Größenänderung des Plots kümmert, wenn der Benutzer die Fenstergröße ändert.
PS: Ich verwende jQuery nicht in meinem Code.
javascript
d3.js
mthpvg
quelle
quelle
Antworten:
Suchen Sie nach "Responsive SVG". Es ist ziemlich einfach, eine SVG reaktionsfähig zu machen, und Sie müssen sich keine Gedanken mehr über Größen machen.
So habe ich es gemacht:
Hinweis: Alles im SVG-Bild wird mit der Fensterbreite skaliert. Dies umfasst Strichbreite und Schriftgrößen (auch solche, die mit CSS festgelegt wurden). Wenn dies nicht erwünscht ist, gibt es unten weitere alternative Lösungen.
Weitere Infos / Tutorials:
http://thenewcode.com/744/Make-SVG-Responsive
http://soqr.fr/testsvg/embed-svg-liquid-layout-responsive-web-design.php
quelle
viewBox
Attribut sollte auf die relevante Höhe und Breite Ihres SVG-Diagramms festgelegt werden:.attr("viewBox","0 0 " + width + " " + height)
wowidth
undheight
woanders definiert. Das heißt, es sei denn, Sie möchten, dass Ihr SVG durch das Ansichtsfeld abgeschnitten wird. Möglicherweise möchten Sie auch denpadding-bottom
Parameter in Ihrem CSS aktualisieren , um ihn an das Seitenverhältnis Ihres SVG-Elements anzupassen. Hervorragende Resonanz - sehr hilfreich und ein Vergnügen. Vielen Dank!top: 10px;
? Scheint für mich falsch und bietet Offset. Das Setzen auf 0px funktioniert einwandfrei.Verwenden Sie window.onresize :
http://jsfiddle.net/Zb85u/1/
quelle
UPDATE benutze einfach den neuen Weg von @cminatti
alte Antwort für historische Zwecke
IMO ist es besser, select () und on () zu verwenden, da Sie auf diese Weise mehrere Event-Handler für die Größenänderung haben können ... werden Sie einfach nicht zu verrückt
http://eyeseast.github.io/visible-data/2013/08/28/responsive-charts-with-d3/
quelle
Es ist etwas hässlich, wenn der Größenänderungscode fast so lang ist wie der Code zum Erstellen des Diagramms. Anstatt also die Größe jedes Elements des vorhandenen Diagramms zu ändern, sollten Sie es einfach neu laden. So hat es bei mir funktioniert:
Die entscheidende Linie ist
d3.select('svg').remove();
. Andernfalls wird bei jeder Größenänderung ein weiteres SVG-Element unter dem vorherigen hinzugefügt.quelle
In Force-Layouts funktioniert das einfache Festlegen der Attribute 'height' und 'width' nicht, um das Diagramm neu zu zentrieren / in den SVG-Container zu verschieben. Es gibt jedoch eine sehr einfache Antwort, die für Force Layouts funktioniert, die hier zu finden sind . Zusammenfassend:
Verwenden Sie das gleiche (beliebige) Ereignis, das Sie mögen.
Angenommen, Sie haben svg & force-Variablen:
Auf diese Weise rendern Sie das Diagramm nicht vollständig neu, wir legen die Attribute fest und d3 berechnet die Dinge nach Bedarf neu. Dies funktioniert zumindest, wenn Sie einen Schwerpunkt verwenden. Ich bin mir nicht sicher, ob dies eine Voraussetzung für diese Lösung ist. Kann jemand bestätigen oder leugnen?
Prost, g
quelle
Für diejenigen, die kraftgerichtete Diagramme in D3 v4 / v5 verwenden, existiert die
size
Methode nicht mehr. So etwas wie das Folgende hat bei mir funktioniert (basierend auf diesem Github-Problem ):quelle
Wenn Sie eine benutzerdefinierte Logik binden möchten, um die Größe des Ereignisses zu ändern, können Sie heutzutage die ResizeObserver-Browser-API für den Begrenzungsrahmen eines SVGElement verwenden.
Dies wird auch der Fall sein, wenn die Größe des Containers aufgrund der Größenänderung der Elemente in der Nähe geändert wird.
Es gibt eine Polyfüllung für eine breitere Browserunterstützung.
So kann es in der UI-Komponente funktionieren:
quelle