Ich versuche, einer SVG-Datei Text hinzuzufügen. Der Text ist dynamisch und wird über einem Rechteck angezeigt, das als Hintergrund dient.
Da der Text dynamisch ist, muss auch die Breite des Hintergrundrechtecks dynamisch sein. Um konsistent zu sein, verwende ich eine Monospace-Schriftart mit fester Breite (Droid Sans Mono) und berechne die Breite des Hintergrundrechtecks mithilfe des Ausdrucks - (x*6.4)+4)
, wobei x
die Anzahl der Zeichen im Text ist und 4 für hinzugefügt wird Polsterung (2 links, 2 rechts). Angenommen, 6.4
dies ist die durchschnittliche Breite jedes Zeichens in der Droid Sans Mono
Schriftart (nur eine Vermutung).
Für text Ruby on Rails
ist die Anzahl der Zeichen also 13, also ist die Breite des Hintergrundrechtecks 13*6.4+4 = 87.2
.
Was in Browsern (Firefox und Chromium) unter Ubuntu perfekt funktioniert . Wenn er jedoch in denselben Browsern (Firefox und Chrome) unter Windows angezeigt wird, überläuft der Text das Rechteck.
Meine Frage lautet also: Wie kann ich sicherstellen, dass das Bild auf verschiedenen Betriebssystemen einheitlich aussieht? Das Bild sieht in allen Browsern auf demselben Betriebssystem einheitlich aus.
Ich füge ein Beispielbild als Referenz hinzu:
AKTUALISIEREN
Vielleicht sollte ich meine Frage umformulieren : Wie kann ich in einer SVG-Datei dafür sorgen, dass eine Schriftart mit fester Breite auf allen Plattformen dieselbe Anzahl von Pixeln verwendet, vorausgesetzt, die SVG-Datei wird nicht von externen CSS-Stilen beeinflusst und die Zoomstufe ist normal?
Ich verstehe auch, dass es alternative Technologien gibt (PNG usw.), aber nicht jede SVG-Frage sollte damit enden , sie durch PNG zu ersetzen . Auch mehr als eine Lösung, ich bin daran interessiert zu verstehen, warum dieses Problem mit SVG besteht. Ich verwende eine Schriftart mit fester Breite, die auf allen Betriebssystemen die gleiche Anzahl von Pixeln einnehmen soll (Ist das eine falsche Annahme? Warum? Was kann ich dagegen tun?).
Screenshots
Ubuntu 12.04 amd64 / Firefox 13
Ubuntu 12.04 amd64 / Chromium 18
Windows 7 32-Bit (in VirtualBox) / Google Chrome 18
Windows 7 32-Bit (in VirtualBox) / Firefox 13
Da Sie nur das SVG verlinkt und keine Bildschirmaufnahme bereitgestellt haben, um zu zeigen, was Ihr Problem ist, kann ich nur nach dem gehen, was ich sehe. Das in der Frage gezeigte Bild wird nicht richtig gerendert, da es nicht die richtige Schriftart ist. Daher ist Ihr Rendering deaktiviert, da Ihre Berechnung auf einer anderen Buchstabengröße und einem anderen Abstand basiert (ich sehe Courier). Wenn ich das SVG in einem neuen Tab ansehe (oder dem Link für den direkten Link folge), wird es mit Droid Sans Mono und der richtigen Rechteckgröße richtig gerendert.
Ihr Problem ist also im Grunde ein CSS-Problem, bei dem die Schriftart durch einen übergeordneten Container oder eine falsche Aufrufmethode gelöscht wird. Insofern würde ich Lollero zustimmen, dass es für GD kein Thema ist.
Eine Möglichkeit, damit umzugehen, besteht darin, die Schriftartdatei auf Ihrem Server zu speichern und sie mit PHP-GD-Aufrufen zu rendern (ziemlich trivial). Sie können das Ergebnis mit einer Prüfsumme usw. speichern, sodass das Bild nur dann neu gerendert wird, wenn sich der Text ändert, und ansonsten die gespeicherte Kopie verwenden.
BEARBEITEN:___________
Ein Screenshot Ihrer SVG-Datei auf Win7 64bit Firefox:
Der Klartextinhalt Ihrer SVG-Datei (XML)
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg version="1.1" baseProfile="basic" xmlns="http://www.w3.org/2000/svg" height="14">
<defs>
<style type="text/css">
<![CDATA[
@import url(https://fonts.googleapis.com/css?family=Droid+Sans+Mono);
]]>
</style>
<linearGradient id="g1">
<stop stop-color="#222" offset="0%"/>
<stop stop-color="#444" offset="100%"/>
</linearGradient>
<linearGradient id="g2">
<stop stop-color="#2a2" offset="0%"/>
<stop stop-color="#0a0" offset="100%"/>
</linearGradient>
</defs>
<!-- Extra rectangles on left & right for the rounded corners -->
<rect x="0" y="0" width="16" height="14" fill="#222" rx="4" ry="4"/>
<rect x="129.6" y="0" width="8" height="14" fill="#0a0" rx="4" ry="4"/>
<rect x="4" y="0" width="87.2" height="14" fill="url(#g1)" />
<rect x="91.2" y="0" width="42.4" height="14" fill="url(#g2)" />
<text x="6.0" y="10" font-size="10.5" font-family="'Droid Sans Mono', monospace" text-anchor="start" fill="#fff">Ruby on Rails</text>
<text x="93.2" y="10" font-size="10.5" font-family="'Droid Sans Mono', monospace" text-anchor="start" fill="#fff">1 vote</text>
</svg>
<img />
Tags in eine Seite einbette, sodass externes CSS keine Auswirkungen haben sollte (AFAIK). Screenshots habe ich auch beigefügt. Danke.
Joonas
Horatio
Joonas
Joonas
Joonas
Horatio
Note also that your jsfiddle example wraps to two lines on my browser (breaks between
durchgestrichen-- 1` undvote
).`--) Die wirkliche Lösung besteht darin, sich nach Möglichkeit nicht auf die Clientseite zu verlassen, aber dies ist nicht die gestellte Frage.Joonas
Horatio
Joonas
Joonas
Scott
Vikrant Chaudhary
@font-face
.