In ( Android WebView HTML5 Canvas-Fehler ) habe ich eine Frage zum Plotten von Diagrammen mit der Graph.js-Bibliothek gestellt. Das Problem, das ich jetzt habe, ist, dass, wenn ich die Funktion zum mehrfachen Zeichnen des Diagramms aufrufe, die Größe der Zeichenfläche jedes Mal geändert wird. Jedes Mal, wenn das Diagramm auf dieselbe Leinwand gezeichnet wird, ändert sich auch seine Größe. Ich habe auch versucht, die Größe der Leinwand einzustellen, aber ohne Erfolg.
Was könnte der Grund sein? Warum wird die Größe der Leinwand jedes Mal geändert?
Antworten:
Ich hatte viele Probleme damit, denn nach all dem sah meine Liniengrafik beim Bewegen der Maus schrecklich aus und ich fand einen einfacheren Weg, hoffe es wird helfen :)
Verwenden Sie diese Chart.js-Optionen:
quelle
<div>
und die Höhe und / oder Breite auf<div>
der Leinwand anstelle der Leinwand einstellen müssen .true
, sodass Sie sie nicht mehr berühren müssen: chartjs.org/docs/latest/general/responsive.htmlWas passiert, ist, dass Chart.js die Größe der Zeichenfläche multipliziert, wenn sie aufgerufen wird, und dann versucht, sie mithilfe von CSS wieder zu verkleinern. Der Zweck besteht darin, Diagramme mit höherer Auflösung für Geräte mit hoher Auflösung bereitzustellen.
Das Problem ist, dass es nicht merkt, dass es dies bereits getan hat. Wenn es als aufeinanderfolgende Zeiten bezeichnet wird, multipliziert es die bereits (verdoppelte oder was auch immer) Größe WIEDER, bis die Dinge anfangen zu brechen. (Was tatsächlich passiert, ist die Überprüfung, ob der Zeichenfläche mehr Pixel hinzugefügt werden sollen, indem das DOM-Attribut für Breite und Höhe geändert wird. Wenn dies der Fall ist, wird es mit einem Faktor multipliziert, normalerweise 2, dann geändert und dann der CSS-Stil geändert Attribut, um die gleiche Größe auf der Seite beizubehalten.)
Wenn Sie es beispielsweise einmal ausführen und Ihre Leinwandbreite und -höhe auf 300 festgelegt sind, werden sie auf 600 festgelegt, und das Stilattribut wird auf 300 geändert. Wenn Sie es jedoch erneut ausführen, wird die Breite und Höhe des DOM angezeigt sind 600 (überprüfen Sie die andere Antwort auf diese Frage, um zu sehen, warum) und setzen Sie sie dann auf 1200 und die CSS-Breite und -Höhe auf 600.
Nicht die eleganteste Lösung, aber ich habe dieses Problem gelöst, während ich die verbesserte Auflösung für Retina-Geräte beibehalten habe, indem ich einfach die Breite und Höhe der Leinwand vor jedem aufeinanderfolgenden Aufruf von Chart.js manuell eingestellt habe
quelle
Das funktioniert bei mir:
Die wesentliche Tatsache ist, dass wir die Größe der Zeichenfläche im div-Tag festlegen müssen.
quelle
Unter IOS und Android blendet der Browser beim Scrollen die Symbolleiste aus, wodurch die Größe des Fensters geändert wird, in dem die Diagrammdiagramme angezeigt werden, um die Größe des Diagramms zu ändern. Die Lösung besteht darin, das Seitenverhältnis beizubehalten.
Dies sollte Ihr Problem lösen.
quelle
Wie von jcmiller11 vorgeschlagen, hilft das Einstellen von Breite und Höhe. Eine etwas schönere Lösung besteht darin, die Breite und Höhe der Leinwand abzurufen, bevor Sie das Diagramm zeichnen. Verwenden Sie diese Zahlen dann zum Einstellen des Diagramms bei jeder nachfolgenden Neuzeichnung des Diagramms. Dies stellt sicher, dass der Javascript-Code keine Konstanten enthält.
quelle
Ich musste hier eine Kombination aus mehreren Antworten mit einigen kleinen Änderungen verwenden.
Zunächst müssen Sie das Canvas-Element in einen Container auf Blockebene einbinden. Ich sage euch, ich nicht lassen Sie das Canvas - Element Geschwister haben; lass es ein einsames Kind sein, denn es ist stur und verwöhnt . (Für die Verpackung müssen möglicherweise keine Größenbeschränkungen festgelegt werden. Aus Sicherheitsgründen kann es jedoch sinnvoll sein, eine maximale Höhe darauf anzuwenden.)
Stellen Sie beim Starten des Diagramms sicher, dass die folgenden Optionen verwendet werden, nachdem Sie sichergestellt haben, dass die vorherigen Bedingungen erfüllt sind:
Wenn Sie die Höhe des Diagramms anpassen möchten, tun Sie dies auf der Ebene der Zeichenflächenelemente.
Versuchen Sie nicht, auf andere Weise mit dem Kind umzugehen. Dies sollte zu einem zufriedenstellend übersichtlichen Diagramm führen, das friedlich in der Krippe bleibt.
quelle
Ich hatte ein ähnliches Problem und fand Ihre Antwort. Ich kam schließlich zu einer Lösung.
Es sieht so aus, als hätte die Quelle von Chart.js Folgendes (vermutlich, weil es nicht dazu gedacht ist, ein völlig anderes Diagramm in derselben Zeichenfläche neu zu rendern):
Dies ist in Ordnung, wenn es einmal aufgerufen wird. Wenn Sie jedoch mehrmals neu zeichnen, ändert sich die Größe des Canvas-DOM-Elements mehrmals, was zu einer Größenänderung führt.
Hoffentlich hilft das!
quelle
Wenn jemand Probleme hat, habe ich eine Lösung gefunden, bei der die Reaktionsfähigkeit usw. nicht beeinträchtigt wird.
Wickeln Sie einfach Ihre Zeichenfläche in einen div-Container (kein Styling) und setzen Sie den Inhalt der div auf eine leere Zeichenfläche mit ID zurück, bevor Sie den Diagrammkonstruktor aufrufen.
Beispiel:
HTML:
JS:
quelle
Ich habe versucht, die Größe von Canvas mit jQuery zu ändern, aber es funktioniert nicht gut. Ich denke, CSS3 ist die beste Option, die Sie anprobieren können, wenn Sie mit der Maus über eine bestimmte Stufe zoomen möchten.
Folgende Hover-Option von einem anderen Codepan-Link:
Folgen Sie meinem Codepan-Link:
https://codepen.io/hitman0775/pen/XZZzqN
quelle
Ich hatte das gleiche Problem. Ich konnte es lösen, indem ich die Option einstellte:
Stellen Sie in CSS die Breite des Container-Div auf die gleiche wie die Zeichenfläche ein:
quelle
Ich hatte die gleichen Skalierungsprobleme bei der Verwendung von Angular CLI. Konnte es zum Laufen bringen, indem diese Zeile aus der index.html entfernt wurde:
und dann in der Datei angle-cli.json im Abschnitt "Skripte" Folgendes:
Quelle : mikebarr58
quelle
Fügen Sie hinzu
div
und es wird das Problem lösenquelle
quelle