Wie kann ich einen Gradienten für eine <g>
in einem SVG-Bild füllen, anstatt alle <g>
s in der ausgewählten <g>
zu füllen?
In diesem Fall würde ich gerne Afrika zeigen, gefüllt mit nur einem Gradienten von gelb bis rot, aber wegen der Untergruppen macht die Füllung viele Gradienten.
Das Javascript:
%Vor%Das SVG:
%Vor%
Wie kann ich dieses Problem beheben?
Wie kann ich dieses Problem beheben, ohne ein weiteres <g>
-Tag zum Originalbild hinzuzufügen?
Ihr Problem kann gelöst werden, indem Sie das Farbverlaufskoordinatensystem auf den Benutzerbereich einstellen (anstelle des standardmäßigen Begrenzungsrahmens).
Sie könnten versuchen
%Vor%Die Lösung widerspricht nicht dem Kommentar von e.nelson - was hier passiert ist, dass jede Untergruppe, die die Nationen repräsentiert, immer noch ihre eigene Gradienteninstanz hat, während alle diese Instanzen denselben Koordinatenursprung und dieselben Transformationen bezüglich des Benutzerraums haben - Daher ist es an keiner Stelle im endgültigen Rendering von Bedeutung, welche Gradienteninstanz sichtbar ist.
zwei Anpassungen sind erforderlich:
[geringfügig]
Sie müssen die y1 / y2-Offsets (oder die Stop-Offsets) der Gradienten-Definition anpassen - da sie sich auf den Benutzerkoordinatenraum der gesamten Map beziehen, deckt Afrika nur einen Teil des Gradienten zwischen den definierten Stopps ab. probiere y1="50%"
und y2="100%"
.
[mittel] Wenn Sie sich die svg g-elements ansehen, die die Länderformen definieren, werden Sie feststellen, dass einige von ihnen einer zusätzlichen Übersetzung unterzogen werden. Sie verschieben das Benutzerkoordinatensystem effektiv und gelten daher auch für den Gradienten, der dazu führt, dass die betroffenen Landformen wie Flecken auf der Karte erscheinen. Diese Spurios-Transformation ist wahrscheinlich ein Artefakt der Aktionen im Generator, mit denen die Karte erstellt wurde. Es kann behoben werden, indem die Übersetzungsoffsets zu jeder absoluten Koordinate in den Pfadelementen innerhalb der jeweiligen g-Elemente hinzugefügt werden. Da diese Pfade unter Verwendung relativer Koordinaten für die zusammengenähten Teile definiert sind, reduziert dies die Änderung der Koordinaten der anfänglichen M- und letzten C-Befehle im d-Attribut des Pfads.
Ich habe ein Ad-hoc-Perl-Skript ausgearbeitet, um die Struktur des Svg-Codes, der die Ländergrenzen repräsentiert, zu normalisieren, der die oben genannten Modifikationen implementiert. Beachten Sie, dass diese Änderungen auch relativ einfach in js durchgeführt werden können. Das ist das Ergebnis .
hoffe, dass hilft und lassen Sie mir eine Notiz, wenn Sie zusätzliche Informationen zur Durchführung der genannten Anpassungen benötigen.
PS: Ich habe gerade gemerkt, dass Mosambik noch immer in der generierten Ausgabe fehlt - für die Form dieses einzelnen Landes wurde noch eine Übersetzung angegeben. Dieses kleine Detail ist etwas, das später hinzugefügt werden muss, aber ...
"Das Malen wird jedoch immer für jedes Grafikelement einzeln ausgeführt, niemals für das Containerelement (z. B. ein 'g'). Für das folgende SVG wird also, obwohl die Farbverlaufsfüllung auf dem 'g ', wird der Farbverlauf einfach durch das' g 'Element in jedes Rechteck vererbt, von denen jedes so gerendert wird, dass sein Inneres mit dem Farbverlauf gezeichnet wird. "
Was Sie verlangen, ist laut Spezifikation nicht möglich. Wenn es eine Voraussetzung ist, könntest du eine der folgenden Möglichkeiten ausprobieren: Du musst den SVG-Ersteller dazu bringen, die Maus über Pfade zu legen. Kombinieren Sie die Pfade im Code auf dem Server (möglicherweise schwierig); Wählen Sie statt eines Verlaufs eine Volltonfarbe, damit das Problem nicht so offensichtlich ist.
Wenn du ganz Afrika mit einem Gradienten füllen willst, dann willst du die Union die Pfade dafür füllen. Vielleicht solltest du eine andere Karte benutzen? Eins mit nur den Kontinenten?
Wie auch immer, eine Möglichkeit, es zu beheben, wäre:
Ein anderer Weg:
Danach können Sie den Verlauf auf diesen neuen Pfad anwenden.
Sie könnten es auch auf andere Arten machen, aber aus Leistungsgründen sind sie wahrscheinlich nicht so gut. Eine dieser (nicht empfohlenen) Möglichkeiten besteht darin, ein Rechteck mit dem Farbverlauf zu füllen, in dem Sie einen Clip-Pfad erstellt haben, der aus den Pfaden in der Gruppe besteht. Etwas in dieser Richtung:
%Vor% Ich denke, Ihr Problem könnte sein, dass fill
ist geerbt nach dem Standardregeln von CSS in SVG . Sie müssten also ein explizites fill
von transparent für die untergeordneten g
-Elemente festlegen. Wenn es nicht so ist, dass ich zurückkomme und mich um etwas anderes kümmere, hast du ein Online-Beispiel.
Tags und Links javascript jquery image svg linear-gradients