Interactive Rating Component

Solution retrospective
With some work, I managed to get it mostly right.
What challenges did you encounter, and how did you overcome them?The biggest challenges were styling the buttons, and figuring out how to get the values.
What specific areas of your project would you like help with?The only issue now is that when you click right in the middle of the buttons, you get "You have selected undefined out of 5" on the thank you card. Each button is a ```` with a label
and an input
inside. I get the values from a data-value
attribute set on the divs. I increased the padding on the mobile version to get a bigger target size.
Please log in to post a comment
Log in with GitHubCommunity feedback
- @RoksolanaVeres
Hi! I have a simpler solution. You don't need a separate wrapper for label and input, instead you can wrap your input by the label itself:
HTML:
<label class="rating-btn-wrapper"> <input type="radio" name="rating" value="1" class="rating-btn" /> 1 </label> <label class="rating-btn-wrapper"> <input type="radio" name="rating" value="2" class="rating-btn" /> 2 </label> ...
Now you don't need to use id and for attributes. Here you can read more about it:
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label
Now your button styles are broken. To make rating buttons completely round, just remove paddings and add fixed width and height for buttons:
CSS:
.rating-btn-wrapper { background-color: var(--clr-dark-blue); height: 45px; width: 45px; border-radius: 50%; ...
Marked as helpful - @kodan96
hi there! 👋
I would probably wrap the radio buttons and the labels into wrappers:
<div class="rating-btn-wrapper" data-value="3"> <label for="option-3">3</label> <input type="radio" name="rating" id="option-3" value="3" class="rating-btn"> </div>
and change the selector to target the input element directly:
let ratingButtons = document.querySelectorAll(".rating-btn-wrapper input");
so within your event handler you can retrieve the value directly:
function ratingBtnClicked(e) { ratingButtons.forEach((button) => button.parentElement.classList.remove("active")); this.parentElement.classList.add("active"); defaultScore = this.value; }
Hope I got it right.
Marked as helpful
Join our Discord community
Join thousands of Frontend Mentor community members taking the challenges, sharing resources, helping each other, and chatting about all things front-end!
Join our Discord