A slightly updated version of OMG Particles! using Canvas and smooth interpolation towards the mouse location.
forked from mbostock's block: OMG Particles II
license: gpl-3.0 |
A slightly updated version of OMG Particles! using Canvas and smooth interpolation towards the mouse location.
forked from mbostock's block: OMG Particles II
<!DOCTYPE html> | |
<meta charset="utf-8"> | |
<style> | |
body { | |
margin: 0; | |
background: #111; | |
min-width: 960px; | |
} | |
</style> | |
<body> | |
<script src="//d3js.org/d3.v3.min.js"></script> | |
<script> | |
var width = Math.max(960, innerWidth), | |
height = Math.max(500, innerHeight); | |
var x1 = width / 2, | |
y1 = height / 2, | |
x0 = x1, | |
y0 = y1, | |
i = 0, | |
r = 200, | |
τ = 2 * Math.PI; | |
var canvas = d3.select("body").append("canvas") | |
.attr("width", width) | |
.attr("height", height) | |
.on("ontouchstart" in document ? "touchmove" : "mousemove", move); | |
var context = canvas.node().getContext("2d"); | |
context.globalCompositeOperation = "lighter"; | |
context.lineWidth = 2; | |
d3.timer(function() { | |
context.clearRect(0, 0, width, height); | |
var z = d3.hsl(++i % 360, 1, .5).rgb(), | |
c = "rgba(" + z.r + "," + z.g + "," + z.b + ",", | |
x = x0 += (x1 - x0) * .1, | |
y = y0 += (y1 - y0) * .1; | |
d3.select({}).transition() | |
.duration(2000) | |
.ease(Math.sqrt) | |
.tween("circle", function() { | |
return function(t) { | |
context.strokeStyle = c + (1 - t) + ")"; | |
context.beginPath(); | |
context.arc(x, y, r * t, 0, τ); | |
context.stroke(); | |
}; | |
}); | |
}); | |
function move() { | |
var mouse = d3.mouse(this); | |
x1 = mouse[0]; | |
y1 = mouse[1]; | |
d3.event.preventDefault(); | |
} | |
</script> |