var r=2990, g=5870, b=1140;
var step=150, lastHover=-1, adj;
var chart=document.getElementById('chart-area');
$('#rval').html(r); $('#gval').html(g); $('#bval').html(b);
var config = {
type: 'pie',
data: {
datasets: [{
data: [ r,g,b ],
backgroundColor: [ '#f22','#1f1','#1e90ff' ],
label: 'rgb'
}],
labels: ['R','G','B']
},
options: {
legend: {display: false},
animation: {
duration: 200,
easing: "easeOutQuart",
onProgress : function(){ addLabels(this); }
},
responsive: true,
tooltips: { enabled: false },
onHover: function(e,i){
if (typeof i[0]!=="undefined"){lastHover=(i[0]._index); }
},
}
};
chart.onmouseout=function(){lastHover=null;};
window.onload = function(){
var ctx = chart.getContext('2d');
window.myPie = new Chart(ctx, config);
};
chart.onwheel=(function(e) { ///// wheel turned
e.preventDefault();
adj=(e.deltaY<0?step:-step);
upd(lastHover,adj);
});
$('button').click( function() { ///// button clicked
adj=(this.id.substr(1,2)=='up'?step:-step);
var id=(['r','g','b']).indexOf(this.id.substr(0,1));
upd(id, adj);
});
function upd(id, adj){
var dd=config.data.datasets[0].data;
/*subf*/function adjust(vChg, v2, v3){ var adj2=Math.round(((10000-(vChg+v2+v3))/(v2+v3))*v2); return[vChg, v2+adj2, 10000-(vChg+v2+adj2)]; }
switch(id){
case 0: [dd[0],dd[1],dd[2]]=adjust(dd[0]+adj,dd[1],dd[2]); break;
case 1: [dd[1],dd[2],dd[0]]=adjust(dd[1]+adj,dd[2],dd[0]); break;
case 2: [dd[2],dd[0],dd[1]]=adjust(dd[2]+adj,dd[0],dd[1]);
}
[r,g,b]=dd;
var prev_r=parseInt($('#rval').html()), //get values
prev_g=parseInt($('#gval').html()),
prev_b=parseInt($('#bval').html());
if(r>prev_r){ $('#rup').css('background','red');} //hilite affected buttons
else{if(r<prev_r){ $('#rdn').css('background','red');}}
if(g>prev_g){ $('#gup').css('background','green');}
else{if(g<prev_g){ $('#gdn').css('background','green');}}
if(b>prev_b){ $('#bup').css('background','blue');}
else{if(b<prev_b){ $('#bdn').css('background','blue');}}
setTimeout(function(){clearButtonColors();},250);
$('#rval').html(r/100); $('#gval').html(g/100); $('#bval').html(b/100);
window.myPie.update();
}
function clearButtonColors(){ //reset button colors
['#rup','#rdn','#gup','#gdn','#bup','#bdn']
.forEach(function(i){ $(i).css('background','transparent'); });
}
function addLabels(t){ //add chart labels
var ctx = t.chart.ctx;
ctx.textAlign = 'center';
ctx.textBaseline = 'bottom';
t.data.datasets.forEach(function (dataset) {
for (var i = 0; i < dataset.data.length; i++) {
if(dataset.data[i] != 0 ) { //no label when value is 0
var model = dataset._meta[Object.keys(dataset._meta)[0]].data[i]._model,
total = dataset._meta[Object.keys(dataset._meta)[0]].total,
mid_rad = model.innerRadius+(model.outerRadius-model.innerRadius)/1.66,
mid_ang = model.startAngle+(model.endAngle-model.startAngle)/2,
x = mid_rad * Math.cos(mid_ang),
y = mid_rad * Math.sin(mid_ang),
pct=Math.round(dataset.data[i]/total*100);
ctx.font = "10px Verdana";
ctx.fillText(String(pct)+'%', model.x + x-3, model.y + y );
}
}
});
}
body{font-size:16px; font-family:Helvetica; padding:0; margin:0;}
#cancont{position:absolute;left:75px; width:225px; height:10px; }
canvas {position:relative; right:0; }
button{height:25px; transition:all 500ms; }
button:hover{ transform:scale(1.15); background:springgreen; }
#rup,#gup,#bup{border-radius:0 50% 50% 0; }
#rdn,#gdn,#bdn{border-radius:50% 0 0 50%; }
#rup,#rdn{border-color:red;}
#gup,#gdn{border-color:green;}
#bup,#bdn{border-color:blue;}
table{ border-collapse:collapse; padding:0; position:absolute; top:20px; }
td{text-align:center;}
tr{margin:100px 0;}
h4{ position:absolute; bottom:10px; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id='cancont'>
<canvas id="chart-area" ></canvas>
</div>
<div id='tblcont'>
<table id='tbl'>
<tr><td><button id='rdn'>- R</button></td>
<td><div id='rval'></div></td>
<td><button id='rup'>R +</button></td></tr>
<tr><td><button id='gdn'>- G</button></td>
<td><div id='gval'></div></td>
<td><button id='gup'>G +</button></td></tr>
<tr><td><button id='bdn'>- B</button></td>
<td><div id='bval'></div></td>
<td><button id='bup'>B +</button></td></tr>
</table>
</div>
<h4>Adjust with RGB± buttons, or <u>use the mouse-wheel</u> over chart.</h4>