javascript - 在 d3.js 可视化中区分 mouseover 和 mouseout 事件

标签 javascript css d3.js

我将此 d3.js 示例用于可视化元素。我无法更改线条样式。我希望鼠标离开时线条为灰色,鼠标结束时线条为红色。 现在的问题是,当鼠标超出所有行时,行是红色的,而我需要它们是灰色的,当鼠标在一行上时,它会变红,其余的保持灰色。 请帮我。这是 original example .

这是CSS。

svg {
  font: 10px sans-serif;
}

.background path {
  fill: none;
  stroke: none;
  color:#ccc;
  stroke-width: 20px;
  pointer-events: stroke;
}

.foreground path {
  fill: none;
  stroke: red;
  stroke-width: 1.5px;
}

.axis .title {
  font-size: 11px;
  font-weight: bold;
  text-transform: uppercase;
}

.axis line,
.axis path {
  fill: none;
  stroke:  #000;
  shape-rendering: crispEdges;
}

.label {
  -webkit-transition: fill 125ms linear;
}

.active .label:not(.inactive) {
  font-weight: bold;
}

.label.inactive {
  fill: #ccc;
}

.foreground path.inactive {
  stroke: #ccc;
  stroke-opacity: .5;
  stroke-width: 1px;
}   

这是 d3 示例的 Javascript。

var margin = {top: 30, right: 40, bottom: 20, left: 200},
    width = 1000 - margin.left - margin.right,
    height = 500 - margin.top - margin.bottom;

var dimensions = [
  {
    name: "مبدأ",
    scale: d3.scale.ordinal().rangePoints([0, height]),
    type: String
  },
  {
    name: "شغل",
    scale: d3.scale.ordinal().rangePoints([0, height]),
    type: String
  },
  {
    name: "کار (ساعت)",
    scale: d3.scale.ordinal().rangePoints([0, height]),
    type: String
  },
  {
    name: "مُد",
    scale: d3.scale.ordinal().rangePoints([0, height]),
    type: String
  },
  {
    name: "جابه‌جایی (ساعت)",
    scale: d3.scale.ordinal().rangePoints([0, height]),
    type: String
  },
  {
    name: "استراحت (ساعت)",
    scale: d3.scale.ordinal().rangePoints([0, height]),
    type: String
  },
  {
    name: "مقصد",
    scale: d3.scale.ordinal().rangePoints([0, height]),
    type: String
  }
];

var x = d3.scale.ordinal()
    .domain(dimensions.map(function(d) { return d.name; }))
    .rangePoints([0, width]);

var line = d3.svg.line()
    .defined(function(d) { return !isNaN(d[1]); });

var yAxis = d3.svg.axis()
    .orient("left");

var svg = d3.select("body").append("svg")
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom)
  .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

var dimension = svg.selectAll(".dimension")
    .data(dimensions)
  .enter().append("g")
    .attr("class", "dimension")
    .attr("transform", function(d) { return "translate(" + x(d.name) + ")"; });

d3.tsv("DataEntryabridged.tsv", function(error, data) {
  if (error) throw error;

  dimensions.forEach(function(dimension) {
    dimension.scale.domain(dimension.type === Number
        ? d3.extent(data, function(d) { return +d[dimension.name]; })
        : data.map(function(d) { return d[dimension.name]; }).sort());
  });

  svg.append("g")
      .attr("class", "background")
    .selectAll("path")
      .data(data)
    .enter().append("path")
      .attr("d", draw);

  svg.append("g")
      .attr("class", "foreground")
    .selectAll("path")
      .data(data)
    .enter().append("path")
      .attr("d", draw);

  dimension.append("g")
      .attr("class", "axis")
      .each(function(d) { d3.select(this).call(yAxis.scale(d.scale)); })
    .append("text")
      .attr("class", "title")
      .attr("text-anchor", "middle")
      .attr("y", -9)
      .text(function(d) { return d.name; });

  // Rebind the axis data to simplify mouseover.
  svg.select(".axis").selectAll("text:not(.title)")
      .attr("class", "label")
      .data(data, function(d) { return d.name || d; });

  var projection = svg.selectAll(".axis text,.background path,.foreground path")
      .on("mouseover", mouseover)
      .on("mouseout", mouseout);

  function mouseover(d) {
    svg.classed("active", true);
    projection.classed("inactive", function(p) { return p !== d; });
    projection.filter(function(p) { return p === d; }).each(moveToFront);
  }

  function mouseout(d) {
    svg.classed("active", false);
    projection.classed("inactive", false);
  }

  function moveToFront() {
    this.parentNode.appendChild(this);
  }
});

function draw(d) {
  return line(dimensions.map(function(dimension) {
    return [x(dimension.name), dimension.scale(d[dimension.name])];
  }));
}

最佳答案

此处的投影包含来自多个类的元素。因此,分别选择所有行并在 mouseover 和 mouseout 部分撤消时更改它们的样式。

修改后的功能如下,根据需要更改样式。同时将 .foreground 路径填充更改为 #ccc(默认颜色)。

希望对您有所帮助!

function mouseover(d) {
    svg.classed("active", true);
    projection.classed("inactive", function(p) { return p !== d; });
    projection.filter(function(p) { return p === d; }).each(moveToFront);
    // new line added 
    svg.selectAll(".foreground path").filter(function(p) { 
        return p === d;}).each(function(i) { d3.select(this).style("stroke", "red")}); }

function mouseout(d) {
   svg.classed("active", false);
   projection.classed("inactive", false);
   // new line here
   svg.selectAll(".foreground path").each(function(i) { 
   d3.select(this).style("stroke", "#ccc")});
}

关于javascript - 在 d3.js 可视化中区分 mouseover 和 mouseout 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46703586/

相关文章:

java - Java环境中预编译的Handlebars模板

javascript - 将变量从 Express 传递到客户端 JavaScript

html - AngularJS 指令与带有类的 HTML 样式

html - 输入按钮在页面刷新时移动?

javascript - 按多边形中的点过滤并返回县 ID/名称

javascript - D3 js 在快速鼠标单击时出现意外行为

javascript - 当我在文件上传的图像上绘制鼠标单击矩形时,图像突然消失了

javascript - 如何在特定操作上从 Ember 2 调用 Bootstrap jquery 函数

javascript - IE 不允许动态创建的 DOM 'a' 元素上的 onClick 事件

javascript - d3 无法在 safari 中绘制日期轴,解析错误