使用复选框更新进度条:Jquery

时间:2014-02-25 15:20:35

标签: jquery-ui jquery-mobile checkbox progress-bar

目前我有一个检查列表,一旦点击一个复选框就会更新进度条,但是,我希望进度条根据复选框上的百分比更新。我花了几个小时寻找解决方案并尝试不同的事情,但没有运气。有任何帮助或建议吗?

DEMO = http://jsfiddle.net/UznQe/

 <!DOCTYPE html>
<html>
<head>
    <title>Bars for checklist</title>
    <meta name="viewport" content="width=device-width"/>
 <link rel="stylesheet" href="themes/theme1.min.css" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />

    <meta charset="utf-8">



    <link rel="stylesheet" href="jqm/demos/css/themes/default/jquery.mobile-1.3.2.min.css" />


    <script src="jqm/demos/js/jquery.js">
    </script>

    <script src="jqm/demos/js/jquery.mobile-1.3.2.min.js">
    </script>

    <script>


        $(document).on('pagebeforeshow', '#checklist', function () {
            $('input[type="checkbox"]').each(function () {
                ($(this).is(':checked')) ? $(this).parent().parent().addClass('checked') : $(this).parent().parent().addClass('not-checked');
            });
        });


        $(document).on('click', '.checkBoxLeft', function () {
            if ($(this).find('input[type="checkbox"]').is(':checked')) {
                $(this).removeClass('checked').addClass('not-checked');
                $(this).find('input[type="checkbox"]').attr('checked', false);
            } else {
                $(this).removeClass('not-checked').addClass('checked');
                $(this).find('input[type="checkbox"]').attr('checked', true);
            }


            var total = $("#theList input[type=checkbox]").length;
            var numChecked = $("#theList input[type=checkbox]:checked").length;
            if (numChecked == 1) {
                $("#progress").css('background', 'red');

            } else if (numChecked == 2) {
                $("#progress").css('background', 'orange');
            } else if (numChecked == 3) {
                $("#progress").css('background', 'yellow');
            } else {
                $("#progress").css('background', 'lime');
            }
            var prog = numChecked * 100 / total;
            $("#progress").css("width", prog + "%");


        });




    </script>
</head>
<body>





     <div data-role="main" class="ui-content">
    <div data-role="collapsible">
      <h1>Task list</h1>




        <div data-role="content">
            <ul data-role="listview" id="theList" data-inset="true">
                <li>



                    <div class="checkBoxLeft">
                        <input type="checkbox" name="checkbox-0" id="checkbox-0" value="15" class="hidden-checkbox"/>
                    </div>                    
                    <a href="" class="detailListText">Task 1 (15%)</a>
                </li>
                <li>
                    <div class="checkBoxLeft">
                        <input type="checkbox" name="checkbox-0" id="checkbox-0" value="40"class="hidden-checkbox"/>
                    </div>                     
                    <a href="" class="detailListText">Task 2 (40%)</a>
                </li>
                <li>
                    <div class="checkBoxLeft">
                        <input type="checkbox" name="checkbox-0" id="checkbox-0" value="5" class="hidden-checkbox"/>
                    </div>                     
                    <a href="" class="detailListText">Task 3 (5%)</a>
                </li>
                 <li>
                    <div class="checkBoxLeft">
                        <input type="checkbox" name="checkbox-0" id="checkbox-0" value="10" class="hidden-checkbox"/>
                    </div>                     
                    <a href="" class="detailListText">Task 4 (10%)</a>
                </li>
                 <li>
                    <div class="checkBoxLeft">
                        <input type="checkbox" name="checkbox-0" id="checkbox-0" value="15"class="hidden-checkbox"/>
                    </div>                     
                    <a href="" class="detailListText">Task 5 (15%)</a>
                </li>
                 <li>
                    <div class="checkBoxLeft">
                        <input type="checkbox" name="checkbox-0" id="checkbox-0" value="15" class="hidden-checkbox"/>
                    </div>                     
                    <a href="" class="detailListText">Task 6 (15%)</a>
                </li>
            </ul>
            </div>
        </div>

            <div class="meter green nostripes">
                <span id="progress" style="width: 0%"></span>
            </div>
        </div>









        <style>

            .detailListText{
    margin: 0 0 0 20px;
}

.checkBoxLeft{
    position: absolute; 
    left: 10px; 
    top: 28%;
    width: 18px;
    height: 18px;
    background: #d9d9d9;
    border-radius: 3px;  
}



.hidden-checkbox {
    display: none;
}


.not-checked {
    background-position: 18px 0;   
    background-color:#d9d9d9;
}


.checked {
    background-position: 0 0;   
    background-color:#6496bc;    
}

        .meter { 
            height: 20px;
            position: relative;
            margin: 60px 0 20px 0;
            background: #555;
            -moz-border-radius: 25px;
            -webkit-border-radius: 25px;
            border-radius: 25px;
            padding: 10px;
            -webkit-box-shadow: inset 0 -1px 1px rgba(255,255,255,0.3);
            -moz-box-shadow   : inset 0 -1px 1px rgba(255,255,255,0.3);
            box-shadow        : inset 0 -1px 1px rgba(255,255,255,0.3);
        }
        .meter > span {
            display: block;
            height: 100%;
               -webkit-border-top-right-radius: 8px;
            -webkit-border-bottom-right-radius: 8px;
                   -moz-border-radius-topright: 8px;
                -moz-border-radius-bottomright: 8px;
                       border-top-right-radius: 8px;
                    border-bottom-right-radius: 8px;
                -webkit-border-top-left-radius: 20px;
             -webkit-border-bottom-left-radius: 20px;
                    -moz-border-radius-topleft: 20px;
                 -moz-border-radius-bottomleft: 20px;
                        border-top-left-radius: 20px;
                     border-bottom-left-radius: 20px;
            background-color: rgb(43,194,83);
            background-image: -webkit-gradient(
              linear,
              left bottom,
              left top,
              color-stop(0, rgb(43,194,83)),
              color-stop(1, rgb(84,240,84))
             );
            background-image: -moz-linear-gradient(
              center bottom,
              rgb(43,194,83) 37%,
              rgb(84,240,84) 69%
             );
            -webkit-box-shadow: 
              inset 0 2px 9px  rgba(255,255,255,0.3),
              inset 0 -2px 6px rgba(0,0,0,0.4);
            -moz-box-shadow: 
              inset 0 2px 9px  rgba(255,255,255,0.3),
              inset 0 -2px 6px rgba(0,0,0,0.4);
            box-shadow: 
              inset 0 2px 9px  rgba(255,255,255,0.3),
              inset 0 -2px 6px rgba(0,0,0,0.4);
            position: relative;
            overflow: hidden;
        }
        .meter > span:after, .animate > span > span {
            content: "";
            position: absolute;
            top: 0; left: 0; bottom: 0; right: 0;
            background-image: 
               -webkit-gradient(linear, 0 0, 100% 100%, 
                  color-stop(.25, rgba(255, 255, 255, .2)), 
                  color-stop(.25, transparent), color-stop(.5, transparent), 
                  color-stop(.5, rgba(255, 255, 255, .2)), 
                  color-stop(.75, rgba(255, 255, 255, .2)), 
                  color-stop(.75, transparent), to(transparent)
               );
            background-image: 
                -moz-linear-gradient(
                  -45deg, 
                  rgba(255, 255, 255, .2) 25%, 
                  transparent 25%, 
                  transparent 50%, 
                  rgba(255, 255, 255, .2) 50%, 
                  rgba(255, 255, 255, .2) 75%, 
                  transparent 75%, 
                  transparent
               );
            z-index: 1;
            -webkit-background-size: 50px 50px;
            -moz-background-size: 50px 50px;
            background-size: 50px 50px;
            -webkit-animation: move 2s linear infinite;
            -moz-animation: move 2s linear infinite;
               -webkit-border-top-right-radius: 8px;
            -webkit-border-bottom-right-radius: 8px;
                   -moz-border-radius-topright: 8px;
                -moz-border-radius-bottomright: 8px;
                       border-top-right-radius: 8px;
                    border-bottom-right-radius: 8px;
                -webkit-border-top-left-radius: 20px;
             -webkit-border-bottom-left-radius: 20px;
                    -moz-border-radius-topleft: 20px;
                 -moz-border-radius-bottomleft: 20px;
                        border-top-left-radius: 20px;
                     border-bottom-left-radius: 20px;
            overflow: hidden;
        }

        .animate > span:after {
            display: none;
        }



        </style>
    </div>   
</body>
</html>    

2 个答案:

答案 0 :(得分:0)

  

更新了 FIDDLE

不是计算已选中复选框的数量,而是将已选中复选框的值加起来:

 //calculate percentage
 perc = 0;
 $("#theList input[type=checkbox]:checked").each(function( index ) {
     perc += parseInt($(this).val());         
 });

 if (perc < 15) {
     $("#progress").css('background', 'red');
 } else if (perc < 30) {
     $("#progress").css('background', 'orange');
 } else if (perc < 60) {
     $("#progress").css('background', 'yellow');
 } else {
     $("#progress").css('background', 'lime');
 }

 $("#progress").css("width", perc + "%");

parseInt($(this).val())为您提供值的整数表示。

答案 1 :(得分:-1)

这里是codepen中的一个例子。

<form>
  <p>
    <input type="checkbox" name = "box1"/>
    <input type="checkbox"name = "box2" />
    <input type="checkbox" name = "box3"/>
  </p>
</form>
<div class="progressbar-container">
  <div class="progressbar-bar"></div>
  <div class="progressbar-label"></div>
</div>
<div class = "ready"></div>

这是为此的JavaScript

$(document).ready(function() {

  // get box count
  var count = 0;
  var checked = 0;
  function countBoxes() { 
    count = $("input[type='checkbox']").length;
    console.log(count);
  }

  countBoxes();
  $(":checkbox").click(countBoxes);

  // count checks

  function countChecked() {
    checked = $("input:checked").length;

    var percentage = parseInt(((checked / count) * 100),10);
    $(".progressbar-bar").progressbar({
            value: percentage
        });
    $(".progressbar-label").text(percentage + "%");
  }

  countChecked();
  $(":checkbox").click(countChecked);
});

通过CSS应用进度条的更改。

body { margin: 20px 50px; }
h1 { font-size: 1.5em; }
p { margin: 0; }
input[type="checkbox"] { 
  height: 20px; 
  width: 20px; 
  margin-right: 10px;
}   

.ready { font-size: 1.5em; }
.ui-progressbar-value { background: lightgreen; }
.progressbar-container {
  position: relative;
  width: 350px; 
}

.progressbar-bar { 
  height: 25px;
margin: 10px 0;
border-radius: 7px;
}

.progressbar-label {
  position: absolute;
  top: 2px;
  left: 45%;
  z-index: 2;
}