我想重新调整d3.svg.axis的用途,以便使得刻度线变大且可拖动:
例如,在上面the axis whose code is here的屏幕截图中,当你将鼠标悬停在25或69上时,我希望鼠标变为四角形状,然后能够拖动刻度线左键和右键通过按住鼠标左键。
我可以看到d3自动生成的<svg>
代码为每个类别为“tick”的tick生成一个单独的<line>
元素:
所以我假设有一种方法来定位这些元素并让它们响应拖动,但我不清楚如何做到这一点。当然,线元素不应该在任何地方可拖动,而应该只沿水平轴左右滑动,并且不能移动到开始和结束刻度之外。
答案 0 :(得分:2)
我得到了这个工作:livecoding.io example
这里有相关的代码,不是特别干净但有效:
var w = h = 600;
var padding = 20;
var svg = d3.select("svg").attr("width", w).attr("height", h);
var xScale = d3.scale.linear()
.domain([0, 100])
.range([padding, w - padding * 2]);
var sharedAxis = function() {
return d3.svg.axis()
.scale(xScale)
.tickValues([19,69])
.tickSize(50);
}
var downAxis = sharedAxis()
.orient("bottom");
var upAxis = sharedAxis()
.orient("top");
var addPlayer = function(playerAxis) {
svg.append("g")
.attr("class", "axis")
.attr("transform", "translate(0," + (100) + ")")
.call(playerAxis);
}
addPlayer(downAxis);
addPlayer(upAxis);
var drag = d3.behavior.drag()
.on("drag", dragmove);
function dragmove(d) {
// move it
var curX = d3.select(this).attr("transform").match(/\(([^,]+),/)[1];
var newX = Math.max(xScale.range()[0], d3.event.x);
newX = Math.min(xScale.range()[1], newX);
var newTransform = d3.select(this).attr("transform").replace(/\([^,]+,/, "(" + newX + ",");
d3.select(this).attr("transform", newTransform);
// update text
d3.select(this).select("text").text(parseInt(xScale.invert(newX)));
}
var allTicks = d3.selectAll(".axis g").call(drag);