d3.js 更改类时未应用D3 CSS

ig9co6j1  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(261)

我有一个条形图,我想在点击一个条形图时改变颜色。我想在点击的元素上设置一个CSS类。除了填充样式(点击的条形图的颜色)没有改变外,其他一切都正常,但绿色的笔触被应用了。我不明白为什么。
这是单击图表

的最后一个条形之前和之后的屏幕
这就是我想要实现的

这是我的代码的一部分,有什么建议吗?

JS

//CREATE THE BAR CHART
var bars = d3
  .select("#bars")
  .selectAll("rect")
  .data(data);

bars
  .enter()
  .append("rect")
  .attr("x", function(d) {
    return xScale(d.year);
  })
  .attr("y", function(d) {
    return yScale(d.cost);
  })
  .attr("width", xScale.bandwidth)
  .attr("height", function(d) {
    return height - yScale(d.cost);
  })
  .style("fill", function(d) {
    return colorScale(d.cost);
  });

//EVENT ON CLICK
d3.select("#bars")
  .selectAll("rect")
  .on("click", function() {
    //reset the previus bar selected
    d3.select("#bars")
      .select(".selected")
      .classed("selected", false)
      .style("fill", function(d) {
        return colorScale(d.cost);  //reset the original color
      });
    //set the current bar as selected
    d3.select(this).classed("selected", true);
  });

CSS格式

.selected {
  fill: red;
  stroke: green;
  stroke-width: 3;
}
cl25kdpy

cl25kdpy1#

通常,属性样式会被使用选择器的CSS样式覆盖,而选择器又会被内联CSS样式覆盖。

  • .attr("fill", "blue")设置属性fill="blue";
  • .selected { fill: "red"; }应用fill: red;样式;
  • .style("fill", "green")会设定属性style="fill: green;"(内嵌样式)。

如果你把所有这些应用到同一个元素,最后一个元素优先。通过取消选择一个先前选择的条形,你给予它.style("fill",这样就覆盖了未来任何可能的样式。我建议你检查一下你是否真的需要应用这些样式,如果需要的话,就使用.attr()
我在下面添加了一个小橱窗。
第一个

相关问题