Каким образом можно создать систему звездного рейтинга?

Как реализовать звездный рейтинг так, чтобы при наведении на звезды они закрашивались, а при клике в инпут записывалось количество закрашенных звезд? Спасибо! <br/> <pre><code class="javascript">const ratings = document.querySelectorAll('.rating');
    if (ratings.length &gt; 0) {
        initRatings();
    }
    // Основная функция
    function initRatings() {
        let ratingActive, ratingValue;
        // "Бегаем" по всем рейтингам на странице
        for (let index = 0; index &lt; 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 / 0.05;
                ratingActive.style.width = `${ratingActiveWidth}%`;
            }
        };

        if (ratingValue) {
            ratingValue.addEventListener('change', function () {
                setRatingActiveWidth();
            });
        };

        // Возможность указать оценку 
        function setRating(rating) {
            const ratingItems = rating.querySelectorAll('.rating__star');
  • 21 января 2025 г. 3:44
Ответы на вопрос 2
Для реализации системы звездного рейтинга, которая будет реагировать на наведение и клики, вы можете дополнить ваш код следующим образом. Я предоставлю как 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**:
   - Обрабатывает события наведения, клика и сброса.
   - Обновляет ширину закрашенной области в зависимости от значения рейтинга.
   - Реализует логику для обновления внешнего вида звезд при наведении и клике.

Теперь ваш звездный рейтинг будет работать в соответствии с заданными
Как много кода для простого рейтинга. 

Похожие вопросы