d3 缩放和滑块问题一起工作

d3 zoom and slider issue working together

我有一个 SVG 图形,它与 d3 缩放完美配合。但是,需求是添加滑块,并通过滑块和鼠标滚轮控制缩放。

我现在面临的问题是生成一个转换对象,例如: 让 sliderScale = zoomIdentityManual.scale(newK); // newK 是我计算的基于滑块的新比例。

又好了。但是当用户在滑块之后开始通过鼠标缩放时,图形会跳来跳去。我明白为什么。因为来自鼠标的事件与我手动生成的转换对象完全独立。

我找到了这个例子,(http://bl.ocks.org/bollwyvl/871b7c781b92fd0044f5),主要区别在于 d3 的版本。它是 v3,我正在使用 v4。正如您在滑动函数中看到的那样:

function slided(d) { zoom.scale(d3.select(this).property("value")) .event(svg); }

看起来像 .event(svg),这就是当前事件发生变化的地方。但是版本4没有这样的方法。

总而言之,有没有什么方法可以使滑块和d3 缩放一起顺利工作?

我的问题是当滑块移动时我没有正确缩放。我直接调用函数,但我需要调用 svg 上的缩放操作,如:

  svg.select(".zoom").call(zoom.transform, d3.zoomIdentity
      .scale(width / (s[1] - s[0]))
      .translate(-s[0], 0));

zoom.transform 是诀窍

//css

      <style>

      .dot circle {
        fill: lightsteelblue;
        stroke: steelblue;
        stroke-width: 1.5px;
      }

      .dot circle.dragging {
        fill: red;
        stroke: brown;
      }

      .axis line {
        fill: none;
        stroke: #ddd;
        shape-rendering: crispEdges;
        vector-effect: non-scaling-stroke;
      }

      </style>


//HTML
 <p class="panzoom"></p>
 <svg width="100%" height="410"></svg>


// js code
    var svg = d3.select("svg"),
                 width = +svg.attr("width"),
                 height = +svg.attr("height");
             var newTag = svg.append("g");

    var zoom = d3.zoom()
                 .scaleExtent([.3, 2])
                 .on("zoom", zoomed);

             var slider = d3.select(".panzoom").append("input")
               .datum({})
               .attr("type", "range")
               // .attr("value", zoom.scaleExtent()[0])
               .attr("min", zoom.scaleExtent()[0])
               .attr("max", zoom.scaleExtent()[1])
               .attr("step", (zoom.scaleExtent()[1] - zoom.scaleExtent()[0]) / 100)
               .on("input", slided);

             function zoomed() {
               const currentTransform = d3.event.transform;
                         newTag.attr("transform", currentTransform);
                         slider.property("value", currentTransform.k);
             }

             function slided(d){
                zoom.scaleTo(newTag, d3.select(this).property("value"));
             }