计算进度圈中的百分比 [英] calculate percentage in progress circle

查看:18
本文介绍了计算进度圈中的百分比的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在不点击渲染按钮的情况下动态(实时)生成进度圈

示例:

  • 在成分 1 的输入中添加 10,在成分 2 的输入中添加 10,在成分 3 的输入中添加 10.总共是 30 个圆应该在不单击渲染按钮的情况下进行渲染

  • 取消选中任何成分复选框总计计算所有输入值.总圆应该在不点击渲染按钮的情况下渲染

演示:https://jsfiddle.net/worldwildweb/mcjs9275/

jQuery(function($) {$(函数(){$(".tags").on('input', function() {varcalculated_total_sum = $(this).find(".ingredient").map(function() {const chck = $(this).is(":checked")const val = $(this).closest("div").find(".txtCal").val()返回检查?+val : 0;}).get().reduce((a, b) => a + b)$("#percent").val(calculated_total_sum);如果 ($("#percent").text() > 1000) {$("#percent").css('颜色', '红色');}别的{$("#percent").css('颜色', '绿色');}});});//成分过敏原$('div.tags').delegate('input:checkbox', 'change', function() {$(this).parent().nextAll().slice(0, 2).hide().val('0');var list = $('.results > li').hide();//对于每一个检查$('input:checked').each(function() {list.filter('.' + $(this).attr('rel')).show();$(this).parent().nextAll().slice(0, 2).show();});}).find('input:checkbox').change();$(".tags").on('input', '.txtCal', function () {varcalculated_total_sum = 0;$(".tags .txtCal").each(function () {var get_textbox_value = $(this).val();如果 ($.isNumeric(get_textbox_value)) {calculated_total_sum += parseFloat(get_textbox_value);}});$("#percent").val(calculated_total_sum);});无功SVG;函数 drawProgress(end){d3.select("svg").remove()如果(SVG){svg.selectAll("*").remove();}var wrapper = document.getElementById('radialprogress');无功开始= 0;var 颜色 = {填充:'#FF0000',轨道:'#555555',文本:'#00C0FF',中风:'#FFFFFF',}无功半径= 80;无功边界= 12;varstrokeSpacing = 4;var endAngle = Math.PI * 2;var formatText = d3.format('.0%');var boxSize = 半径 * 2;无功计数=结束;var 进度 = 开始;var step = end <开始 ?-0.01:0.01;//定义圆var circle = d3.svg.arc().startAngle(0).innerRadius(半径).outerRadius(半径 - 边界);//设置SVG包装器svg = d3.select(包装器).append('svg').attr('宽度', boxSize).attr('高度', boxSize);//添加组容器var g = svg.append('g').attr('transform', 'translate(' + boxSize/2 + ',' + boxSize/2 + ')');//设置轨迹var track = g.append('g').attr('class', 'radial-progress');track.append('路径').attr('fill', colours.track).attr('stroke', colours.stroke).attr('笔画宽度',strokeSpacing + 'px').attr('d', circle.endAngle(endAngle));//添加颜色填充var value = track.append('path').attr('填充', colours.fill).attr('stroke', colours.stroke).attr('笔画宽度',strokeSpacing + 'px');//添加文本值var numberText = track.append('text').attr('fill', colours.text).attr('文本锚', '中间').attr('dy', '.5rem');//更新endAngle的位置value.attr('d', circle.endAngle(endAngle * end));//更新文本值numberText.text(formatText(end));}$('#submitClick').click(function(){var val = parseInt($('#percent').val());drawProgress(val/100)})绘制进度(10/100)});

 

<div><label><input type="checkbox" 选中 rel="ingredient-1" class="ingredient">成分 1 </label><br><input type="text" class='txtCal'/><br>

<div><label><input type="checkbox" 选中 rel="ingredient-2" class="ingredient">成分 2 </label><br><input type="text" class='txtCal'/><br>

<div><label><input type="checkbox" 选中 rel="ingredient-3" class="ingredient">成分 3 </label><br><input type="text" class='txtCal'/><br>

<span><b>TOTAL :</b></span><b><span id="total_sum_value"></span></b><!-- https://stackoverflow.com/questions/49345858/html-how-do-i-generate-a-progress-bar-circle-with-a-percentage-in-and-set-the--><label for="percent">输入一个百分比!</label><input id="percent" name="percent" value=10><button id='submitClick' name='submitButton' >Render</button><div id="radialprogress"></div>

<ul class="结果"><li class="ingredient-1成分-3">α异甲基紫罗兰酮</li><li class="ingredient-1">戊基肉桂醛 (Jasmonal A)</li><li class="ingredient-1">戊基肉桂醇</li><li class="ingredient-1">茴香醇</li><li class="ingredient-1成分-2">苯甲醇</li><li class="ingredient-1成分-2成分-3">苯甲酸苄酯</li><li class="ingredient-2">肉桂酸苄酯</li><li class="ingredient-2">水杨酸苄酯</li><li class="ingredient-2">丁基苯基甲基丙醛 (Lilial)</li><li class="ingredient-2成分-3">肉桂</li><li class="ingredient-3">肉桂醇</li><li class="ingredient-3">柠檬醛</li><li class="ingredient-3">香茅醇</li><li class="ingredient-3">香豆素</li><script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

解决方案

要在值更改时重新绘制进度圈,只需调用 input 中的 drawProgress() 函数代码> 事件处理程序.

另请注意,您还可以对代码进行一些其他改进:

  • 删除嵌套的 document.ready
  • 不推荐使用委托,改用 on
  • $('#percent').text() 应该是 $('#percent').val(),我假设 1000 在该行的条件中应该是 100.

jQuery($ => {$('#submitClick').click(function() {var val = parseInt($('#percent').val());drawProgress(val/100);}).trigger('点击');$(".tags").on('input', function() {//此处不必要地使用了 2 个循环,已修改//varcalculated_total_sum = $(this).find(".ingredient:checked").map((i, el) => parseFloat($(el).closest("div").find(".txtCal").val())).get().reduce((a, b) => a + b) ||0;varcalculated_total_sum = 0;$(this).find('div:has(.ingredient:checked) .txtCal').each((i, el) =>calculated_total_sum += parseFloat(el.value));$("#percent").val(calculated_total_sum).css('color', parseFloat($("#percent").val()) > 1000 ? 'red' : 'green');drawProgress(calculated_total_sum/100);});//成分过敏原$('div.tags').on('change', 'input:checkbox', function() {$(this).parent().nextAll().slice(0, 2).hide().val('0');var list = $('.results > li').hide();$('input:checked').each(function() {list.filter('.' + $(this).attr('rel')).show();$(this).parent().nextAll().slice(0, 2).show();});}).find('input:checkbox').change();$(".tags").on('input', '.txtCal', function() {varcalculated_total_sum = 0;$(".tags .txtCal").each(function() {var get_textbox_value = $(this).val();如果 ($.isNumeric(get_textbox_value)) {calculated_total_sum += parseFloat(get_textbox_value);}});$("#percent").val(calculated_total_sum);});var svg;函数 drawProgress(end) {d3.select("svg").remove()如果(SVG){svg.selectAll("*").remove();}var wrapper = document.getElementById('radialprogress');无功开始= 0;var 颜色 = {填充:'#FF0000',轨道:'#555555',文本:'#00C0FF',中风:'#FFFFFF',}无功半径= 80;无功边界= 12;varstrokeSpacing = 4;var endAngle = Math.PI * 2;var formatText = d3.format('.0%');var boxSize = 半径 * 2;无功计数=结束;var 进度 = 开始;var step = end <开始 ?-0.01:0.01;//定义圆var circle = d3.svg.arc().startAngle(0).innerRadius(半径).outerRadius(半径 - 边界);//设置SVG包装器svg = d3.select(包装器).append('svg').attr('宽度', boxSize).attr('高度', boxSize);//添加组容器var g = svg.append('g').attr('transform', 'translate(' + boxSize/2 + ',' + boxSize/2 + ')');//设置轨迹var track = g.append('g').attr('class', 'radial-progress');track.append('路径').attr('fill', colours.track).attr('stroke', colours.stroke).attr('笔画宽度',strokeSpacing + 'px').attr('d', circle.endAngle(endAngle));//添加颜色填充var value = track.append('path').attr('fill', colours.fill).attr('stroke', colours.stroke).attr('笔画宽度',strokeSpacing + 'px');//添加文本值var numberText = track.append('text').attr('填充', colours.text).attr('文本锚', '中间').attr('dy', '.5rem');//更新endAngle的位置value.attr('d', circle.endAngle(endAngle * end));//更新文本值numberText.text(formatText(end));}});

<div><label><input type="checkbox" 选中 rel="ingredient-1" class="ingredient">成分 1 </label><br><input type="text" class='txtCal'/><br>

<div><label><input type="checkbox" 选中 rel="ingredient-2" class="ingredient">成分 2 </label><br><input type="text" class='txtCal'/><br>

<div><label><input type="checkbox" 选中 rel="ingredient-3" class="ingredient">成分 3 </label><br><input type="text" class='txtCal'/><br>

<span><b>TOTAL :</b></span><b><span id="total_sum_value"></span></b><label for="percent">输入一个百分比!</label><input id="percent" name="percent" value="0"><button id='submitClick' name='submitButton'>渲染</button><div id="radialprogress"></div>

<ul class="结果"><li class="ingredient-1成分-3">α异甲基紫罗兰酮</li><li class="ingredient-1">戊基肉桂醛 (Jasmonal A)</li><li class="ingredient-1">戊基肉桂醇</li><li class="ingredient-1">茴香醇</li><li class="ingredient-1成分-2">苯甲醇</li><li class="ingredient-1成分-2成分-3">苯甲酸苄酯</li><li class="ingredient-2">肉桂酸苄酯</li><li class="ingredient-2">水杨酸苄酯</li><li class="ingredient-2">丁基苯基甲基丙醛 (Lilial)</li><li class="ingredient-2成分-3">肉桂</li><li class="ingredient-3">肉桂醇</li><li class="ingredient-3">柠檬醛</li><li class="ingredient-3">香茅醇</li><li class="ingredient-3">香豆素</li><script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

I would like to generate a progress circle dynamically (live) without clicking the button render

Example:

demo: https://jsfiddle.net/worldwildweb/mcjs9275/

jQuery(function($) {
 
 
  $(function() {
  $(".tags").on('input', function() {

    var calculated_total_sum = $(this).find(".ingredient").map(function() {
      const chck = $(this).is(":checked")
      const val = $(this).closest("div").find(".txtCal").val()
      return chck ? +val : 0;
    }).get().reduce((a, b) => a + b)
    $("#percent").val(calculated_total_sum);
    if ($("#percent").text() > 1000) {
    $("#percent").css('color', 'red');
  }    
  else{
    $("#percent").css('color', 'green');
  }
  });
});
// ingrédients allergènes
$('div.tags').delegate('input:checkbox', 'change', function() {
  $(this).parent().nextAll().slice(0, 2).hide().val('0');
  
  
  var list = $('.results > li').hide();
  //For each one checked
  $('input:checked').each(function() {
    list.filter('.' + $(this).attr('rel')).show();
    $(this).parent().nextAll().slice(0, 2).show();
  });
}).find('input:checkbox').change();  

$(".tags").on('input', '.txtCal', function () {
     var calculated_total_sum = 0;
   
     $(".tags .txtCal").each(function () {
         var get_textbox_value = $(this).val();
         if ($.isNumeric(get_textbox_value)) {
            calculated_total_sum += parseFloat(get_textbox_value);
            }                  
          });
            $("#percent").val(calculated_total_sum);



            
     });

     var svg ;

function drawProgress(end){ 
d3.select("svg").remove() 
  if(svg){
  svg.selectAll("*").remove();
  
}
var wrapper = document.getElementById('radialprogress');
var start = 0;
 
var colours = {
  fill: '#FF0000',
  track: '#555555',
  text: '#00C0FF',
  stroke: '#FFFFFF',
}

var radius = 80;
var border = 12;
var strokeSpacing = 4;
var endAngle = Math.PI * 2;
var formatText = d3.format('.0%');
var boxSize = radius * 2;
var count = end;
var progress = start;
var step = end < start ? -0.01 : 0.01;

//Define the circle
var circle = d3.svg.arc()
  .startAngle(0)
  .innerRadius(radius)
  .outerRadius(radius - border);

//setup SVG wrapper
svg = d3.select(wrapper)
  .append('svg')
  .attr('width', boxSize)
  .attr('height', boxSize);

  
// ADD Group container
var g = svg.append('g')
  .attr('transform', 'translate(' + boxSize / 2 + ',' + boxSize / 2 + ')');

//Setup track
var track = g.append('g').attr('class', 'radial-progress');
track.append('path')
  .attr('fill', colours.track)
  .attr('stroke', colours.stroke)
  .attr('stroke-width', strokeSpacing + 'px')
  .attr('d', circle.endAngle(endAngle));

//Add colour fill
var value = track.append('path')
  .attr('fill', colours.fill)
  .attr('stroke', colours.stroke)
  .attr('stroke-width', strokeSpacing + 'px');

//Add text value
var numberText = track.append('text')
  .attr('fill', colours.text)
  .attr('text-anchor', 'middle')
  .attr('dy', '.5rem'); 

  //update position of endAngle
  value.attr('d', circle.endAngle(endAngle * end));
  //update text value
  numberText.text(formatText(end));
  
}

$('#submitClick').click(function(){
  var val = parseInt($('#percent').val());
   drawProgress(val/100)
})
 
drawProgress(10/100)

});

    <div class="tags">
      <div>
        <label><input type="checkbox" checked rel="ingredient-1" class="ingredient"> ingredient 1 </label><br><input type="text" class='txtCal'  /><br>
      </div>
      <div>
        <label><input type="checkbox" checked rel="ingredient-2" class="ingredient"> ingredient 2 </label><br><input type="text" class='txtCal' /><br>
      </div>
      <div>
        <label><input type="checkbox" checked rel="ingredient-3" class="ingredient"> ingredient 3 </label><br><input type="text" class='txtCal' /><br>
      </div>
      <span><b>TOTAL  :</b></span><b><span id="total_sum_value"></span></b>
      <!-- https://stackoverflow.com/questions/49345858/html-how-do-i-generate-a-progress-bar-circle-with-a-percentage-in-and-set-the -->
      <label for="percent">Type a percent!</label>
<input id="percent" name="percent" value=10>
<button id='submitClick' name='submitButton' >Render</button>


<div id="radialprogress"></div>
    </div>


        <ul class="results">
             <li class="ingredient-1 ingredient-3">Alpha isomethylionone</li>
             <li class="ingredient-1">Amyl cinnamal (Jasmonal A)</li>
             <li class="ingredient-1">Amylcinnamyl alcohol</li>
             <li class="ingredient-1">Anisyl alcohol</li>
             <li class="ingredient-1 ingredient-2">Benzyl alcohol</li>
             <li class="ingredient-1 ingredient-2 ingredient-3">Benzyl benzoate</li>
             <li class="ingredient-2">Benzyl cinnamate</li>
             <li class="ingredient-2">Benzyl salicylate</li>
             <li class="ingredient-2">Butylphenyl methylpropional (Lilial)</li>
             <li class="ingredient-2 ingredient-3">Cinnamal</li>
             <li class="ingredient-3">Cinnamyl alcohol</li>
             <li class="ingredient-3">Citral</li>
             <li class="ingredient-3">Citronellol</li>
             <li class="ingredient-3">Coumarin</li>
        </ul>

        <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

解决方案

To have the progress circle redraw when the values are changed simply call the drawProgress() function within the input event handler.

Also note that there's a couple of other improvements you can make to the code:

jQuery($ => {
  $('#submitClick').click(function() {
    var val = parseInt($('#percent').val());
    drawProgress(val / 100);
  }).trigger('click');
  
  $(".tags").on('input', function() {
    // needlessly using 2 loops here, amended
    //var calculated_total_sum = $(this).find(".ingredient:checked").map((i, el) => parseFloat($(el).closest("div").find(".txtCal").val())).get().reduce((a, b) => a + b) || 0;   
    var calculated_total_sum = 0;
    $(this).find('div:has(.ingredient:checked) .txtCal').each((i, el) => calculated_total_sum += parseFloat(el.value));   
    
    $("#percent")
      .val(calculated_total_sum)
      .css('color', parseFloat($("#percent").val()) > 1000 ? 'red' : 'green');
      
    drawProgress(calculated_total_sum / 100);
  });

  // ingrédients allergènes
  $('div.tags').on('change', 'input:checkbox', function() {
    $(this).parent().nextAll().slice(0, 2).hide().val('0');
    var list = $('.results > li').hide();
    
    $('input:checked').each(function() {
      list.filter('.' + $(this).attr('rel')).show();
      $(this).parent().nextAll().slice(0, 2).show();
    });
  }).find('input:checkbox').change();

  $(".tags").on('input', '.txtCal', function() {
    var calculated_total_sum = 0;
    $(".tags .txtCal").each(function() {
      var get_textbox_value = $(this).val();
      if ($.isNumeric(get_textbox_value)) {
        calculated_total_sum += parseFloat(get_textbox_value);
      }
    });
    $("#percent").val(calculated_total_sum);
  });

  var svg;

  function drawProgress(end) {
    d3.select("svg").remove()
    if (svg) {
      svg.selectAll("*").remove();
    }
    var wrapper = document.getElementById('radialprogress');
    var start = 0;

    var colours = {
      fill: '#FF0000',
      track: '#555555',
      text: '#00C0FF',
      stroke: '#FFFFFF',
    }

    var radius = 80;
    var border = 12;
    var strokeSpacing = 4;
    var endAngle = Math.PI * 2;
    var formatText = d3.format('.0%');
    var boxSize = radius * 2;
    var count = end;
    var progress = start;
    var step = end < start ? -0.01 : 0.01;

    //Define the circle
    var circle = d3.svg.arc()
      .startAngle(0)
      .innerRadius(radius)
      .outerRadius(radius - border);

    //setup SVG wrapper
    svg = d3.select(wrapper)
      .append('svg')
      .attr('width', boxSize)
      .attr('height', boxSize);


    // ADD Group container
    var g = svg.append('g')
      .attr('transform', 'translate(' + boxSize / 2 + ',' + boxSize / 2 + ')');

    //Setup track
    var track = g.append('g').attr('class', 'radial-progress');
    track.append('path')
      .attr('fill', colours.track)
      .attr('stroke', colours.stroke)
      .attr('stroke-width', strokeSpacing + 'px')
      .attr('d', circle.endAngle(endAngle));

    //Add colour fill
    var value = track.append('path')
      .attr('fill', colours.fill)
      .attr('stroke', colours.stroke)
      .attr('stroke-width', strokeSpacing + 'px');

    //Add text value
    var numberText = track.append('text')
      .attr('fill', colours.text)
      .attr('text-anchor', 'middle')
      .attr('dy', '.5rem');

    //update position of endAngle
    value.attr('d', circle.endAngle(endAngle * end));
    //update text value
    numberText.text(formatText(end));
  }
});

<div class="tags">
  <div>
    <label><input type="checkbox" checked rel="ingredient-1" class="ingredient"> ingredient 1 </label><br><input type="text" class='txtCal' /><br>
  </div>
  <div>
    <label><input type="checkbox" checked rel="ingredient-2" class="ingredient"> ingredient 2 </label><br><input type="text" class='txtCal' /><br>
  </div>
  <div>
    <label><input type="checkbox" checked rel="ingredient-3" class="ingredient"> ingredient 3 </label><br><input type="text" class='txtCal' /><br>
  </div>
  <span><b>TOTAL  :</b></span><b><span id="total_sum_value"></span></b>
  <label for="percent">Type a percent!</label>
  <input id="percent" name="percent" value="0">
  <button id='submitClick' name='submitButton'>Render</button>
  <div id="radialprogress"></div>
</div>
<ul class="results">
  <li class="ingredient-1 ingredient-3">Alpha isomethylionone</li>
  <li class="ingredient-1">Amyl cinnamal (Jasmonal A)</li>
  <li class="ingredient-1">Amylcinnamyl alcohol</li>
  <li class="ingredient-1">Anisyl alcohol</li>
  <li class="ingredient-1 ingredient-2">Benzyl alcohol</li>
  <li class="ingredient-1 ingredient-2 ingredient-3">Benzyl benzoate</li>
  <li class="ingredient-2">Benzyl cinnamate</li>
  <li class="ingredient-2">Benzyl salicylate</li>
  <li class="ingredient-2">Butylphenyl methylpropional (Lilial)</li>
  <li class="ingredient-2 ingredient-3">Cinnamal</li>
  <li class="ingredient-3">Cinnamyl alcohol</li>
  <li class="ingredient-3">Citral</li>
  <li class="ingredient-3">Citronellol</li>
  <li class="ingredient-3">Coumarin</li>
</ul>

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

这篇关于计算进度圈中的百分比的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
前端开发最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆