我猜他正在使用 d3.js transition,参见 https://github.com/mbostock/d3/wiki/Transitions,基本上将行(和值)从当前行位置动画到鼠标光标当前所在的位置。你可以看出他并没有试图仅仅跟随鼠标诅咒,因为如果你快速移动光标,你会看到线条有点滞后,这是过渡的动画时间。
我在http://jsfiddle.net/2N2rt/4/ 整理了一个简单的示例,说明如何在 d3.js 中完成此操作。我没怎么玩,所以我相信你可以让它更流畅,但这看起来很不错。
var line = d3.select('#selection_line'),
page = d3.select('#page_content'),
x = 0;
page.on('mousemove', function() { x = d3.mouse(this)[0]; });
var update = function() {
line.transition()
.duration(5)
.ease('cubic-in-out')
.style('left', x + 'px');
};
setInterval(update, 35);
还请记住,svg 元素的动画效果往往比 DOM 元素更流畅。这是一个纯粹的 svg 示例 (http://jsfiddle.net/2N2rt/10/)。
var graph = d3.select('#graph')
.append('svg')
.attr('width', '100%')
.attr('height', 600);
var box = graph.append('rect')
.attr('transform', 'translate(0, 100)')
.attr('width', '100%')
.attr('height', 200)
.attr('class', 'page_content');
var line = graph.append('line')
.attr('transform', 'translate(0, 50)')
.attr({'x1': 0, 'y1' : 0, 'x2': 0, 'y2': 300})
.attr('class', 'selection_line');
var x = 0;
graph.on('mousemove', function () {
x = d3.mouse(this)[0];
});
var draw = function () {
line
.transition()
.duration(18)
.attrTween('transform', d3.tween('translate(' + x + ', 50)', d3.interpolateString))
.each('end', draw);
};
draw();
同样,这只是一个简单的示例,但希望它能给您一些想法。