Задать вопрос
Этот вопрос закрыт для ответов, так как повторяет вопрос Как реализовать звёздный рейтинг с закрашиванием звёзд?
@TipTop89

Как сделать звездный рейтинг?

Подскажите, как реализовать звездный рейтинг что-бы при наведении звезды закрашивались и при клике в инпут попадало количество закрашенных звезд? Спасибо!

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 / 0.05;
                ratingActive.style.width = `${ratingActiveWidth}%`;
            }
        };

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

        // Возможность указать оценку 
        function setRating(rating) {
            const ratingItems = rating.querySelectorAll('.rating__star');
            for (let index = 0; index < ratingItems.length; index++) {
                const ratingItem = ratingItems[index];
                ratingItem.addEventListener("mouseenter", function (e) {
                    ratingActive.style.width = '0%';
                    let linew = (index + 1) / 0.05;
                    ratingActive.style.width = `${linew}%`;
                    initRatingVars(rating);
                });
                ratingItem.addEventListener("click", function (e) {

                    // Обновление переменных
                    initRatingVars(rating);

                    if (rating.dataset.ajax) {
                        // "Отправить" на сервер
                        setRatingValue(ratingItem.value, rating);
                    } else {
                        // Отобразить указанную оцнку
                        ratingValue.value = index + 1;
                        setRatingActiveWidth();
                    }
                });

            }
        }
    }

.rating {
  display: flex;
  flex-wrap: wrap;
}

.rating__body {
  display: inline-block;
  position: relative;
  width: 101px;
  user-select: none;
}

.rating__line {
  position: absolute;
  width: 101px;
  height: 16px;
  top: 0;
  left: 0;
  background: 0 0 / auto 16px url("https://i.ibb.co/RYvRDph/bg-rating.png")
    no-repeat;
}

.rating__activeline {
  position: absolute;
  width: 0px;
  height: 16px;
  top: 0;
  left: 0;
  background: 0 0 / auto 16px
    url("https://i.ibb.co/QbhcQwD/bg-rating-active.png") no-repeat;
  z-index: 2;
}

.rating__star {
  width: 16px;
  height: 16px;
  display: inline-block;
  position: relative;
  z-index: 3;
}

.rating__value {
  font-weight: 600;
  font-size: 18px;
}

.rating__input {
  width: 100%;
}

<div class="rating">
  <div class="rating__body rating_set">
    <div class="rating__line"></div>
    <div class="rating__activeline"></div>
    <div class="rating__stars">
      <span class="rating__star"></span>
      <span class="rating__star"></span>
      <span class="rating__star"></span>
      <span class="rating__star"></span>
      <span class="rating__star"></span>
    </div>
    <input
      data-required
      value="3"
      autocomplete="off"
      type="number"
      min="1"
      max="5"
      name="rating"
      class="rating-input"
    />
  </div>
</div>
  • Вопрос задан
  • 58 просмотров
Подписаться 1 Средний 1 комментарий
Ответы на вопрос 1
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
Как много кода для простого рейтинга.

Ответ написан
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы