我正在使用d3编写甘特图。
我有一个时间刻度尺xScale(Time)。
this.xScale = d3.scaleTime()
.domain([this.startDate,this.endDate])
.range([0,this.getWidth()]);
并将y轴比例尺调整为分段比例尺(资源)
this.yScale = d3.scaleBand()
.domain(resources.map(function(res){
return res.res_num;
}))
.rangeRound([0,this.getHeight()])
.paddingInner(.3)
问题是我需要将任务(SVG矩形)从一个资源拖放到另一个资源。
当我拖动时,我使用transform使其在SVG上移动。
_onDrag : function(d)
{
var x = d3.event.dx+d3.event.x;
var y = d3.event.dy+d3.event.y;
d3.select(this).raise().attr("transform","translate(" + [x,y] + ")");
},
但在放下时,我必须按照以下逻辑处理:
- 矩形不应该在资源之间,所以需要根据d3.event.y将其转换为任何一个区间。
- x轴上有反转比例尺,但y轴上没有。如何解决?
var paddingOuter = scale(domain[0]);
- Llorenç Pujol FerriolMath.round
和paddingInner
:var paddingInner = scale.step() * scale.paddingInner();
然后var index = Math.round((x - scaleStart - paddingInner / 2) / eachBand);
- tgordon18const paddingOuter = scale.paddingOuter();
而不是const paddingOuter = scale(domain[0]);
,它会更精确地起作用。 - Omar Omeiri