Built with blockbuilder.org
forked from Sokrates86's block: Progressive pie chart 1
license: mit |
Built with blockbuilder.org
forked from Sokrates86's block: Progressive pie chart 1
<!DOCTYPE html> | |
<head> | |
<meta charset="utf-8"> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script> | |
<style> | |
body { margin:0;position:fixed;top:0;right:0;bottom:0;left:0; } | |
svg { width:100%; height: 100% } | |
body { | |
background-color: #1B1F2A; | |
width: 100%; | |
font-family: 'Roboto', sans-serif; | |
height: 100%; | |
} | |
.widget { | |
margin: 0 auto; | |
width:350px; | |
margin-top:50px; | |
background-color: #222D3A; | |
border-radius: 5px; | |
box-shadow: 0px 0px 1px 0px #06060d; | |
} | |
.header{ | |
background-color: #29384D; | |
height:40px; | |
color:#929DAF; | |
text-align: center; | |
line-height: 40px; | |
border-top-left-radius: 7px; | |
border-top-right-radius: 7px; | |
font-weight: 400; | |
font-size: 1.5em; | |
text-shadow: 1px 1px #06060d; | |
} | |
.chart-container{ | |
padding:25px; | |
} | |
.shadow { | |
-webkit-filter: drop-shadow( 0px 3px 3px rgba(0,0,0,.5) ); | |
filter: drop-shadow( 0px 3px 3px rgba(0,0,0,.5) ); | |
} | |
</style> | |
</head> | |
<body> | |
<div class="widget"> | |
<div class="header">Progress Status</div> | |
<div id="chart" class="chart-container"> | |
</div> | |
</div> | |
<script> | |
var createGradient=function(svg,id,color1,color2){ | |
var defs = svg.append("svg:defs"); | |
var red_gradient = defs.append("svg:linearGradient") | |
.attr("id", id) | |
.attr("x1", "0%") | |
.attr("y1", "0%") | |
.attr("x2", "50%") | |
.attr("y2", "100%") | |
.attr("spreadMethod", "pad"); | |
red_gradient.append("svg:stop") | |
.attr("offset", "50%") | |
.attr("stop-color", color1) | |
.attr("stop-opacity", 1); | |
red_gradient.append("svg:stop") | |
.attr("offset", "100%") | |
.attr("stop-color", color2) | |
.attr("stop-opacity", 1); | |
}; | |
var percent = 65; | |
var ratio=percent/100; | |
var pie=d3.layout.pie() | |
.value(function(d){return d}) | |
.sort(null); | |
var w=300,h=300; | |
var outerRadius=(w/2)-10; | |
var innerRadius=110; | |
var color = ['#f2503f','#ea0859','#404F70']; | |
var svg=d3.select("#chart") | |
.append("svg") | |
.attr({ | |
width:w, | |
height:h, | |
class:'shadow' | |
}).append('g') | |
.attr({ | |
transform:'translate('+w/2+','+h/2+')' | |
}); | |
createGradient(svg,'gradient',color[0],color[1]); | |
var arc=d3.svg.arc() | |
.innerRadius(innerRadius) | |
.outerRadius(outerRadius) | |
.startAngle(0) | |
.endAngle(2*Math.PI); | |
var arcLine=d3.svg.arc() | |
.innerRadius(innerRadius) | |
.outerRadius(outerRadius) | |
.startAngle(0); | |
var pathBackground=svg.append('path') | |
.attr({ | |
d:arc | |
}) | |
.style({ | |
fill:color[2] | |
}); | |
var pathChart=svg.append('path') | |
.datum({endAngle:0}) | |
.attr({ | |
d:arcLine | |
}) | |
.style({ | |
fill:'url(#gradient)' | |
}); | |
var middleCount=svg.append('text') | |
.text(function(d){ | |
return d; | |
}) | |
.attr({ | |
class:'middleText', | |
'text-anchor':'middle', | |
dy:30, | |
dx:-15 | |
}) | |
.style({ | |
fill:color[1], | |
'font-size':'90px' | |
}); | |
svg.append('text') | |
.text('%') | |
.attr({ | |
class:'percent', | |
'text-anchor':'middle', | |
dx:50, | |
dy:-5 | |
}) | |
.style({ | |
fill:color[1], | |
'font-size':'40px' | |
}); | |
var arcTween=function(transition, newAngle) { | |
transition.attrTween("d", function (d) { | |
var interpolate = d3.interpolate(d.endAngle, newAngle); | |
var interpolateCount = d3.interpolate(0, percent); | |
return function (t) { | |
d.endAngle = interpolate(t); | |
middleCount.text(Math.floor(interpolateCount(t))); | |
return arcLine(d); | |
}; | |
}); | |
}; | |
var animate=function(){ | |
pathChart.transition() | |
.duration(750) | |
.ease('cubic') | |
.call(arcTween,((2*Math.PI))*ratio); | |
}; | |
setTimeout(animate,0); | |
</script> | |
</body> |