Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在d3中是否可能有相互交互的分层svg元素?_Javascript_Svg_D3.js - Fatal编程技术网

Javascript 在d3中是否可能有相互交互的分层svg元素?

Javascript 在d3中是否可能有相互交互的分层svg元素?,javascript,svg,d3.js,Javascript,Svg,D3.js,我有一个条形图,它基本上是一个导航元素,所以我需要简单的可预测的滚动行为。基本上,我需要确保小条和大条一样容易点击,所以我已经将整个列设置为可点击的滚动 下面是我所指行为的一个例子: 我曾尝试使用d3和svg来实现这一点,但发现很难管理svg元素和div(或者svg元素和其他svg元素,老实说,我忘记了这是一个症结所在的确切性质)。但我记得我得出的结论是,实现我所期望的唯一有效方法是让每一列都是3个独立的svg元素,基本上是一个顶部背景、一个条形图,然后是一个底部背景,并在其中一个悬停时手动触

我有一个条形图,它基本上是一个导航元素,所以我需要简单的可预测的滚动行为。基本上,我需要确保小条和大条一样容易点击,所以我已经将整个列设置为可点击的滚动

下面是我所指行为的一个例子:

我曾尝试使用d3和svg来实现这一点,但发现很难管理svg元素和div(或者svg元素和其他svg元素,老实说,我忘记了这是一个症结所在的确切性质)。但我记得我得出的结论是,实现我所期望的唯一有效方法是让每一列都是3个独立的svg元素,基本上是一个顶部背景、一个条形图,然后是一个底部背景,并在其中一个悬停时手动触发所有3个项目以显示滚动变化


我最终放弃了svg,使用了所有div,只使用d3作为缩放方法,并使用knockout.js模板手工绘制所有内容。但现在我在看200行重构javascript,我想知道d3是否会给我一个更干净的解决方案。我是否在d3中遗漏了任何可以轻松完成我所寻找的内容的内容?

你真是太好了,因为你可以轻松地将这些列悬停!我将使用的技术是一个不可见的覆盖,其中包含指针事件:all,并且可以选择将mouseover侦听器分配给父svg:g元素,而不是一个rect

每个条的结构如下所示:

<g class="bar" transform="translate(0,…)">
  <rect class="green"></rect>
  <rect class="overlay"></rect>
</g>
绿色矩形正好是条的高度,垂直偏移,使条的底部位于y=0。红色的负矩形也是一样

简言之,带有指针事件的不可见rect all接收该条的所有指针事件。因此,您可以在父g元素上使用:hover样式,例如在hover上调整条颜色:

.bar:hover .green {
  fill: lightgreen;
}
同样,您可以在父g元素或overlay rect上注册“mouseover”和“mouseout”事件

.bar:hover .green {
  fill: lightgreen;
}