Вот решение для вас, использующее только одно очень маленькое и простое изображение и один автоматически сгенерированный элемент span:
CSS
span.stars, span.stars span {
display: block;
background: url(stars.png) 0 -16px repeat-x;
width: 80px;
height: 16px;
}
span.stars span {
background-position: 0 0;
}
Образ
(источник: ulmanen.fi )
Примечание: делать НЕ хотлинк к изображению! Скопируйте файл на свой сервер и используйте его оттуда.
jQuery
$.fn.stars = function() {
return $(this).each(function() {
// Get the value
var val = parseFloat($(this).html());
// Make sure that the value is in 0 - 5 range, multiply to get width
var size = Math.max(0, (Math.min(5, val))) * 16;
// Create stars holder
var $span = $('<span />').width(size);
// Replace the numerical value with stars
$(this).html($span);
});
}
Если вы хотите ограничить звезды размером только половину или четверть звезды, добавьте одну из этих строк перед var size
строкой:
val = Math.round(val * 4) / 4; /* To round to nearest quarter */
val = Math.round(val * 2) / 2; /* To round to nearest half */
HTML
<span class="stars">4.8618164</span>
<span class="stars">2.6545344</span>
<span class="stars">0.5355</span>
<span class="stars">8</span>
использование
$(function() {
$('span.stars').stars();
});
Вывод
(источник: ulmanen.fi )
Демо
http://www.ulmanen.fi/stuff/stars.php
Вероятно, это подойдет вам. С помощью этого метода вам не нужно рассчитывать ширину звезды в три четверти или еще много чего, просто дайте ему поплавок, и он даст вам ваши звезды.
Небольшое объяснение того, как представлены звезды, было бы уместно.
Сценарий создает два элемента span на уровне блока. Оба интервала изначально получают размер 80 пикселей * 16 пикселей и фоновое изображение stars.png. Пролеты вложены друг в друга, поэтому структура пролетов выглядит так:
<span class="stars">
<span></span>
</span>
Внешний пролет получает background-position
оф 0 -16px
. Это делает видимыми серые звезды во внешнем пролете. Поскольку внешний диапазон имеет высоту 16 пикселей и repeat-x
будет отображаться только 5 серых звезд.
Внутренняя оболочка с другой стороны , есть background-position
из 0 0
которых делает только желтые звезды видны.
Это, конечно, будет работать с двумя отдельными файлами изображений, star_yellow.png и star_gray.png. Но поскольку звезды имеют фиксированную высоту, мы можем легко объединить их в одно изображение. Это использует технику спрайтов CSS .
Теперь, когда пролеты вложены, они автоматически накладываются друг на друга. В случае по умолчанию, когда ширина обоих промежутков составляет 80 пикселей, желтые звезды полностью закрывают серые звезды.
Но когда мы регулируем ширину внутреннего пролета, ширина желтых звезд уменьшается, открывая серые звезды.
С точки зрения доступности было бы разумнее оставить число с плавающей запятой внутри внутреннего диапазона и скрыть его text-indent: -9999px
, чтобы люди с выключенным CSS видели хотя бы число с плавающей запятой вместо звездочек.
Надеюсь, это имело смысл.
Обновлено 22.10.2010
Теперь еще компактнее и труднее для понимания! Также можно сжать до одного вкладыша:
$.fn.stars = function() {
return $(this).each(function() {
$(this).html($('<span />').width(Math.max(0, (Math.min(5, parseFloat($(this).html())))) * 16));
});
}