Звездный рейтинг с html и javascript не работает в правильном порядке

Я попытался создать звездную рейтинговую систему с помощью HTML и JavaScript, но она не работает должным образом.

Вместо того, чтобы работать слева направо, он работает в обратном направлении — справа налево. Например, если я нажму на четвертую звезду, она окрасит четыре звезды справа налево, а не слева направо, так что первая звезда останется неокрашенной.

Кто-нибудь может подсказать, как исправить эту проблему?

function fillStars(num) {
  for (var i = 1; i <= 5; i++) {
    var star = document.getElementById('star' + i.toString());
    if (i <= num) {
      star.checked = true;
    } else {
      star.checked = false;
    }
  }
}
.rating {
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: center;
}

.rating input[type = "radio"] {
  display: none;
}

.rating label {
  font-size: 60px;
  margin-right: 10px;
  cursor: pointer;
}

.rating label::before {
  content: "\2606";
  display: inline-block;
  width: 1.1em;
  text-align: center;
}

.rating label.checked::before {
  content: "\2605";
  color: gold;
}

.rating label.checked~label::before {
  content: "\2605";
  color: gold;
}

.rating input[type = "radio"]:checked {
  content: "\2605";
  color: gold;
}

.rating input[type = "radio"]:checked~label::before {
  content: "\2605";
  color: gold;
}
<div class = "form-name">
  <fieldset class = "rating">
    <legend>Bewertung:</legend>
    <input type = "radio" id = "star1" name = "rating" value = "1" onclick = "fillStars(1)" />
    <label for = "star1" title = "1 Stern"></label>
    <input type = "radio" id = "star2" name = "rating" value = "2" onclick = "fillStars(2)" />
    <label for = "star2" title = "2 Sterne"></label>
    <input type = "radio" id = "star3" name = "rating" value = "3" onclick = "fillStars(3)" />
    <label for = "star3" title = "3 Sterne"></label>
    <input type = "radio" id = "star4" name = "rating" value = "4" onclick = "fillStars(4)" />
    <label for = "star4" title = "4 Sterne"></label>
    <input type = "radio" id = "star5" name = "rating" value = "5" onclick = "fillStars(5)" />
    <label for = "star5" title = "5 Sterne"></label>
  </fieldset>
</div>

В любой момент времени может быть выбрана только одна радиокнопка из группы радиокнопок.

CBroe 30.03.2023 13:17

Пожалуйста, уточните вашу конкретную проблему или предоставьте дополнительную информацию, чтобы выделить именно то, что вам нужно. Как сейчас написано, трудно точно сказать, о чем вы спрашиваете.

Community 30.03.2023 13:17

«если я нажму на четвертую звезду, она будет окрашивать четыре звезды справа налево, а не слева направо» — на самом деле это не то, что происходит с кодом, который вы показали — jsfiddle.net/q318ramf

CBroe 30.03.2023 13:18

@CBroe Извините, я забыл поделиться своим css. Я редактирую это выше

Kristijan Pehar 30.03.2023 13:54

Ваша функция JavaScript здесь совершенно излишня - все, что она делает, устанавливает переключатель, который уже был проверен (потому что пользователь щелкнул его), снова отмечен. Окраска звезд основана исключительно на CSS. input[type = "radio"]:checked~label выбирает все ярлыки, которые идут после отмеченного переключателя. CSS не может выбрать «другое» направление.

CBroe 30.03.2023 14:05

Итак, чтобы это работало правильно, вам нужно: а) изменить порядок ваших переключателей в HTML - нужно начинать с 5, опускаясь до 1; и б) снова изменить визуальный порядок, используя flex-direction: row-reverse; на контейнере.

CBroe 30.03.2023 14:06
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Пожалуйста, замените приведенный ниже код в css:

.rating {
  display: flex;
  flex-direction: row-reverse;
  justify-content: center;
  align-items: center;
}

Надеюсь, это решит вашу проблему.

Прежде всего, ваш цикл for не имеет особого смысла, так как можно проверить только один элемент radio группы. Вы можете вообще удалить этот фрагмент. Меток достаточно, чтобы сделать нужный радиоэлемент кликабельным.

Затем вам нужно подумать о CSS. Вы хотите сделать все после проверенного радиоэлемента пустой звездой, поэтому ввод должен идти после звезды.

Другие вопросы по теме