Reputation: 1344
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
Reputation: 19772
You've got two problems:
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
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