Ajouter des icônes FontAwesome à un graphique D3
j'essaie de mettre une icône avec FontAwesome au lieu de texte dans Mes noeuds D3. C'est l'implementation originale, 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'essaie 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 markup est correct, et les règles CSS sont correctement frappées: les icônes ne sont pas visibles.
une idée de pourquoi?
Ici est lié d' jsbin
EDIT
j'ai trouvé cette alternative à l'insertion d'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);
ce Qui est exactement ce que je veux faire, mais il ne fonctionne pas avec <i>
éléments utilisés par FontAwesome.
6 réponses
vous devez utiliser la bonne Unicode à l'intérieur d'un élément de texte normal, puis Définir LA font-family à "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 affichera une icône" icône-Sourire". Les unicodes pour toutes les icônes de FontAwesome peuvent être trouvées ici:
http://fortawesome.github.io/Font-Awesome/cheatsheet/
soyez conscient que vous avez besoin d'adapter les codes dans le cheatsheet du format unicode HTML/CSS au format unicode Javascript pour 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]; });
attention avec votre CSS: Il a priorité sur les attributs SVG.
Et c'est la façon dont elle regarde:
La bonne chose à ce sujet, par rapport à l' foreignObject
solution, est que les événements sont correctement gérés par D3.
je suis vraiment nouveau à d3, mais font awesome fonctionne en stylisant un <i>
élément avec un attribut de classe.
Le seul moyen que j'ai trouvé est d'ajouter un foreignObject
et mettre sur elle le HTML pertinent nécessaire par font awesome.
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, été résolu, mais cela a fonctionné pour moi aujourd'hui.
svg.append('svg:foreignObject')
.attr("width", 50)
.attr("height", 50)
.append("xhtml:body")
.html('<i class="fa fa-user"></i>');
Mais pour mon tableau, j'ai laissé tomber l'ajouter xhtml:body
, sinon il ne me laisserait pas mettre x et y coords.
L'élément d'adopter la largeur et la hauteur de la police que vous avez défini.
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>')
juste pour mettre dans le 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' });
étant donné que les autres réponses ne fonctionnent plus (parce que d3js a été mis à jour dans l'intervalle) et parce que c'est une bonne solution d'utiliser svg:foreignObject
en raison de problèmes de compatibilité, voici une réponse qui fonctionne sans avoir à utiliser tous les 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 le code snippet" 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>