4

我在 svg 元素上使用 d3 的拖动行为,该元素可能需要放在可见区域之外。我将它设置在两个 div 中,溢出设置为自动以启用滚动。我只使用某些浏览器,但不是全部。

问题是在某些浏览器中,您可以在拖动时滚动,但在其他浏览器中,窗口在拖动时不会滚动。到目前为止,我还没有找到一种方法来使这项工作始终如一。

有关工作示例,请参见小提琴:http: //jsfiddle.net/glanotte/qd5Td/1/

这按预期工作:

chrome - mac/windows safari - mac

但不工作

火狐 - mac/windows IE - windows

html:

<div id="outerFrame">
    <div id="innerFrame">
        <svg width="600" height="600">
        </svg>
    </div>
</div>

CSS:

#outerFrame{
    width: 300px;
    height: 300px;
    border: 1px solid red;
    overflow: auto;
}

#innerFrame{
    width: 600px;
    height: 600px;
    background-color: lightgrey;
}

javascript:

var drag = d3.behavior.drag()
    .on("dragstart", dragstart)
    .on("drag", dragmove)
    .on("dragend", dragend);

function dragstart() {
  d3.select(this).style("border", "1px solid red");
}

function dragmove(d) {
    var coordinates = d3.mouse(d3.select("svg").node());
    d3.select(this).attr({
        x: coordinates[0] - 50,
        y: coordinates[1] - 25
    })

}

function dragend() {
  d3.select(this).style("border", null);
}

d3.select("svg")
    .append("rect")
    .attr({x: 100, y: 100, width: 100, height: 50})
    .call(drag);
4

1 回答 1

4

不幸的是,您在 Firefox中发现了一个错误,该错误已被mbostock 注意到并标记为 WONT-FIX

根据错误报告中的建议,您可以使其工作,但只能通过手动滚动容器:http: //jsfiddle.net/62CYD/

实现非常简单,可以通过以下方式改进:

  1. 使用动画
  2. 考虑到滚动条的宽度,就像DOMUtilityServiceng-grid.
  3. 将当前鼠标位置考虑在内,以避免拖动项目的捕捉和更平滑的滚动。
  4. setTimeout即使拖动停止,也可用于继续滚动
function dragmove(d) {
    var svg = d3.select("svg").node(),
        $parent = $('#outerFrame'),
        w = $parent.width(), h = $parent.height(),
        sL = $parent.scrollLeft(), sT = $parent.scrollTop();

    var coordinates = d3.mouse(svg),
        x = coordinates[0],
        y = coordinates[1];

    if (x > w + sL) {
        $parent.scrollLeft(x - w);  
    } else if (x < sL) {
        $parent.scrollLeft(x);
    }

    if (y > h + sT) {
        $parent.scrollTop(y - h);
    } else if (y < sT) {
        $parent.scrollTop(y);
    }

    d3.select(this).attr({
        x: x - 50,
        y: y - 25
    })
}
于 2013-11-02T00:11:27.990 回答