Система оценки 5 звезд CSS, проблема диапазона звезд

Я создал 5-звездочную рейтинговую систему. Мой css настроен для отображения звезд на сером фоне, которые закреплены на экране. При наведении указателя мыши на синие звезды появляются, хотя эти звезды расположены по центру и расходятся, например, когда я выбираю 1 звезду, средняя звезда становится золотой вместо самой левой серой звезды; аналогично, если я выбираю 2 звезды, между ними появляются две золотые звезды. вторая и четвертая серые звезды, на фоне которых все еще видны серые звезды. Это выглядит очень неопрятно.

Может ли кто-нибудь посоветовать, как я могу изменить свой код, чтобы фактические звезды были выбраны золотыми?

Мое изображение звезд - stars.png, на котором изображены серая, синяя и золотая звезды соответственно.

Мои знания css ограничены. Я попытался изменить несколько компонентов CSS один за другим, например ширину или пиксель, но безрезультатно.

Вот мой css.

form .stars {
  background: url("stars.png") repeat-x 0 0;
  width: 150px;
  margin: 0 auto;
}

form .stars input[type="radio"] {
  position: absolute;
  opacity: 0;
  filter: alpha(opacity=0);
}
form .stars input[type="radio"].star-5:checked ~ span {
  width: 100%;
}
form .stars input[type="radio"].star-4:checked ~ span {
  width: 80%;
}
form .stars input[type="radio"].star-3:checked ~ span {
  width: 60%;
}
form .stars input[type="radio"].star-2:checked ~ span {
  width: 40%;
}
form .stars input[type="radio"].star-1:checked ~ span {
  width: 20%;
}
form .stars label {
  display: block;
  width: 30px;
  height: 30px;
  margin: 0!important;
  padding: 0!important;
  text-indent: -999em;
  float: left;
  position: relative;
  z-index: 10;
  background: transparent!important;
  cursor: pointer;
}
form .stars label:hover ~ span {
  background-position: 0 -30px;
}
form .stars label.star-5:hover ~ span {
  width: 100% !important;
}
form .stars label.star-4:hover ~ span {
  width: 80% !important;
}
form .stars label.star-3:hover ~ span {
  width: 60% !important;
}
form .stars label.star-2:hover ~ span {
  width: 40% !important;
}
form .stars label.star-1:hover ~ span {
  width: 20% !important;
}
form .stars span {
  display: block;
  width: 0;
  position: relative;
  top: 0;
  left: 0;
  height: 30px;
  background: url("stars.png") repeat-x 0 -60px;
  -webkit-transition: -webkit-width 0.5s;
  -moz-transition: -moz-width 0.5s;
  -ms-transition: -ms-width 0.5s;
  -o-transition: -o-width 0.5s;
  transition: width 0.5s;
}

person scubbastevie    schedule 07.03.2016    source источник
comment
Гм, не могли бы вы удалить номера строк?   -  person Jacob Gray    schedule 08.03.2016
comment
Привет @JacobGray. Я удалил номера строк по запросу. Кстати, в моем коде их не было   -  person scubbastevie    schedule 08.03.2016
comment
По сути дело сводится к изменению атрибута background-position. Вы перемещаете фоновое изображение так, чтобы отображалось желаемое состояние звезды. Я не могу предоставить точный код, потому что не знаю, как выглядит ваш звездный спрайт.   -  person Scott    schedule 08.03.2016
comment
Вот довольно убедительный пример, в котором input:checked ~ label:before применяется для применения стиля к текущему проверенному радиомодулю и радиостанциям с более низким значением. codepen.io/lsirivong/pen/ekBxI   -  person Anthony    schedule 08.03.2016
comment
Вот тот же пример, но я немного поработал с ним, чтобы его упростить. jsfiddle.net/ve3m7vxe   -  person Anthony    schedule 08.03.2016
comment
Привет, @Scott. Мои спрайты на одном изображении наложены друг на друга. Серая звезда вверху, голубая звезда посередине и золотая звезда внизу, если это помогает?   -  person scubbastevie    schedule 08.03.2016
comment
Привет @Anthony. Я пробовал ваш пример, но он не работал с моей текущей настройкой. Остальная часть моей страницы находится на белом фоне. Я удалил код для этого, но звезды не отображались правильно, я только что получил черный прямоугольник без звезд. Сможете ли вы изменить код, чтобы он имел белый фон, а звезды имели черный или серый контур, а затем золотой, если они выбраны? Спасибо   -  person scubbastevie    schedule 08.03.2016


Ответы (1)


Есть более компактное решение для этого 5-звездочного кода. Это включает в себя изменение способа работы соседних селекторов, используя:

unicode-bidi: bidi-override;
direction: rtl;

В этой демонстрации используется простой шрифт, который делает его быстрее, чем обычные <img> или спрайты, и в качестве шрифта он подчиняется color, font-size, font-style и т. Д.

Подробнее читайте в этой статье.

Plunker

Фрагмент

<!DOCTYPE html>
<html>

<head>
  <meta charset='UTF-8'>
  <title>Star Ratings</title>
  <style>
    .rate {
      unicode-bidi: bidi-override;
      direction: rtl;
      text-align: center;
    }
    .rate> span {
      display: inline-block;
      position: relative;
      width: 1.1em;
    }
    .rate > span:hover,
    .rate > span:hover ~ span {
      color: transparent;
    }
    .rate > span:hover:before,
    .rate > span:hover ~ span:before {
      content: "\2605";
      position: absolute;
      left: 0;
      color: gold;
    }
  </style>
</head>

<body>
  <aside class="rate">
    <span>☆</span><span>☆</span><span>☆</span><span>☆</span><span>☆</span>
  </aside>
</body>

</html>

person zer00ne    schedule 08.03.2016
comment
Hi @ zer00ne попробовал это, но звезды не отображаются, так как остальная часть моей страницы настроена с помощью css. Я просто получаю странные символы там, где должны быть звезды - person scubbastevie; 08.03.2016
comment
Чтобы уточнить, звезды действительно появляются при наведении курсора, но когда предполагаемые звезды горят в нормальном состоянии, наверху появляется а с символом ~. - person scubbastevie; 09.03.2016
comment
Вы используете точный код, который я предоставил? Или вы взяли важные части кода, а затем интегрировали их на свою страницу? Если последнее, то я подозреваю, что вашей странице нужен этот <meta charset="utf-8"> в <head> - person zer00ne; 09.03.2016
comment
Я использовал именно тот код, который вы предложили, у меня есть другой код на моей странице для определения среднего рейтинга и т. Д., Поэтому я подозреваю, что он противоречит этому, или потому, что я использую браузер Internet Explorer - person scubbastevie; 09.03.2016
comment
У вас есть <!doctype html>, <meta http-equiv="X-UA-Compatible" content="IE=edge"> и <meta charset="utf-8"> на самом верху. На вашей странице некорректно отображается Юникод. - person zer00ne; 09.03.2016