Как динамически раскрашивать звезды в звездном рейтинге?

У меня есть форма, в которой пользователи могут оценивать продукт, где мне нужно визуально показать звездный рейтинг. Мне нужно раскрасить звезды в соответствии со значением рейтинга, которое я получаю из базы данных, для каждого пользователя, а также в соответствии со средним значением.

Например, пользователь А поставил 5 звезд, а пользователь Б поставил только 3 звезды. Когда я показываю рейтинг пользователя А, мне нужно раскрасить все 5 звезд, а когда я показываю рейтинг пользователя Б, мне нужно раскрасить только 3 звезды. Это означает, что я должен динамически раскрашивать звезды.

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

Мой дисплей не должен содержать функцию наведения.

Мой вопрос о том, как раскрасить звезды в соответствии с рассчитанным средним значением или рейтингом, взятым из базы данных.

Я использую codeigniter в своем проекте.

Спасибо за любую помощь :-)


person mad_ss    schedule 08.04.2016    source источник


Ответы (1)


Вложите один элемент <span> в другой.
Внешний <span> имеет фоновое изображение из пустых звездочек.
Внутренний <span> имеет фоновое изображение закрашенной звезды, а элемент width: задается программно при макетировании. страница. Например, width:60.0% можно использовать для рейтинга 3/5 звезд.

Для небольшой оптимизации вы можете даже использовать start с изображением, состоящим только из одной звезды, и использовать repeat-x, чтобы получить все 5 звездочек. Вы также можете иметь изображение, которое включает в себя как цветные, так и заполненные звезды по вертикали, и обрезать во время отображения, чтобы определить, на какую версию звезды вы ссылаетесь.

Пример 1:

Например, рассмотрим следующий CSS:

span.rating-frame, span.rating-fill {
    background: url(../star.png) 0 -16px repeat-x;
    display: block;
    width: 80px; /* this is 5 times the width of the star, for 5 stars total */
    height: 16px;
}
span.rating-fill {
    background-position: 0 0; /* use the (filled-in) version from the top of the image */
}

и следующий HTML:

Average Rating: 4/5
<span class="rating-frame">
      <span style="width:80.0%;" class="rating-fill"> </span>
</span>

User A:  5/5
<span class="rating-frame">
      <span style="width:100.0%;" class="rating-fill"> </span>
</span>

User B: 3/5
<span class="rating-frame">
      <span style="width:60.0%;" class="rating-fill"> </span>
</span>

Предполагается, что star.png представляет собой изображение размером 16 x 32 с заполненной звездой вверху.
Значение атрибута ширины задается как userRating/maxPossibleRating, округленное до соответствующей точности. Конечно, там, где вы показываете общий средний рейтинг, он устанавливается averageUserRating/maxPossibleRating.


Пример 2:

Вместо этого OP сообщает, используя <span>☆</span>. Следующий псевдокод может быть полезен для генерации страниц.

for (i = 1 to rating inclusive) {
    print "<span>★</span>"
}
//if including a half-star, replace this comment with the code to do so.
for (i = rating+1 to maxRating inclusive) {
    print "<span>☆</span>"
}

но если у вас нет наполовину заполненного символа звезды, вы не сможете использовать его в своем выводе. Вместо этого вы можете попробовать использовать символ ½.


Пример 3:

Пример eBay OP ссылается на использование источника следующим образом:

   <span class="display-text-rating">3.7 stars</span>
   <div class="star-rating-section" title="3.7 out of 5 stars">
     <span class="star-rating" role="img" aria-label="3.7 stars">
         <i class="fullStar"></i>
         <i class="fullStar"></i>
         <i class="fullStar"></i>
         <i class="midStar"></i>
         <i class="emptyStar"></i>
      </span>
    </div>

Первая строка — это печатный текст, показывающий рейтинг в текстовой форме.
Заголовок div показывает эту информацию при наведении указателя мыши.
Элементы с атрибутами класса внутри диапазона можно легко сгенерировать программно, как в примере 2. CSS можно настроить на использование разных изображений для fullStar, midStar и emptyStar. Этот процесс генерации может быть повторен для каждого пользователя в разделе, где находятся индивидуальные рейтинги пользователей.

Недостаток примера 3 состоит в визуальном округлении до ближайшей полузвезды (а в примере 2 — до полной звезды), тогда как пример 1 позволяет более точно различать дробные звезды без необходимости дополнительного программирования или создания изображения. Решение о подходящем уровне округления — это вопрос для UX.SE (и если кому-то не терпится задать его, пожалуйста, отредактируйте по ссылке здесь).

person WBT    schedule 08.04.2016
comment
Я использую ‹span›☆‹/span› в своем коде, я не использую изображения, но даже в этом случае мне нужно следовать тому же пути. - person mad_ss; 08.04.2016
comment
@mad_ss Вы используете символ звезды вместо изображений и ожидаете получить половину цветной звезды? У вас есть наполовину окрашенный персонаж? Есть ли особая причина, по которой вы не хотите использовать изображения? С символами просто напишите цикл во всем, что вы используете для создания страницы, чтобы напечатать правильное количество заполненных и пустых звездочек на основе пользовательского рейтинга. - person WBT; 08.04.2016
comment
да, почему это невозможно сделать, потому что разные объявления на моем сайте имеют разные рейтинги, поэтому, если одно объявление имеет средний рейтинг 4,7, мне нужно раскрасить его в соответствии с этим значением, если другое объявление имеет средний рейтинг 3,2, оно должно быть окрашено в соответствии к этому значению (означает 3,2), а также подумайте, что для конкретного объявления один пользователь дал 3-звездочный рейтинг, другой дал только одну звезду, поэтому мне нужно показать эти индивидуальные рейтинги каждого пользователя также на моем сайте. когда я отображаю мне нужно раскрасить звезды в соответствии с рейтингом пользователей. - person mad_ss; 08.04.2016
comment
мне нужно сделать примерно так ebay.com/urw/product-reviews /1154802091?_itm=311530352979 - person mad_ss; 08.04.2016
comment
там вы можете увидеть 4,7 — это средний рейтинг, который он отобразил вверху. и каждый пользователь также разместил индивидуальные отзывы ниже. перед отзывами, которые они раскрасили, и отобразили количество звездочек, которые дал каждый пользователь - person mad_ss; 08.04.2016
comment
@mad_ss eBay использует изображения. Помогают ли новые примеры? - person WBT; 08.04.2016
comment
если я использую третий пример, мне нужно использовать первое получение изображений, полностью цветное изображение, полуцветное изображение и пустое изображение, я прав? А также здесь вы использовали такие классы, как class=fullStar, class=star-rating-section, class= star-rating, class=display-text-ratingпочему вы использовали эти вещи, можете немного объяснить - person mad_ss; 08.04.2016
comment
не могли бы вы рассмотреть и объяснить немного о третьем примере. мне нужно использовать изображения для этого - person mad_ss; 08.04.2016