Для реализации системы звездного рейтинга, которая будет реагировать на наведение и клики, вы можете дополнить ваш код следующим образом. Я предоставлю как HTML-разметку, так и завершённый JavaScript-код, который позволит вам создать интерактивную систему рейтинга.
### HTML-разметка
```html
<div class="rating rating_set">
<div class="rating__activeline"></div>
<input type="hidden" class="rating-input" value="0">
<div class="rating__stars">
<div class="rating__star" data-value="1">★</div>
<div class="rating__star" data-value="2">★</div>
<div class="rating__star" data-value="3">★</div>
<div class="rating__star" data-value="4">★</div>
<div class="rating__star" data-value="5">★</div>
</div>
</div>
```
### CSS (для визуального отображения)
```css
.rating {
position: relative;
display: inline-block;
direction: rtl; /* Звезды будут выстраиваться справа налево */
}
.rating__activeline {
position: absolute;
top: 0;
left: 0;
height: 100%;
background: gold; /* Цвет закрашенной части звезд */
width: 0%;
overflow: hidden;
z-index: 1; /* Чтобы "активная линия" была поверх звезд */
}
.rating__stars {
display: flex;
cursor: pointer;
}
.rating__star {
font-size: 30px;
color: lightgray; /* Цвет незакрашенных звезд */
transition: color 0.3s;
}
.rating__star.hover,
.rating__star.selected {
color: gold; /* Цвет закрашенных звезд при наведении */
}
```
### JavaScript (завершение вашего кода)
```javascript
const ratings = document.querySelectorAll('.rating');
if (ratings.length > 0) {
initRatings();
}
function initRatings() {
let ratingActive, ratingValue;
for (let index = 0; index < ratings.length; index++) {
const rating = ratings[index];
initRating(rating);
}
function initRating(rating) {
initRatingVars(rating);
setRatingActiveWidth();
if (rating.classList.contains('rating_set')) {
setRating(rating);
}
}
function initRatingVars(rating) {
ratingActive = rating.querySelector('.rating__activeline');
ratingValue = rating.querySelector('.rating-input');
}
function setRatingActiveWidth() {
if (ratingValue) {
const ratingActiveWidth = ratingValue.value * 20; // 5 звезд -> 100%
ratingActive.style.width = `${ratingActiveWidth}%`;
}
}
if (ratingValue) {
ratingValue.addEventListener('change', function () {
setRatingActiveWidth();
});
}
function setRating(rating) {
const ratingItems = rating.querySelectorAll('.rating__star');
ratingItems.forEach(item => {
item.addEventListener('mouseover', setRatingOnHover);
item.addEventListener('mouseout', resetRatingOnMouseOut);
item.addEventListener('click', setRatingOnClick);
});
function setRatingOnHover(event) {
const target = event.target;
const value = target.dataset.value;
highlightStars(value);
}
function resetRatingOnMouseOut() {
highlightStars(ratingValue.value);
}
function setRatingOnClick(event) {
const target = event.target;
ratingValue.value = target.dataset.value;
setRatingActiveWidth();
}
function highlightStars(value) {
ratingItems.forEach(star => {
star.classList.remove('hover');
if (star.dataset.value <= value) {
star.classList.add('hover');
}
});
}
}
}
```
### Объяснение кода
1. **HTML**: Структура включает в себя контейнер для рейтинга, скрытый инпут для хранения значения рейтинга и сами звезды.
2. **CSS**: Определяет стили для активных и неактивных звезд, включая эффекты при наведении.
3. **JavaScript**:
- Обрабатывает события наведения, клика и сброса.
- Обновляет ширину закрашенной области в зависимости от значения рейтинга.
- Реализует логику для обновления внешнего вида звезд при наведении и клике.
Теперь ваш звездный рейтинг будет работать в соответствии с заданными