首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于3d条形图的D3.js“成长”路径动画

用于3d条形图的D3.js“成长”路径动画
EN

Stack Overflow用户
提问于 2021-05-09 19:50:19
回答 1查看 58关注 0票数 1

我正在尝试将经典动画添加到伪3D条形图中。使用rect很容易做到这一点。但是path呢?

我有三个3d效果的基本路径:如何制作一个和谐的生长动画?

代码语言:javascript
复制
  createColumns(bars, data) {
    //...skip code

    bars
      .data(data)
      .append('path')
      .attr(
        'd',
        (d) => `M 0,0 V ${rectHeight(d.value)} H ${rectWidth()} V 0 H 0 Z`,
      )
      .attr('class', 'forward-bar')
      .classed('bar', true);

    bars
      .data(data)
      .append('path')
      .attr(
        'd',
        () =>
          `M 0,0 L ${rectWidth()},0 L ${
            rectWidth() + depth
          }, ${-depth} H ${depth} Z`,
      )
      .attr('class', 'top-bar')
      .classed('bar', true);

    bars
      .data(data)
      .append('path')
      .attr(
        'd',
        (d) =>
          `M ${rectWidth()},0 L ${rectWidth() + depth},${-depth}, V ${
            rectHeight(d.value) - depth
          } L ${rectWidth()} ${rectHeight(d.value)} Z`,
      )
      .attr('class', 'side-bar')
      .classed('bar', true);
  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-09 20:39:07

使用D3转换实现(设置持续时间,单位为毫秒):

代码语言:javascript
复制
const add3DBar = (parent, xPos, yPos, width, height, depth, duration) => {
  const g = parent.append('g').attr('transform', `translate(${xPos}, ${yPos})`);
  
  g.append('path')
   .attr('d', `M 0,0 V ${0} H ${width} V 0 H 0 Z`)
   .style('fill', '#000081')
   .transition()
   .duration(duration)
   .attr('d', `M 0,0 V ${-height} H ${width} V 0 H 0 Z`);
  
  g.append('path')
   .attr('d', `M 0,${0} L ${depth},${-depth} H ${depth + width} L ${width},0 Z`)
   .style('fill', '#0000FF')
   .transition()
   .duration(duration)
   .attr('d', `M 0,${-height} L ${depth},${-height-depth} H ${depth + width} L ${width},${-height} Z`);

  g.append('path')
   .attr('d', `M ${width},0 L ${width + depth},${-depth}, V ${-depth} L ${width},0 Z`)
   .style('fill', '#0000C0')
   .transition()
   .duration(duration)
   .attr('d', `M ${width},0 L ${width + depth},${-depth}, V ${-height-depth} L ${width},${-height} Z`);
}

const svg = d3.select('svg');

add3DBar(svg, 30, 150, 30, 100, 10, 500);
add3DBar(svg, 70, 150, 30, 70, 10, 1000);
add3DBar(svg, 110, 150, 30, 120, 10, 1500);
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<svg>
</svg>

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67457363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档