javascript - 如何使用 D3.js 正确缩放?

标签 javascript jquery css d3.js

我正在尝试在我的 D3 图形上进行缩放。

我目前找到了一种解决方案,可以在具有有序 x 轴的同时使我的缩放工作,但我无法使 x 轴缩放与圆形和方形元素匹配。放大得越多,它们就越“不合时宜”。

这是我当前代码的一个 JS fiddle ,我试图在其中实现我的缩放。

http://jsfiddle.net/Vanquiza/c794g977/3/

我想知道如何正确实现缩放以使元素不会错位。

下面我粘贴了我的缩放功能:

var zoom = d3.behavior.zoom()
    .scaleExtent([1, 10])
    .on("zoom", zoomHandler);

function zoomHandler() {
    var translate = zoom.translate(),
    scale = zoom.scale();

    var tx = Math.min(0, Math.max(width * (1 - scale), translate[0]));
    var ty = Math.min(0, Math.max(height * (1 - scale), translate[1]));

    zoom.translate([tx, ty]);

    //svg.select(".x.axis").call(xAxis);
    svg.selectAll(".circleNodes")
        .attr("transform", "translate(" + d3.event.translate[0]+",0)scale(" + d3.event.scale + ",1)");

    svg.selectAll(".squareNodes")
        .attr("transform", "translate(" + d3.event.translate[0]+",0)scale(" + d3.event.scale + ",1)");

    svg.select(".x.axis").attr("transform", "translate(" + d3.event.translate[0]+","+(height)+")")
        .call(xAxis.scale(x.rangeRoundBands([0, (width * d3.event.scale)],1 * d3.event.scale)));

}

非常感谢任何帮助!

最佳答案

完全删除转换。所有的调整都可以通过修改序数比例来完成,并考虑那里的翻译。

x.rangeBands([d3.event.translate[0], d3.event.translate[0]+(width * d3.event.scale)], 1)

(切换到使用 rangeBands() 而不是 rangeRoundBands() 以消除抖动。)

然后您只需调整所有圆圈和正方形的位置,并根据这个新比例重新渲染轴。

svg.select(".x.axis").call(xAxis)
circle.attr("cx", function(d){ return x(d);})
square.attr("x", function(d){ return x(d) - squareSize/2;})

这是工作 jsFiddle

关于javascript - 如何使用 D3.js 正确缩放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28868093/

相关文章:

javascript - chrome 扩展拒绝执行内联脚本

javascript - 在循环中调用多个异步调用未按预期工作

javascript - 使用 sortable.js 时禁用 bootstrap wysihtml5

javascript - 如何使用光谱颜色选择器隐藏某些颜色

css - 为什么 MuiThemeProvider 会覆盖组件样式?

javascript - 拆分 HTML 表格以适合视口(viewport)宽度

javascript - 未捕获的类型错误 : Cannot call method 'getElementsByTagName' of null

javascript - native 或通过 jQuery 访问 dom 对象?

jquery - 如何获得彩色的 JQuery 图标而不是黑色

jQuery 在多列下拉菜单上放置阴影