D3: Is it possible to zoom+pan one axis and only pan the other?

前端 未结 3 1784
北海茫月
北海茫月 2020-12-28 16:34

I have zoom and pan working for the x axis but I\'d like to add panning for the y axis. I tried using d3.behavior.zoom and d3.event.translate[1] to

3条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-28 17:15

    You can use

    zoom.center
    to get the code a bit cleaner, like this:

    var lastY = 0;
    var x = d3.scale.linear()
      .domain([0, 800])
      .range([0, 800]);
    
    var y = d3.scale.linear()
      .domain([0, 800])
      .range([0, 800]);
    
    var rectangleSelector = d3.select('svg')
      .append('g')
      .selectAll('rect')
      .data([[0, 0], [50, 50], [100, 100]])
      .enter()
      .append('rect')
      .attr('fill', 'black')
      .attr('x', d => x(d[0]))
      .attr('y', d => y(d[1]))
      .attr('width', d => x(d[0] + 40) - x(d[0]))
      .attr('height', d => y(40));
      
     var zoom = d3.behavior.zoom().center([400, 400]).x(x);
     zoom.on('zoom', () => {
         var translateY = d3.event.translate[1];
         zoom.center([400, translateY]);
         rectangleSelector.attr('x', d => x(d[0]))
                          .attr('y', d => y(d[1] + translateY))
                          .attr('width', d => x(d[0] + 40) - x(d[0]))
                          .attr('height', d => y(40));
    });
    
    d3.select('svg').call(zoom);
    
    

提交回复
热议问题