J'essaie de définir une icône avec FontAwesome au lieu du texte dans mes nœuds D3. Voici l'implémentation d'origine, avec du texte:
g.append('svg:text')
.attr('x', 0)
.attr('y', 4)
.attr('class', 'id')
.text(function(d) { return d.label; });
Et maintenant j'essaye avec des icônes:
g.append('svg:i')
.attr('x', 0)
.attr('y', 4)
.attr('class', 'id icon-fixed-width icon-user');
Mais cela ne fonctionne pas, même si le balisage est correct et que les règles CSS sont correctement activées: les icônes ne sont pas visibles.
Une idée pourquoi?
Voici la relation jsbin
J'ai trouvé cette alternative pour insérer des images: http://bl.ocks.org/mbostock/950642
node.append("image")
.attr("xlink:href", "https://github.com/favicon.ico")
.attr("x", -8)
.attr("y", -8)
.attr("width", 16)
.attr("height", 16);
C'est exactement ce que je veux faire, mais cela ne fonctionne pas avec <i>
éléments utilisés par FontAwesome.
Vous devez utiliser le bon Unicode dans un élément de texte normal, puis définir la famille de polices sur "FontAwesome" comme ceci:
node.append('text')
.attr('font-family', 'FontAwesome')
.attr('font-size', function(d) { return d.size+'em'} )
.text(function(d) { return '\uf118' });
Ce code exact rendra une icône "icône-sourire". Les unicodes de toutes les icônes FontAwesome se trouvent ici:
http://fortawesome.github.io/Font-Awesome/cheatsheet/
Sachez que vous devez adapter les codes de la triche du format HTML/CSS unicode au format Javascript unicode afin que 
doit être écrit \uf118
dans votre javascript.
Merci à tous ceux qui ont répondu. Ma solution finale est basée sur la réponse de CarlesAndres:
g.append('text')
.attr('text-anchor', 'middle')
.attr('dominant-baseline', 'central')
.attr('font-family', 'FontAwesome')
.attr('font-size', '20px')
.text(function(d) { return ICON_UNICODE[d.nodeType]; });
Soyez prudent avec votre CSS: il a priorité sur les attributs SVG.
Et voici à quoi cela ressemble:
La bonne chose à ce sujet, par rapport à la solution foreignObject
, est que les événements sont correctement gérés par D3.
Je suis vraiment nouveau sur d3, mais les polices géniales fonctionnent en stylisant un <i>
élément avec un attribut de classe.
La seule façon que j'ai trouvée est d'ajouter un foreignObject
et d'y mettre le code HTML nécessaire dont la police a besoin.
Référence:
http://fortawesome.github.io/Font-Awesome/examples/
Code:
g.append('svg:foreignObject')
.attr("width", 100)
.attr("height", 100)
.append("xhtml:body")
.html('<i class="icon-fixed-width icon-user"></i>');
Je sais que cette question est ancienne, a été résolue, mais - cela a fonctionné pour moi aujourd'hui.
De ce site
svg.append('svg:foreignObject')
.attr("width", 50)
.attr("height", 50)
.append("xhtml:body")
.html('<i class="fa fa-user"></i>');
Mais pour mon graphique, j'ai laissé tomber l'appendice xhtml:body
, sinon cela ne me laisserait pas définir les coordonnées x et y.
L'élément adoptera la largeur et la hauteur de la police que vous définissez.
d3.select('svg')
.append('svg:foreignObject')
.attr('class', 'handle')
.attr('x', +getLeftBarPosition(i+1, 'handle')[0] + +getLeftBarPosition(i+1, 'handle')[1])
.attr('y', state.barHeight/2)
.html('<i class="fa fa-user"></i>')
Étant donné que les autres réponses ne fonctionnent plus (car d3js a été mis à jour entre-temps) et parce que c'est pas a bonne solution à utiliser svg:foreignObject
en raison de problèmes de compatibilité, voici une réponse qui fonctionne sans avoir à utiliser de hacks:
.append("text") // Append a text element
.attr("class", "fa") // Give it the font-awesome class
.text("\uf005"); // Specify your icon in unicode (https://fontawesome.com/cheatsheet)
Voici un exemple de travail (cliquez sur "Exécuter l'extrait de code" et le code d3 affiche trois étoiles):
var icons = [1, 2, 3];
d3.select("body")
.selectAll(".text")
.data(icons)
.enter()
.append("text") // Append a text element
.attr("class", "fa") // Give it the font-awesome class
.text("\uf005"); // Specify your icon in unicode
<link href="http://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Juste pour mettre en code ici ce qui a fonctionné pour moi basé sur la réponse de CarlesAndres et le commentaire de mhd:
node.append("text")
.attr("style","font-family:FontAwesome;")
.attr('font-size', "50px" )
.attr("x", 440)
.attr("y", 440)
.text(function(d) { return '\uf118' });