Search code examples
htmlcssinputcheckboxtilde

Multiple checkboxes on a single page


Can anyone help me out with my ratingsystem? I'm trying to duplicate my section with the class of container(Entire progressbar), but whenever I do so the ratingbar only works for either one of the progressbars. I've kept in mind to change the id's of the second checkboxes so they don't interfere. This is the code with one progressbar but I want more of them.

Bytheway it would be helpfull if somebody knows a decent way to share this mess of code I have here.

PHP+HTML:

<?php $num = 2; ?>

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <title>Animated Progress Bar</title>
  <link rel="stylesheet" href="css/style.css">
</head>
<body>
    <section class="container">
        <input type="radio" class="radio twenty" name="progress" value="twenty" id="twenty" <?php if($num === 1) { echo 'checked'; } ?>>
        <label for="twenty" class="label">1</label>

        <input type="radio" class="radio fourty" name="progress" value="fourty" id="fourty" <?php if($num === 2) { echo 'checked'; } ?>>
        <label for="fourty" class="label">2</label>

        <input type="radio" class="radio sixty" name="progress" value="sixty" id="sixty" <?php if($num === 3) { echo 'checked'; } ?>>
        <label for="sixty" class="label">3</label>

        <input type="radio" class="radio eighty" name="progress" value="eighty" id="eighty"<?php if($num === 4) { echo 'checked'; } ?>>
        <label for="eighty" class="label">4</label>

        <input type="radio" class="radio onehundred" name="progress" value="onehundred" id="onehundred" <?php if($num === 5) { echo 'checked'; } ?>>
        <label for="onehundred" class="label">5</label>

        <div class="progress">
            <div class="progress-bar"></div>
        </div>
    </section>
</body>
</html>

CSS:

body {
  font: 13px/20px 'Lucida Grande', Tahoma, Verdana, sans-serif;
  color: #404040;
  background: #323232;
}
.container {
  margin: 80px auto;
  width: 640px;
  text-align: center;
}
.container .progress {
  margin: 0 auto;
  width: 150px;
}
.progress {
  padding: 4px;
  background: rgba(0, 0, 0, 0.25);
  border-radius: 6px;
  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.25), 0 1px rgba(255, 255, 255, 0.08);
  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.25), 0 1px rgba(255, 255, 255, 0.08);
}
.progress-bar {
  position: relative;
  height: 10px;
  border-radius: 4px;
  -webkit-transition: 0.4s linear;
  -moz-transition: 0.4s linear;
  -o-transition: 0.4s linear;
  transition: 0.4s linear;
  -webkit-transition-property: width, background-color;
  -moz-transition-property: width, background-color;
  -o-transition-property: width, background-color;
  transition-property: width, background-color;
  -webkit-box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.25), inset 0 1px rgba(255, 255, 255, 0.1);
  box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.25), inset 0 1px rgba(255, 255, 255, 0.1);
}
.progress-bar:before, .progress-bar:after {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
}
.progress-bar:before {
  bottom: 0;
  border-radius: 4px 4px 0 0;
}
.progress-bar:after {
  z-index: 2;
  bottom: 45%;
  border-radius: 4px;
  background-image: -webkit-linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.05));
  background-image: -moz-linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.05));
  background-image: -o-linear-gradient(top, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.05));
  background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.05));
}
.twenty:checked ~ .progress > .progress-bar {
  width: 20%;
  background-color: #f63a0f;
}
.fourty:checked ~ .progress > .progress-bar {
  width: 40%;
  background-color: #f27011;
}
.sixty:checked ~ .progress > .progress-bar {
  width: 60%;
  background-color: #f2b01e;
}
.eighty:checked ~ .progress > .progress-bar {
  width: 80%;
  background-color: #f2d31b;
}
.onehundred:checked ~ .progress > .progress-bar {
  width: 100%;
  background-color: #86e01e;
}
.radio {
  display: none;
}
.label {
  display: inline-block;
  margin: 0 5px 20px;
  padding: 3px 8px;
  color: #aaa;
  text-shadow: 0 1px black;
  border-radius: 3px;
  cursor: pointer;
}
.radio:checked + .label {
  color: white;
  background: rgba(0, 0, 0, 0.25);
}

Solution

  • For your second progress group you need to change the following

    • the id of each input element (radio not checkbox)
    • the for attribute of the labels to correspond with the new id of the input elements
    • the name of the input elements, since they are radio button which get grouped by name

    So a second group would result to this html structure

    <section class="container">
        <input type="radio" class="radio twenty" name="progress-2" value="twenty" id="twenty-2" />
        <label for="twenty-2" class="label">1</label>
        <input type="radio" class="radio fourty" name="progress-2" value="fourty" id="fourty-2" />
        <label for="fourty-2" class="label">2</label>
        <input type="radio" class="radio sixty" name="progress-2" value="sixty" id="sixty-2" />
        <label for="sixty-2" class="label">3</label>
        <input type="radio" class="radio eighty" name="progress-2" value="eighty" id="eighty-2" />
        <label for="eighty-2" class="label">4</label>
        <input type="radio" class="radio onehundred" name="progress-2" value="onehundred" id="onehundred-2" />
        <label for="onehundred-2" class="label">5</label>
        <div class="progress">
            <div class="progress-bar"></div>
        </div>
    </section>
    

    Working demo at http://jsfiddle.net/gaby/mfNYu/1/