簡體   English   中英

在d3.js可視化中將mouseover與mouseout事件區分開

[英]differentiating mouseover from mouseout event in d3.js visualization

我正在將此d3.js示例用於可視化項目。 我在更改線條樣式時遇到麻煩。 我希望鼠標移出時線條為灰色,鼠標移過時線條為紅色。 現在的問題是,當鼠標不在所有行中時,行是紅色,而我需要它們是灰色,而當鼠標在一行上時,行將變為紅色,其余行保持灰色。 請幫我。 這是原始示例

這是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])];
  }));
}

這里的投影包含來自多個類的元素。 因此,請分別選擇所有線條,並在鼠標懸停時更改其樣式,並在鼠標懸停部分撤消更改。

修改后的功能如下,請根據需要更改樣式。 同時將.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")});
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM