gpt4 book ai didi

javascript - D3 将鼠标悬停在节点链接图中的链接上,增加 'accepted' 范围

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:59:52 25 4
gpt4 key购买 nike

有时我需要在节点链接图中以非常小的笔划宽度 (< 3px) 显示边。这使得用户很难将鼠标悬停在它们上面。

我正在使用 .on('mouseover', () =>//do stuff) 函数。

有没有一种简单的方法可以增加触发鼠标悬停事件的半径?假设它应该始终假定边缘的描边宽度至少为 5 像素。

我正在为边缘动态着色,但是否有办法将边缘的颜色设置为类似的颜色(将灰色面板视为边缘,水平布局):

transparent (2px)
color (1px)
transparent (2px)

所以它实际上有 5px 的大小,但只有 1px 是可见的?

或者我真的必须手动计算我的边缘是否与我的鼠标重叠吗? (这绝对是可能的,但考虑到一些边缘是 flex 的,而另一些则不是,......这真的很麻烦)。

最佳答案

Is there an easy way to increase the radius that would trigger the mouseover event?

不,事件处理程序被添加到元素,如果窄元素的笔画宽度为 3px,则该函数仅在鼠标悬停在这些像素上时运行。

Is there maybe a way to set the color of the edge to something like [...] it actually has a size of 5px, but only 1px is visible?

这可以使用路径并将彩色填充与透明描边相结合。然而,一种更简单的方法是复制选择,具有完全相同的相同属性,并使顶部路径或线(“顶部”我指的是代码后面的选择)透明和具有更大的笔画宽度。

例如,在这个演示中,有 20px 宽的透明线,它在可见的窄线上捕获 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>

关于javascript - D3 将鼠标悬停在节点链接图中的链接上,增加 'accepted' 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42743543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com