当前位置: 首页 > 知识库问答 >
问题:

如何制作动画svg饼图

陶博涉
2023-03-14

我需要用三个值的动画制作一个svg饼图,在代码中找不到我的错误。当我移除setTimeout(function(){circle.setAttribute(“Stroke-Dasharray”,p+“100”);},10);在JavaScript中,饼图看起来不错,但没有动画。当我添加这段代码时,它是动画的,但不是加载所有的值,而是逆时针加载,而不是顺时针加载。我不知道任何javascript,但需要添加两个额外的值到现有的饼图,并使用给定的javascript,我创建了两个额外的圆圈。只有一个圆圈的动画效果很好。我注意到最终结果(动画结束后留下的粉红色馅饼)来自。pie div35中的值,但是如果我将div留空,整个馅饼图就会消失。

HTML
 <div class="widgets">
  <div class="left box stats">
  <div class="content">
  <div class="widget-row">
     <div class="stat stat--pie stat--productivity">
       <div class="pie">35</div>
                              </div>
                            </div>
                        </div>
                    </div>
                </div>

CSS
.box.stats .stat.stat--pie {
  width: 170px;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
  -ms-flex-direction: column;
  flex-direction: column;
  -webkit-box-align: center;
  -webkit-align-items: center;
  -ms-flex-align: center;
  align-items: center;
}


.box.stats  .stat.stat--pie .pie {
  position: relative;
  height: 170px;
  width: 170px;
}

.box.stats  .stat.stat--pie .pie > svg {
  -webkit-transform: rotate(-90deg);
  -ms-transform: rotate(-90deg);
  transform: rotate(-90deg);
  width: 170px;
  height: 170px;
}

.box.stats  .stat.stat--pie .pie > svg circle {
  -webkit-transition: all 1.2s ease-out;
  -o-transition: all 1.2s ease-out;
  transition: all 1.2s ease-out;
}

.box.stats .content .stat.stat--productivity .pie svg  {
  border-radius: 50%;
}

.box.stats .content .stat.stat--productivity .pie svg circle {
  fill: none;
  stroke: #283250;
  stroke-width: 32;
}

.box.stats .content .stat.stat--productivity .pie svg .circle2 {
  fill: none;
  stroke: #E8E05A;
  stroke-width: 32;
}

.box.stats .content .stat.stat--productivity .pie svg .circle3 {
  fill: none;
  stroke: #E24264;
  stroke-width: 32;
}

JavaScript 
function $$(selector, context) {
context = context || document;
var elements = context.querySelectorAll(selector);
return Array.prototype.slice.call(elements);
}

$$('.stat--productivity .pie').forEach(function(pie) {
  var p = parseFloat(pie.textContent);
  var NS = "http://www.w3.org/2000/svg";
  var svg = document.createElementNS(NS, "svg");
  var circle = document.createElementNS(NS, "circle");
  var circle2 = document.createElementNS(NS, "circle");
  var circle3 = document.createElementNS(NS, "circle");
  var digit = document.createElement("H1");
  var percent = document.createElement("span");


  circle.setAttribute("r", 16);
  circle.setAttribute("cx", 16);
  circle.setAttribute("cy", 16);
  circle.setAttribute("stroke-dasharray", "100 100");
  setTimeout(function(){
  circle.setAttribute("stroke-dasharray", p + " 100");
  }, 10);


  circle2.classList.add('circle2');
  circle2.setAttribute("r", 16);
  circle2.setAttribute("cx", 16);
  circle2.setAttribute("cy", 16);
  circle2.setAttribute("stroke-dasharray", "90 100");
  setTimeout(function(){
    circle2.setAttribute("stroke-dasharray", p + " 100");
  }, 10);

  circle3.classList.add('circle3');
  circle3.setAttribute("r", 16);
  circle3.setAttribute("cx", 16);
  circle3.setAttribute("cy", 16);
  circle3.setAttribute("stroke-dasharray", "50 100");
  setTimeout(function(){
    circle3.setAttribute("stroke-dasharray", p + " 100");
  }, 10);


  svg.setAttribute("viewBox", "0 0 32 32");
  digit.textContent = pie.textContent;
  percent.textContent = '%';
  pie.textContent = '';

  pie.appendChild(svg);
  svg.appendChild(circle);
  svg.appendChild(circle2);
  svg.appendChild(circle3);
  pie.appendChild(digit);
  pie.appendChild(percent);

});

Link to codepen: https://codepen.io/anon/pen/jjRYwR

共有1个答案

米元凯
2023-03-14

下面是顺时针展开的多值图表的工作示例:https://jsfiddle.net/bowkugsq/

对原始代码有多处更改,但我试图尽可能多地保留这些更改,以便让OP理解更改并应用于自己的解决方案。

CSS为每个循环枚举了带有索引后缀的类。还有一组用于标签(图例)的类来反映饼图的颜色并进行更多的定制。如果想要在图表中添加下一个片段,则需要再添加一个circlelabel类。

$$('.stat--productivity .pie').forEach(function(pie) {
  var percents = pie.textContent.split(",");
  percents = percents.map(function(pct, idx) {
    return {
      value: parseFloat(pct),
      sum: 0,
      idx: idx + 1
    }
  });
  for (var i = 0; i < percents.length; i++) {
    var prevSum = (i > 0) ? percents[i - 1].sum : 1;
    percents[i].sum = prevSum + percents[i].value;
  };
  percents.reverse();
  var NS = "http://www.w3.org/2000/svg";
  var svg = document.createElementNS(NS, "svg");
  pie.textContent = ''; //clear div
  svg.setAttribute("viewBox", "0 0 32 32");
  pie.appendChild(svg);
  percents.forEach(function(pct, idx) {
    var circle = document.createElementNS(NS, "circle");
    circle.classList.add("circle" + pct.idx);
    circle.setAttribute("r", 16);
    circle.setAttribute("cx", 16);
    circle.setAttribute("cy", 16);
    circle.setAttribute("stroke-dasharray", "0 100");
    setTimeout(function() {
      circle.setAttribute("stroke-dasharray", pct.sum + " 100");
    });
    svg.appendChild(circle);
  });
  percents.forEach(function(pct, idx) {
    var digit = document.createElement("span");
    digit.textContent = pct.value + " %";
    digit.classList.add("label" + (idx + 1));
    pie.appendChild(digit);
  });
});
 类似资料:
  • 问题内容: 我想只使用具有svg / canvas和jsmax的css来动画化线条的渐进绘图。我想画的线的想法可以在这里找到 问题答案: 此答案中列出了三种技术: 有一个全SVG解决方案,涉及逐步修改形状以绘制越来越长的“破折号”,然后是巨大的空白。 演示:[http](http://phrogz.net/svg/progressively-drawing-svg-path-via- dashar

  • 问题内容: 我在制作JApplet并遇到动画问题。 这是我的代码: 有了它,就没有动画:在循环过程中什么也没发生,repaint()方法似乎只在精灵停止移动后才起作用。 我只想将Swing用于此目的,关于如何进行的任何想法? 谢谢阅读。 问题答案: 您应该使用a 来执行动画,而不要使用“线程睡眠”。这是一个很好的链接,可以助您一臂之力:http : //java.sun.com/docs/book

  • 如何在侧滑块中制作一些不同类型的动画。有图书馆吗?如果有图书馆,请提供我。

  • https://www.chunten.com/angpu/lottiefiles.html 这种动画是怎么制作出来的? 这种我之前一般是用adobe flash制作,后来用adobe animate制作,但我想弄成lottie动画: 像 把这个放到html里就可以看到动画了,但是flash和animate都不能实现,难道需要用adobe AE来制作吗??有没有具体的制作?可以直接生成这种动画js

  • 我将以下数据存储在一个数据框中。 我可以使用plotly(使用px.pie或go.pie)绘制单行的饼图。这里我绘制了最后一行的数据。 有没有一种方法可以创建一个动画饼图,一个接一个地显示每行的数据。它似乎ploly Express支持散点图和条形图的动画,但我找不到任何与饼图相关的东西。注意:我只是在寻找帮助来做这件事。我知道如何使用matplotlib。

  • 问题内容: 我正在尝试在特定时间段内对图像进行动画处理。它在Objective C中可以正常工作。但是,对于Swift来说却不起作用,我的错误在哪里? Objective-C的代码是- 快速代码是- 问题答案: 这不是快速代码。很快就会 修改后的代码: