Como criar Rating Component

Introdução
Neste tutorial, vou mostrar como criar um Rating Component utilizando apenas html, css e Javascritp.
O Tutorial será breve e de forma rápida não será necessário o uso de nenhum tipo de biblioteca externa, será apenas html e css .
Primeiro passo você deverá criar a estrutura da página, para isso crie um arquivo html contendo o código que mostro abaixo:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title> Rating Component
</title>
</head>
<body>
</body>
</html>
Logo após crio um componente Rating :
<div class="rating">
<div class="title">
<span>★</span>
<span class="label">Rating Component</span>
</div>
<div class="star-container">
<span class="star" data-value="1">★</span>
<span class="star" data-value="2">★</span>
<span class="star" data-value="3">★</span>
<span class="star" data-value="4">★</span>
<span class="star" data-value="5">★</span>
</div>
<span id="ratingScore" class="score-label">Score: 0 star(s)</span>
</div>
Uma breve explicação do código acima, para definir as estrelas adicionei elas ao componente <span> com a classe star e o atributo data-value para identificar o valor de cada estrela.
Depois adiciono o css responsável pela estilização da página :
<style>
body {
width: 100vw;
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
background-color: #111111;
}
.rating {
display: flex;
flex-direction: column;
justify-content: center;
gap: 0.5rem;
padding: 1rem 2rem;
border-radius: 0.5rem;
border: 1px solid #b6b7f6;
background-color: #141920;
color: #b6b7f6;
}
.star-container {
display: flex;
justify-content: center;
gap: 0.8rem;
}
.title {
display: flex;
justify-content: center;
align-items: baseline;
gap: 0.5rem;
align-self: flex-start;
margin-bottom: 0.5rem;
}
.title span {
font-size: 2.25rem;
line-height: 2.25rem;
color: #82be0f;
}
.title .label {
font-weight: 900;
font-size: 1.5rem;
line-height: 1.5rem;
text-align: end;
}
.star {
padding: 1rem;
font-size: 2rem;
line-height: 2rem;
cursor: pointer;
color: #b6b7f6;
transition: color 0.2s, background-color 0.2s;
border: 1px solid #b6b7f6;
border-radius: 0.5rem;
box-sizing: border-box;
}
.star:hover,
.star.hover {
background-color: #82be0f;
color: white;
border-color: #82be0f;
}
.star.selected {
background-color: #82be0f;
color: white;
border-color: #82be0f;
}
.score-label {
text-align: center;
margin-top: 10px;
font-size: 20px;
}
</style>
No código acima, utilizei a tag <style>
para adicionar o CSS diretamente no arquivo HTML. Abaixo deixo uma breve explicação das principais partes do CSS:
- body: Nesta tag adicionei as propriedades para centralizar o conteúdo na tela e definir o fundo e o alinhamento dos componentes.
Por ultimo adiciono o script responsável por adicionar a animação ao Rating Component:
const stars = document.querySelectorAll(".star");
let ratingValue = 0;
const ratingScore = document.getElementById("ratingScore");
function highlightStars(value) {
stars.forEach((star) => {
if (star.dataset.value <= value) {
star.classList.add("selected");
} else {
star.classList.remove("selected");
}
});
}
stars.forEach((star) => {
star.addEventListener("click", () => {
ratingValue = star.dataset.value;
highlightStars(ratingValue);
ratingScore.textContent = `Score: ${ratingValue} star(s)`;
});
star.addEventListener("mouseover", () => {
highlightStars(star.dataset.value);
});
star.addEventListener("mouseout", () => {
highlightStars(ratingValue);
});
});
- 1ª: Defino as variáveis que vão armazenar as tags que contém as estrelas e a label onde vou inserir a informação do total da votação.
- 2ª: Adiciono os eventos (
click
) , (mouseover
) , (mouseout
) para capturar os eventos que usuário aciona ao interagir com as tags de votação .
Deixo aqui um vídeo curto do processo e de como ficou o Rating Component:
Conclusão
Com esses simples passos, você consegue de forma rápida criar um Rating Component usando apenas HTML e CSS. Caso necessite você pode personalizar a animação e a estilização conforme a sua necessidade.
Código fonte do tutorial do Rating Component: