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

标签 javascript css d3.js

有时我需要在节点链接图中以非常小的笔划宽度 (< 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/

相关文章:

css - 文本输入和图像 Firefox 对齐问题

javascript - D3 Zoom 重置通过刷选选择的比例。

javascript - d3 js - 在没有 http get 的情况下加载 json

javascript - 在 d3js 强制布局中更新某些节点的样式

javascript - 为什么 JavaScript 中的 "Infinity==Infinity"变为真?

javascript - 如何使撤消和重做与我的文本同步解决方案配合使用?

angularjs - SASS CSS css 修复包含在自定义类名中?

javascript - 如何在 JavaScript 中使用关联数组来检索用户?

javascript - 未保存的更改警告弹出窗口

javascript - 把图标变成黑白