javascript - 如何在不重置刻度文本属性的情况下转换 D3 轴?

标签 javascript d3.js

我有一个 D3 项目,我在其中沿屏幕左侧绘制时间轴。我想让它在窗口调整大小时平滑过渡,所以我使用 D3 过渡。然而,轴设置似乎正在改变刻度标签上的“dy”属性,立即导致刻度标签向下跳,然后在 SVG 转换时转换回它们的正常位置。有没有办法将刻度文本的“dy”属性设置为轴调用的一部分或更好的过渡方式?

我的初始(一次性)轴设置:

var timeScale = d3.time.scale().domain([minTime, maxTime]);
var yAxis = d3.svg.axis().scale(timeScale).tickFormat(d3.time.format("%-m/%-d %-I:%M%p")).orient("right");

我有一个功能可以更新/转换我正在使用的 SVG 元素。第一次绘制 SVG init 设置为 true,之后设置为 false。

function updateSVG(init) {        
    ...
    timeScale.rangeRound([topPadding, svgHeight]);
    // Use a transition to update the axis if this is an update
    var t = (init) ? svgContainer : svgContainer.transition().duration(750);
    // {1}: Create Y axis
    t.select("g.axis").call(yAxis);
    // {2}: Move Y axis labels to the left side
    t.selectAll("g.tick > text")
        .attr("x", 4)
        .attr("dy", -4);
    ...
}

在 {1} 的更新中,刻度标签都具有来自先前 attr() 调用的“-4”的“dy”属性。在 {2} 处,应用轴将这些元素的“dy”属性重置为默认值“.32em”,之后它们缓慢过渡回“-4”,导致它们随着窗口大小和轴的调整而上下抖动被重新绘制。

这是一个有效的 JSFiddle,它演示了在调整结果框大小时在 y 轴上的跳转,仅调整几个像素,应该很明显:http://jsfiddle.net/YkDk4/1/

最佳答案

刚刚弄明白了。通过应用“transform”属性而不是“dy”属性,axis call() 不会覆盖该值。所以:

t.selectAll("g.tick > text")
    .attr("x", 4)
    .attr("dy", -4);

变成:

t.selectAll("g.tick > text")
    .attr("x", 4)
    .attr("transform", "translate(0,-4)");

一切都顺利过渡。

关于javascript - 如何在不重置刻度文本属性的情况下转换 D3 轴?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21099811/

相关文章:

javascript - 如何返回 Javascript 作为部分响应?

django - 图表未在 django-nvd3 中呈现

javascript - 使用 d3.js 和给定的 json 文件结构进行捆绑布局

javascript - 哈希键访问错误

javascript - 动态添加的 div 元素的加载事件上的 Html div

javascript - 图像已弃用的 lowsrc 的最佳替代方案是什么?

javascript - dc js - 创建多列维度

javascript - d3.js 中多个分组条形图中的 X,Y 域数据绑定(bind)

javascript - d3.js 中的转义字符

javascript - jQuery 将点替换为逗号并将其四舍五入