2016-05-23 5 views
0

JS Wenn ich D3 verwenden SVG-Elemente zu manipulieren, bewerben ich mich sowohl attr(such as x, y cx, cy) und style(such as stroke, text-anchor, fill) zu SVG Elemente, für D3 nur selbst, das funktioniert ziemlich gut,Wie kann ich nach Stil als Attribut für SVG-Elemente in D3 anwenden oder

aber wenn ich versuche, html2Canvas.js zu verwenden, um einen Schnappschuss zu machen, dann wird der Stil Teil in SVG Elemente fehlerhaft, gab ich ein paar Versuche, stellt sich heraus, wenn ich diese Art als attr, dann funktioniert alles wieder, so Ich frage mich, wie kann ich alle gültigen Stile in attr verschieben (ich muss den Stil zu halten, denn ich manchmal, nur Einstellung als Stil kann funktionieren)

Oder eine andere direkte Hilfe könnte Wie könnte ich machen html2canvas erkennen sowohl Attr und Stil und nur ihre endgültige kooperative Wirkung.

+0

Setzen Sie den Stil über ein Stilattribut (zum Beispiel 'style =" stroke: # 333; fill: # 999; ") oder als einzelne Attribute (' stroke = "# 333" ',' fill = "# 999", usw.)? Ist der Wechsel auf die andere Art der Dinge hilfreich? –

+0

@MaxStarkenburg eigentlich weiß ich nicht, welche Einstellung funktioniert, aber ich gebe nur einen Versuch, ich möchte den Attr einstellen und dabei den Stil beibehalten. – Kuan

Antwort

0

Versuchen Sie zuerst, die Svg in Leinwand zu konvertieren. Es gibt ein Projekt https://github.com/gabelerner/canvg da draußen, das Ihnen vielleicht helfen kann. Nach dem Konvertieren der SVG, sollte HTML2canvas in der Lage sein, den Snapshot korrekt zu rendern.

+0

Danke, bevor ich es ausprobiere, frage ich mich, ob diese Canvg beide Stile (Inline oder via Stylesheet) und Attr erkennen kann? – Kuan

+0

Ja kann es, solange der Stil in der Svg definiert ist, siehe http://jsfiddle.net/9ncuf42o/ für styled Variante und http://jsfiddle.net/cc1nt89k/ für attributierte Variante. –

0

Wenn wir nur sprechen über Stile, die über Stil Attribute gesetzt sind, nicht ein Stylesheet verwendet wird, dann ist die folgende eine Option, die unabhängig von d3 ist:

var svgElements = document.querySelectorAll("svg *"); 
Array.prototype.forEach.call(svgElements, function(svgElement){ 
    var styles = svgElement.getAttribute("style").split(";"); 
    styles.forEach(function(style){ 
    var styleComponents = style.split(":"); 
    svgElement.setAttribute(
     styleComponents[0].trim(), 
     styleComponents[1].trim() 
    ); 
    }); 
}); 

Sie werden die Wähler ändern müssen in der ersten Zeile passend zu Ihrem Anwendungsfall.

+0

Tut mir leid, ich denke, ich habe es nicht ganz verstanden, was bedeutet ** nicht Styles, die mit CSS-Selektoren angewendet werden **? – Kuan

+0

Sorry, sehr schlechte Beschreibung. Ich habe meine Antwort bearbeitet. –

Verwandte Themen