var svg = d3.select("body")
.append("svg")
.attr("width", 500)
.attr("height", 300);
var drag = d3.drag()
.on("drag",dragged)
.on("end", dragEnd);
var squares = svg.selectAll("rect")
.data([{x:30},{x:130},{x:230},{x:330},{x:430}])
.enter()
.append("rect")
.attr("x", function(d) { return d.x; })
.attr("y", 120)
.attr("width", 40)
.attr("height",40)
.attr("fill","white")
.on("mouseenter", function(d) { d.active = true; })
.on("mouseout", function(d) { d.active = false; });
var circles = svg.selectAll("circle")
.data(d3.range(20))
.enter()
.append("circle")
.attr("cx", function(d) { return d/21*500 + 25; })
.attr("cy", function(d) { return d%2 * 40 + 50; })
.attr("r", 10)
.attr("fill", function(d) { return d3.schemeCategory20[d]; })
.call(drag);
function dragged(d) {
var x = d3.mouse(this)[0];
var y = d3.mouse(this)[1];
d3.select(this)
.attr("cx",x)
.attr("cy",y)
.style("pointer-events","none");
}
function dragEnd(d) {
var rect = squares.filter(function(d) {
return d.active;
})
if(!rect.empty()) {
var circle = d3.select(this);
rect.attr("fill",interpolateColor(rect,circle));
circle.remove();
}
else {
d3.select(this).style("pointer-events","all");
}
}
function interpolateColor(r,c) {
return d3.interpolateLab(r.attr("fill"),c.attr("fill"))(0.5)
}
svg {
stroke: black;
stroke-width: 2px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.10.0/d3.min.js"></script>