To create a tooltip for a visualization based on d3.js d3.js (Data-Driven Documents) a solution is to use d3-tip.

Script to reproduce the example above:
<!DOCTYPE html><html><head><meta charset="utf-8"><title>Example d3-tip with circle</title></head><body><script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script><script src="http://labratrevenge.com/d3-tip/javascripts/d3.tip.v0.6.3.js"></script><script>var tip = d3.tip().attr('class', 'd3-tip').offset([-10, 0]).html(function(d) {return "Hello Tip";})var bodySelection = d3.select("body");var svgSelection = bodySelection.append("svg").attr("width", 200).attr("height", 200);svgSelection.call(tip);var new_circle = svgSelection.append("svg").append("circle").attr("cx", 100).attr("cy", 100).attr("r", 25).style("fill", "red").on('mouseover', tip.show).on('mouseout', tip.hide);</script></body></html>
Example of how to change the tooltip appearance:
<style>.d3-tip {line-height: 1;font-weight: bold;padding: 12px;background: rgba(0, 0, 0, 1.0);color: #fff;border-radius: 2px;}/* Creates a small triangle extender for the tooltip */.d3-tip:after {box-sizing: border-box;display: inline;font-size: 10px;width: 100%;line-height: 1;color: rgba(0, 0, 0, 0.8);content: "\25BC";position: absolute;text-align: center;}/* Style northward tooltips differently */.d3-tip.n:after {margin: -1px 0 0 0;top: 100%;left: 0;}</style>
source code from Justin Palmer:
// d3.tip// Copyright (c) 2013 Justin Palmer//// Tooltips for d3.js SVG visualizations// Public - contructs a new tooltip//// Returns a tipd3.tip = function() {var direction = d3_tip_direction,offset = d3_tip_offset,html = d3_tip_html,node = initNode(),svg = null,point = null,target = nullfunction tip(vis) {svg = getSVGNode(vis)point = svg.createSVGPoint()document.body.appendChild(node)}// Public - show the tooltip on the screen//// Returns a tiptip.show = function() {var args = Array.prototype.slice.call(arguments)if(args[args.length - 1] instanceof SVGElement) target = args.pop()var content = html.apply(this, args),poffset = offset.apply(this, args),dir = direction.apply(this, args),nodel = d3.select(node), i = 0,coordsnodel.html(content).style({ opacity: 1, 'pointer-events': 'all' })while(i--) nodel.classed(directions[i], false)coords = direction_callbacks.get(dir).apply(this)nodel.classed(dir, true).style({top: (coords.top + poffset[0]) + 'px',left: (coords.left + poffset[1]) + 'px'})return tip}// Public - hide the tooltip//// Returns a tiptip.hide = function() {nodel = d3.select(node)nodel.style({ opacity: 0, 'pointer-events': 'none' })return tip}// Public: Proxy attr calls to the d3 tip container. Sets or gets attribute value.//// n - name of the attribute// v - value of the attribute//// Returns tip or attribute valuetip.attr = function(n, v) {if (arguments.length < 2 && typeof n === 'string') {return d3.select(node).attr(n)} else {var args = Array.prototype.slice.call(arguments)d3.selection.prototype.attr.apply(d3.select(node), args)}return tip}// Public: Proxy style calls to the d3 tip container. Sets or gets a style value.//// n - name of the property// v - value of the property//// Returns tip or style property valuetip.style = function(n, v) {if (arguments.length < 2 && typeof n === 'string') {return d3.select(node).style(n)} else {var args = Array.prototype.slice.call(arguments)d3.selection.prototype.style.apply(d3.select(node), args)}return tip}// Public: Set or get the direction of the tooltip//// v - One of n(north), s(south), e(east), or w(west), nw(northwest),// sw(southwest), ne(northeast) or se(southeast)//// Returns tip or directiontip.direction = function(v) {if (!arguments.length) return directiondirection = v == null ? v : d3.functor(v)return tip}// Public: Sets or gets the offset of the tip//// v - Array of [x, y] offset//// Returns offset ortip.offset = function(v) {if (!arguments.length) return offsetoffset = v == null ? v : d3.functor(v)return tip}// Public: sets or gets the html value of the tooltip//// v - String value of the tip//// Returns html value or tiptip.html = function(v) {if (!arguments.length) return htmlhtml = v == null ? v : d3.functor(v)return tip}function d3_tip_direction() { return 'n' }function d3_tip_offset() { return [0, 0] }function d3_tip_html() { return ' ' }var direction_callbacks = d3.map({n: direction_n,s: direction_s,e: direction_e,w: direction_w,nw: direction_nw,ne: direction_ne,sw: direction_sw,se: direction_se}),directions = direction_callbacks.keys()function direction_n() {var bbox = getScreenBBox()return {top: bbox.n.y - node.offsetHeight,left: bbox.n.x - node.offsetWidth / 2}}function direction_s() {var bbox = getScreenBBox()return {top: bbox.s.y,left: bbox.s.x - node.offsetWidth / 2}}function direction_e() {var bbox = getScreenBBox()return {top: bbox.e.y - node.offsetHeight / 2,left: bbox.e.x}}function direction_w() {var bbox = getScreenBBox()return {top: bbox.w.y - node.offsetHeight / 2,left: bbox.w.x - node.offsetWidth}}function direction_nw() {var bbox = getScreenBBox()return {top: bbox.nw.y - node.offsetHeight,left: bbox.nw.x - node.offsetWidth}}function direction_ne() {var bbox = getScreenBBox()return {top: bbox.ne.y - node.offsetHeight,left: bbox.ne.x}}function direction_sw() {var bbox = getScreenBBox()return {top: bbox.sw.y,left: bbox.sw.x - node.offsetWidth}}function direction_se() {var bbox = getScreenBBox()return {top: bbox.se.y,left: bbox.e.x}}function initNode() {var node = d3.select(document.createElement('div'))node.style({position: 'absolute',opacity: 0,pointerEvents: 'none',boxSizing: 'border-box'})return node.node()}function getSVGNode(el) {el = el.node()if(el.tagName.toLowerCase() == 'svg')return elreturn el.ownerSVGElement}// Private - gets the screen coordinates of a shape//// Given a shape on the screen, will return an SVGPoint for the directions// n(north), s(south), e(east), w(west), ne(northeast), se(southeast), nw(northwest),// sw(southwest).//// +-+-+// | |// + +// | |// +-+-+//// Returns an Object {n, s, e, w, nw, sw, ne, se}function getScreenBBox() {var targetel = target || d3.event.target,bbox = {},matrix = targetel.getScreenCTM(),tbbox = targetel.getBBox(),width = tbbox.width,height = tbbox.height,x = tbbox.x,y = tbbox.y,scrollTop = document.documentElement.scrollTop || document.body.scrollTop,scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeftpoint.x = x + scrollLeftpoint.y = y + scrollTopbbox.nw = point.matrixTransform(matrix)point.x += widthbbox.ne = point.matrixTransform(matrix)point.y += heightbbox.se = point.matrixTransform(matrix)point.x -= widthbbox.sw = point.matrixTransform(matrix)point.y -= height / 2bbox.w = point.matrixTransform(matrix)point.x += widthbbox.e = point.matrixTransform(matrix)point.x -= width / 2point.y -= height / 2bbox.n = point.matrixTransform(matrix)point.y += heightbbox.s = point.matrixTransform(matrix)return bbox}return tip};
Références
| Links | Site |
|---|---|
| d3-tip | github |
| Using d3-tip to add tooltips to a d3 bar chart | bl.ocks |
| D3: show data on mouseover of circle | stackoverflow |
| tutoriel d3.js | dashingd3js |
| tutoriel d3.js | dashingd3js |
| D3: show data on mouseover of circle | stackoverflow |
| example | plnkr |
| Lesson 14: Some D3 Tips | github |
| How to use tool tip in Line bar graph using D3 js | stackoverflow |
| D3 tooltip using SVG title element | ocks |
