EchO
EchO

Reputation: 1344

CSS - Rating css system

I'm using some rating system css i've found on the web. Currently i was able to put it work but there is an issue when mutiple ratings are shown.

Only the last rating class is working.

.rate {
  float: left;
  pointer-events: none;
}

.rate:not(:checked)>input {
  position: absolute;
  top: -9999px;
}

.rate:not(:checked)>label {
  float: right;
  width: 1em;
  overflow: hidden;
  white-space: nowrap;
  cursor: pointer;
  font-size: 30px;
  color: #ccc;
}

.rate:not(:checked)>label:before {
  content: '★ ';
}

.rate>input:checked~label {
  color: #ffc700;
}

.rate:not(:checked)>label:hover,
.rate:not(:checked)>label:hover~label {
  color: #deb217;
}

.rate>input:checked+label:hover,
.rate>input:checked+label:hover~label,
.rate>input:checked~label:hover,
.rate>input:checked~label:hover~label,
.rate>label:hover~input:checked~label {
  color: #c59b08;
}
<div class="rate">
  <input type="radio" id="star5" name="rate" value="5" />
  <label for="star5" title="text">5 stars</label>
  <input type="radio" id="star4" name="rate" value="4" checked/>
  <label for="star4" title="text">4 stars</label>
  <input type="radio" id="star3" name="rate" value="3" />
  <label for="star3" title="text">3 stars</label>
  <input type="radio" id="star2" name="rate" value="2" />
  <label for="star2" title="text">2 stars</label>
  <input type="radio" id="star1" name="rate" value="1" />
  <label for="star1" title="text">1 star</label>
</div>

<div class="rate">
  <input type="radio" id="star5" name="rate" value="5" checked/>
  <label for="star5" title="text">5 stars</label>
  <input type="radio" id="star4" name="rate" value="4" />
  <label for="star4" title="text">4 stars</label>
  <input type="radio" id="star3" name="rate" value="3" />
  <label for="star3" title="text">3 stars</label>
  <input type="radio" id="star2" name="rate" value="2" />
  <label for="star2" title="text">2 stars</label>
  <input type="radio" id="star1" name="rate" value="1" />
  <label for="star1" title="text">1 star</label>
</div>

Only the last div is correctly working.

Upvotes: 0

Views: 410

Answers (2)

Jon P
Jon P

Reputation: 19772

You've got two problems:

  1. Duplicate Ids. Ids have to be unique.
  2. Your rating groups have the same name. Each group should have a distinct name

Fix that an all works.

.rate {
    float: left;
    /*pointer-events: none;*/
}

.rate:not(:checked) > input {
    position: absolute;
    top: -9999px;
}

.rate:not(:checked) > label {
    float: right;
    width: 1em;
    overflow: hidden;
    white-space: nowrap;
    cursor: pointer;
    font-size: 12px;
    color: #ccc;
}

.rate:not(:checked) > label:before { content: '★ '; }

.rate > input:checked ~ label { color: #ffc700; }

.rate:not(:checked) > label:hover, .rate:not(:checked) > label:hover ~ label { color: #deb217; }

.rate > input:checked + label:hover, .rate > input:checked + label:hover ~ label, .rate > input:checked ~ label:hover, .rate > input:checked ~ label:hover ~ label, .rate > label:hover ~ input:checked ~ label { color: #c59b08; }
<div class="rate">
    <input type="radio" id="v1_star5" name="rate1" value="5" />
    <label for="v1_star5" title="text">5 stars</label>
    <input type="radio" id="v1_star4" name="rate1" value="4" checked/>                    
    <label for="v1_star4" title="text">4 stars</label>                                   
    <input type="radio" id="v1_star3" name="rate1" value="3" />
    <label for="v1_star3" title="text">3 stars</label>                                   
    <input type="radio" id="v1_star2" name="rate1" value="2" />                           
    <label for="v1_star2" title="text">2 stars</label>                                   
    <input type="radio" id="v1_star1" name="rate1" value="1" />                           
    <label for="v1_star1" title="text">1 star</label>
    </div>

   <div class="rate">
    <input type="radio" id="v2_star5" name="rate2" value="5" checked/>
    <label for="v2_star5" title="text">5 stars</label>
    <input type="radio" id="v2_star4" name="rate2" value="4" />                    
    <label for="v2_star4" title="text">4 stars</label>                                   
    <input type="radio" id="v2_star3" name="rate2" value="3" />
    <label for="v2_star3" title="text">3 stars</label>                                   
    <input type="radio" id="v2_star2" name="rate2" value="2" />                           
    <label for="v2_star2" title="text">2 stars</label>                                   
    <input type="radio" id="v2_star1" name="rate2" value="1" />                           
    <label for="v2_star1" title="text">1 star</label>
    </div>

I've removed the pointer-events style so you can see the full end result.

Upvotes: 1

Cornel Raiu
Cornel Raiu

Reputation: 2995

If you have the same "name" tag on all radio buttons, they will be treated as only one set of radio buttons even if they are in 2 different divs.

Also, it is bad practice to have duplicate ids on elements

To have it fixed, you should have your html like this https://jsfiddle.net/cornelraiu/70sk3ft6/1/:

<div class="rate">
    <input type="radio" name="rate" value="5" />
    <label title="text">5 stars</label>
    <input type="radio" name="rate" value="4" checked/>                    
    <label title="text">4 stars</label>                                   
    <input type="radio" name="rate" value="3" />
    <label title="text">3 stars</label>                                   
    <input type="radio" name="rate" value="2" />                           
    <label title="text">2 stars</label>                                   
    <input type="radio" name="rate" value="1" />                           
    <label title="text">1 star</label>
</div>

<div class="rate">
    <input type="radio" name="rate1" value="5" checked/>
    <label title="text">5 stars</label>
    <input type="radio" name="rate1" value="4" />                    
    <label title="text">4 stars</label>                                   
    <input type="radio" name="rate1" value="3" />
    <label title="text">3 stars</label>                                   
    <input type="radio" name="rate1" value="2" />                           
    <label title="text">2 stars</label>                                   
    <input type="radio" name="rate1" value="1" />                           
    <label title="text">1 star</label>
</div>

Upvotes: 3

Related Questions