I'm trying to make a star rating system, i have this code and i want to make some changes on it, after the user clicks on the stars it shows an alert with how many stars and it resets the colors, what i want is the color filling to stay after the user clicks on it, and replace the alert with a div under the stars, here is my code:
$(function() {
$("div.star-rating > s, div.star-rating-rtl > s").on("click", function(e) {
var numStars = $(e.target).parentsUntil("div").length+1;
alert(numStars + (numStars == 1 ? " star" : " stars!"));
});
});
.star-rating s:hover {
color: red;
}
.star-rating-rtl s:hover {
color: red;
}
.star-rating s,
.star-rating-rtl s {
color: black;
font-size: 50px;
cursor: default;
text-decoration: none;
line-height: 50px;
}
.star-rating {
padding: 2px;
}
.star-rating-rtl {
background: #555;
display: inline-block;
border: 2px solid #444;
}
.star-rating-rtl s {
color: yellow;
}
.star-rating s:hover:before, .star-rating s.rated:before {
content: "\2605";
}
.star-rating s:before {
content: "\2606";
}
.star-rating-rtl s:hover:after, .star-rating-rtl s.rated:after{
content: "\2605";
}
.star-rating-rtl s:after {
content: "\2606";
}
<script src=".1.1/jquery.min.js"></script>
<div class="star-rating"><s><s><s><s><s></s></s></s></s></s></div>
<div class="star-rating-rtl"><s><s><s><s><s></s></s></s></s></s></div>
I'm trying to make a star rating system, i have this code and i want to make some changes on it, after the user clicks on the stars it shows an alert with how many stars and it resets the colors, what i want is the color filling to stay after the user clicks on it, and replace the alert with a div under the stars, here is my code:
$(function() {
$("div.star-rating > s, div.star-rating-rtl > s").on("click", function(e) {
var numStars = $(e.target).parentsUntil("div").length+1;
alert(numStars + (numStars == 1 ? " star" : " stars!"));
});
});
.star-rating s:hover {
color: red;
}
.star-rating-rtl s:hover {
color: red;
}
.star-rating s,
.star-rating-rtl s {
color: black;
font-size: 50px;
cursor: default;
text-decoration: none;
line-height: 50px;
}
.star-rating {
padding: 2px;
}
.star-rating-rtl {
background: #555;
display: inline-block;
border: 2px solid #444;
}
.star-rating-rtl s {
color: yellow;
}
.star-rating s:hover:before, .star-rating s.rated:before {
content: "\2605";
}
.star-rating s:before {
content: "\2606";
}
.star-rating-rtl s:hover:after, .star-rating-rtl s.rated:after{
content: "\2605";
}
.star-rating-rtl s:after {
content: "\2606";
}
<script src="https://ajax.googleapis./ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="star-rating"><s><s><s><s><s></s></s></s></s></s></div>
<div class="star-rating-rtl"><s><s><s><s><s></s></s></s></s></s></div>
Share
Improve this question
edited Jun 9, 2017 at 16:14
jessica
asked Jun 9, 2017 at 16:07
jessicajessica
4951 gold badge10 silver badges28 bronze badges
5 Answers
Reset to default 6See for the .active
class added in CSS to find the changes there.
See code and ments in JS
$(function() {
$("div.star-rating > s, div.star-rating-rtl > s").on("click", function(e) {
// remove all active classes first, needed if user clicks multiple times
$(this).closest('div').find('.active').removeClass('active');
$(e.target).parentsUntil("div").addClass('active'); // all elements up from the clicked one excluding self
$(e.target).addClass('active'); // the element user has clicked on
var numStars = $(e.target).parentsUntil("div").length+1;
$('.show-result').text(numStars + (numStars == 1 ? " star" : " stars!"));
});
});
.show-result {
margin: 10px;
padding: 10px;
color: green;
font-size: 20px;
}
.star-rating s:hover,
.star-rating s.active {
color: red;
}
.star-rating-rtl s:hover,
.star-rating-rtl s.active {
color: red;
}
.star-rating s,
.star-rating-rtl s {
color: black;
font-size: 50px;
cursor: default;
text-decoration: none;
line-height: 50px;
}
.star-rating {
padding: 2px;
}
.star-rating-rtl {
background: #555;
display: inline-block;
border: 2px solid #444;
}
.star-rating-rtl s {
color: yellow;
}
.star-rating s:hover:before,
.star-rating s.rated:before,
.star-rating s.active:before {
content: "\2605";
}
.star-rating s:before {
content: "\2606";
}
.star-rating-rtl s:hover:after,
.star-rating-rtl s.rated:after,
.star-rating-rtl s.active:after {
content: "\2605";
}
.star-rating-rtl s:after {
content: "\2606";
}
<script src="https://ajax.googleapis./ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="star-rating"><s><s><s><s><s></s></s></s></s></s></div>
<div class="star-rating-rtl"><s><s><s><s><s></s></s></s></s></s></div>
<div class="show-result">No stars selected yet.</div>
Here are two options:
When the user clicks, set a class on the parent container == to the star rating, like rated-3
. Then, use CSS' first-child
and sibling selectors to active the first star and N more stores.
When the user clicks, use JS to set class="active"
on all stars up to and including the clicked star.
For either scenario, replicate your hover CSS to apply to .active
or :first-child, :first-child+s,...
. elements.
Here is how you can do it. Add another div under your star divs and give it an id lets say id=selectedStars
in your js code replace alert line with this one
document.getElementById('selectedStars').innerHTML=numStars;
here you go , this will give you selected stars count in the last div
Here's the option by using the class rated
that you have in your CSS.
//remove ratings
$("s").removeClass("rated");
//adds the rated class
$(e.target).parents("s").addClass('rated');
$(e.target).closest("s").addClass('rated');
$(function() {
$("div.star-rating > s, div.star-rating-rtl > s").on("click", function(e) {
// remove all active classes first, needed if user clicks multiple times
$(this).closest('div').find('.active').removeClass('active');
$(e.target).parentsUntil("div").addClass('active'); // all elements up from the clicked one excluding self
$(e.target).addClass('active'); // the element user has clicked on
var numStars = $(e.target).parentsUntil("div").length+1;
$('.show-result').text(numStars + (numStars == 1 ? " star" : " stars!"));
});
});
.show-result {
margin: 10px;
padding: 10px;
color: green;
font-size: 20px;
}
.star-rating s:hover,
.star-rating s.active {
color: red;
}
.star-rating-rtl s:hover,
.star-rating-rtl s.active {
color: red;
}
.star-rating s,
.star-rating-rtl s {
color: black;
font-size: 50px;
cursor: default;
text-decoration: none;
line-height: 50px;
}
.star-rating {
padding: 2px;
}
.star-rating-rtl {
background: #555;
display: inline-block;
border: 2px solid #444;
}
.star-rating-rtl s {
color: yellow;
}
.star-rating s:hover:before,
.star-rating s.rated:before,
.star-rating s.active:before {
content: "\2605";
}
.star-rating s:before {
content: "\2606";
}
.star-rating-rtl s:hover:after,
.star-rating-rtl s.rated:after,
.star-rating-rtl s.active:after {
content: "\2605";
}
.star-rating-rtl s:after {
content: "\2606";
}
<script src="https://ajax.googleapis./ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="star-rating"><s><s><s><s><s></s></s></s></s></s></div>
<div class="star-rating-rtl"><s><s><s><s><s></s></s></s></s></s></div>
<div class="show-result">No stars selected yet.</div>