有时,我需要用非常小的笔画宽度(< 3px)在节点链接图中显示边缘。这使得用户很难在上面悬停。
我使用的是.on('mouseover', () => //do stuff)函数。
有没有一种简单的方法来增加半径来触发鼠标移动事件?比方说,它应该总是假设边沿的笔画宽度至少为5 5px。
我正在动态地着色边缘,但是否有一种方法可以将边缘的颜色设置为类似的东西(请将灰色面板作为边沿,水平排列):
transparent (2px)
color (1px)
transparent (2px)所以它的大小实际上是5 5px,但只有1 5px是可见的?
或者我真的需要计算我的边缘是否与我的鼠标重叠?(这是绝对可能的,但考虑到某些边是弯曲的,而另一些则不是,.这真的很麻烦)。
发布于 2017-03-12 05:49:00
有没有一种简单的方法来增加半径来触发鼠标移动事件?
不,事件处理程序将添加到元素中,如果一个窄元素的笔画宽度为3 3px,则该函数只有在鼠标位于这些像素上时才会运行。
有没有办法把边缘的颜色设置成.它的大小实际上是5 5px,但只有1 5px是可见的吗?
这是可能的,使用一条路径,并结合一个彩色填充和透明的笔画。然而,一种更简单的方法是复制选择,与完全相同的属性,并使顶部路径或行(我的意思是代码后面的选择)透明并具有更大的笔画宽度。
例如,在本演示中,在可见的窄行上有20 In范围的透明行,它们捕获mousemove事件:
//these lines are painted first
var links = svg.selectAll("foo")
.data(edges)
.enter()
.append("line")
.style("stroke", "#ccc")
.style("stroke-width", 1);
//these transparent lines are painted on top, and they capture the mousemove
var linksTransparent = svg.selectAll("foo")
.data(edges)
.enter()
.append("line")
.style("stroke", "none")
.attr("pointer-events", "all")
.style("stroke-width", 20)
.on("mousemove", d => {
console.log("source: " + d.source.id + ", target: " + d.target.id)
});
var width = 400;
var height = 200;
var svg = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height);
var nodes = [{
"id": "One"
}, {
"id": "Two"
}, {
"id": "Three"
}, {
"id": "Four"
}];
var edges = [{
"source": 0,
"target": 1
}, {
"source": 0,
"target": 2
}, {
"source": 0,
"target": 3
}];
var simulation = d3.forceSimulation()
.force("link", d3.forceLink().distance(60))
.force("charge", d3.forceManyBody().strength(-200))
.force("center", d3.forceCenter(width / 2, height / 2));
var links = svg.selectAll("foo")
.data(edges)
.enter()
.append("line")
.style("stroke", "#ccc")
.style("stroke-width", 1);
var links2 = svg.selectAll("foo")
.data(edges)
.enter()
.append("line")
.style("stroke", "none")
.attr("pointer-events", "all")
.style("stroke-width", 20)
.on("mousemove", d => {
console.log("source: " + d.source.id + ", target: " + d.target.id)
});
var color = d3.scaleOrdinal(d3.schemeCategory20);
var node = svg.selectAll("foo")
.data(nodes)
.enter()
.append("g")
.call(d3.drag()
.on("start", dragstarted)
.on("drag", dragged)
.on("end", dragended));
var nodeCircle = node.append("circle")
.attr("r", 10)
.attr("stroke", "gray")
.attr("fill", (d, i) => color(i));
var texts = node.append("text")
.style("fill", "black")
.attr("dx", 20)
.attr("dy", 8)
.text(function(d) {
return d.id;
});
simulation.nodes(nodes);
simulation.force("link")
.links(edges);
simulation.on("tick", function() {
links.attr("x1", function(d) {
return d.source.x;
})
.attr("y1", function(d) {
return d.source.y;
})
.attr("x2", function(d) {
return d.target.x;
})
.attr("y2", function(d) {
return d.target.y;
});
links2.attr("x1", function(d) {
return d.source.x;
})
.attr("y1", function(d) {
return d.source.y;
})
.attr("x2", function(d) {
return d.target.x;
})
.attr("y2", function(d) {
return d.target.y;
});
node.attr("transform", (d) => "translate(" + d.x + "," + d.y + ")")
});
function dragstarted(d) {
if (!d3.event.active) simulation.alphaTarget(0.3).restart();
d.fx = d.x;
d.fy = d.y;
}
function dragged(d) {
d.fx = d3.event.x;
d.fy = d3.event.y;
}
function dragended(d) {
if (!d3.event.active) simulation.alphaTarget(0);
d.fx = null;
d.fy = null;
}<script src="https://d3js.org/d3.v4.min.js"></script>
https://stackoverflow.com/questions/42743543
复制相似问题