Javascript 从5迁移到5很复杂3@yavg,我用如何使用d3数据联接添加多个数据点的示例更新了我的答案。谢谢!我必须将v5的这一部分翻译成v3。谢谢大家!@yavg,我认为你需要的唯一翻译是,。在(“结束”,function(){变成。每个(“结束”,function

Javascript 从5迁移到5很复杂3@yavg,我用如何使用d3数据联接添加多个数据点的示例更新了我的答案。谢谢!我必须将v5的这一部分翻译成v3。谢谢大家!@yavg,我认为你需要的唯一翻译是,。在(“结束”,function(){变成。每个(“结束”,function,javascript,d3.js,Javascript,D3.js,从5迁移到5很复杂3@yavg,我用如何使用d3数据联接添加多个数据点的示例更新了我的答案。谢谢!我必须将v5的这一部分翻译成v3。谢谢大家!@yavg,我认为你需要的唯一翻译是,。在(“结束”,function(){变成。每个(“结束”,function(){)都是这一行d3。在v3到d3中选择(g[I]).transition().ease(d3.easeBounceOut)。选择(this)。transition()。ease(“bounce”)?不适合我:( CircleNumb


从5迁移到5很复杂3@yavg,我用如何使用
d3
数据联接添加多个数据点的示例更新了我的答案。谢谢!我必须将v5的这一部分翻译成v3。谢谢大家!@yavg,我认为你需要的唯一翻译是,
。在(“结束”,function(){
变成
。每个(“结束”,function(){
)都是这一行d3。在v3到d3中选择(g[I]).transition().ease(d3.easeBounceOut)。选择(this)。transition()。ease(“bounce”)?不适合我:(
    CircleNumber=Math.round(15)
    const svg = d3.select("body").append("svg").attr("width",250).attr("height",250);
    const data = Array.from(Array(CircleNumber).keys());
            var emanatingCircles=[];
    const radialGradient = svg.append("defs")
                              .append("radialGradient")
                              .attr("id", "radial-gradient");

    radialGradient.append("stop")
                      .attr("offset", "0%")
                      .attr("stop-color", "#f4425f");

    radialGradient.append("stop")
                    .attr("offset", "100%")
                    .attr("stop-color", "orange");
  for(var i=0; i<2; i++){

    // Outer 
    svg.append("circle")
       .classed('OuterCircle', true)
       .attr("id","fuera")
       .attr("cx",50*(i+2))
       .attr("cy",50*(i+2))
       .attr("r",10)
       .attr("fill","url(#radial-gradient)")
       .attr('gradient',()=>{return })
       .attr("stroke","orange")    
       .on('mouseover',function(d,i,g){
         console.log(g)
            d3.select(this).transition().ease("bounce").duration(500).attr("r",13)
         })
       .on('mouseout', function(d,i,g){
           d3.select(this).transition().ease("bounce").duration(500).attr("r",10)
         });
    // Inner
    svg.append('circle')
       .classed('InnerCircle',true)
       .attr('r',5)
       .attr("id","dentro")
       .attr('stroke','yellow')
       .attr('fill','yellow')
       .attr('opacity',1)
       .attr('cx',50*(i+2))
       .attr('cy',50*(i+2))
       .on('mouseover',function(d,i,g){
            console.log('outercircle');
            console.log(g[i]);
            d3.select(this).transition().ease("bounce").duration(500).attr("r",7)
         })
       .on('mouseout', function(d,i,g){
           d3.select(this).transition().ease("bounce").duration(500).attr("r",5)
         });

    emanatingCircles[i] = svg
      .append('circle')
      .attr('class','emanting')
      .attr('r',5)
      .attr('stroke','yellow')
      .attr('fill','none')
      .attr('opacity',1)
      .attr('stroke-width',2)
      .attr('cx',50*(i+2))
      .attr('cy',50*(i+2))


      emananting(i);

  }  


  function emananting(index) {
      console.log(index)
      emanatingCircles[index]
          .transition().duration(5000)
          .attr('opacity', 0)
          .attr('r', 20)
          .transition().duration(0)
          .attr('opacity', 0)
          .attr('r', 5)
          .each('end',()=>emananting(index)); // pass in a emananting function
      emanatingCircles[index].attr("opacity", 1);
  } 
function emananting() {
  var n = 0; // counter of how many transitions
  svg.selectAll('circle.emanting')
    .attr('r', 20) // set initial radius
    .style('opacity', 1) // and opacity
    .transition()
    .each(function() { ++n; }) // increment counter for each transition
    .duration((d, i) => {
      return 5000;
    })
    .delay((d, i) => {
      return i * 1000;
    })
    .attr('r', 50)
    .style('opacity', 0)
    .on("end", function() { 
       if (!--n) emananting(); // when all transitions end, restart emananting
    }); 
}