[英]scroll while dragging element with d3.js
我在svg元素上使用d3的拖动行为,可能需要将其拖放到可见区域之外。 我将它设置在两个div中,溢出设置为auto以启用滚动。 我有这个只与一些浏览器合作但不是全部。
问题是在某些浏览器中,您可以在拖动时滚动,但在其他浏览器中,窗口在拖动时不会滚动。 到目前为止,我还没有找到一种方法来使这项工作始终如一。
一个工作的例子,请看小提琴: http : //jsfiddle.net/glanotte/qd5Td/1/
这正如预期的那样:
chrome - mac / windows safari - mac
但不是在努力
Firefox - 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);
你不幸遇到了Firefox中的一个bug,这个bug已被mbostock注意到并标记为WONT-FIX 。
根据错误报告中的建议,您可以使其工作,但只能通过手动滚动容器: http : //jsfiddle.net/62CYD/
实现非常简单,可以通过以下方式改进:
ng-grid
中的DOMUtilityService
中所做的DOMUtilityService
。 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
})
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.