使用animation绘制圆形饼图,SVG绘制曲线形文字
HTML:
<div class="container-pie">
<div class="container">
<div class="outbox outbox1">
<!--–饼图–-->
<div class="pie">
53.8%
</div>
<!--–饼图内文字,tspan内的百分比根据实际百分比手动修改–-->
<div>
<svg xmlns="http://www.w3.org/2000/svg">
<defs>
<path d="M-4,101 a1,1 0 0,1 166,0" id="myTextPath">
</path>
</defs>
<defs>
<path d="M-3,40 a1,1 0 0,0 160,0" id="myTextPath2">
</path>
</defs>
<text style="text-anchor:start;font-size: 12px; fill:white;word-spacing: 0.5px;" y="100">
<textpath xlink:href="#myTextPath">
<tspan x="100">
城镇人口
</tspan>
<tspan dy="15" x="110">
53.8%
</tspan>
</textpath>
<textpath xlink:href="#myTextPath2">
<tspan x="100">
乡村人口
</tspan>
<tspan dy="15" x="110">
46.2%
</tspan>
</textpath>
</text>
</svg>
</div>
<div class="center-txt">
<div>
<span class="orangefont">
A城总人口
</span>
</div>
</div>
</div>
</div>
<div class="container">
<div class="outbox outbox2">
<!--–饼图–-->
<div class="pie">
34.56%
</div>
<!--–饼图内文字,tspan内的百分比根据实际百分比手动修改–-->
<div>
<svg xmlns="http://www.w3.org/2000/svg">
<defs>
<path d="M-4,101 a1,1 0 0,1 166,0" id="myTextPath">
</path>
</defs>
<text style="text-anchor:start;font-size: 12px; fill:white;letter-spacing: 0.5px;" y="100">
<textpath xlink:href="#myTextPath">
<tspan x="100">
鲜果类占比
</tspan>
<tspan dy="15" x="110">
34.56%
</tspan>
</textpath>
</text>
</svg>
</div>
<div class="center-txt">
<div>
<span>
市场农副产品消费总额
</span>
</div>
</div>
</div>
</div>
</div>
CSS:
.orangefont{color:#F96E3E;}
.pie{
border-radius:50%;
}
.outbox1 .pie{background: #FFBD5C;background-image:linear-gradient(to right,transparent 50%,#F96E3E 0);}
.outbox2 .pie{background: #31BD48;background-image:linear-gradient(to right,transparent 50%,#FFBD5C 0);}
.pie::before{
content:";
display: block;
margin-left: 50%;
height:100%;
border-radius:0 100% 100% 0 / 50%;
background-color:inherit;
transform-origin:left;
animation:spin 50s linear infinite,
bg 100s step-end infinite;
animation-play-state: paused;
animation-delay:inherit;
}
.outbox1 .pie::before{animation:spin 50s linear infinite,
bg1 100s step-end infinite;
animation-play-state: paused;
animation-delay:inherit;}
@keyframes spin{
to{transform: rotate(.5turn);}
}
@keyframes bg{
50%{background: #FFBD5C;}
}
@keyframes bg1{
50%{background: #F96E3E;}
}
.outbox{position: relative;}
.outbox>div{position: absolute;left:0;right:0;}
.outbox>div,svg{width:160px;height:160px;}
.center-txt{
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
justify-content:center;
align-items:center;
}
.center-txt>div{
width:80px;
height:80px;
background:#fff;
border-radius:50%;
color:#31BD48;
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
justify-content:center;
align-items:center;
text-align: center;
}
.container-pie{overflow: hidden;display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
justify-content:space-around;
align-content:space-around;
}
.container{width:160px;height:160px;float:left;margin:0 0%;}
JS :
function $$(selector, context) {
context = context || document;
var elements = context.querySelectorAll(selector);
return Array.prototype.slice.call(elements);
}
$$('.pie').forEach(function(pie) {
var p = pie.textContent;
var pf = parseFloat(p) / 100;
var pr = pf * 360 / 2;
console.log(pr);
pie.style.transform = "rotateZ(-" + pr +"deg)";
pie.style.animationDelay = '-' + parseFloat(p) + 's';
pie.textContent = "";
});