Oto rozwiązanie dla Ciebie, wykorzystujące tylko jeden bardzo mały i prosty obraz oraz jeden automatycznie generowany element 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;
}
Wizerunek
(źródło: ulmanen.fi )
Uwaga: nie NIE Hotlink na powyższy obrazek! Skopiuj plik na własny serwer i używaj go stamtąd.
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);
});
}
Jeśli chcesz ograniczyć gwiazdy tylko do połowy lub ćwiartki gwiazd, dodaj jeden z tych wierszy przed var size
rzędem:
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>
Stosowanie
$(function() {
$('span.stars').stars();
});
Wynik
(źródło: ulmanen.fi )
Próbny
http://www.ulmanen.fi/stuff/stars.php
Prawdopodobnie będzie to odpowiadało Twoim potrzebom. Dzięki tej metodzie nie musisz obliczać żadnych trzech czwartych lub jakichkolwiek innych szerokości gwiazd, po prostu nadaj jej wartość zmienną, a otrzymasz swoje gwiazdy.
Krótkie wyjaśnienie, w jaki sposób są przedstawiane gwiazdy, może być w porządku.
Skrypt tworzy dwa elementy zakresu na poziomie bloku. Oba rozpiętości mają początkowo rozmiar 80px * 16px i obraz tła stars.png. Przęsła są zagnieżdżone, dzięki czemu struktura przęseł wygląda następująco:
<span class="stars">
<span></span>
</span>
Zewnętrzne przęsło ma wartość background-position
of 0 -16px
. To sprawia, że widoczne są szare gwiazdy na przęśle zewnętrznym. Ponieważ zewnętrzne przęsło ma wysokość 16 pikseli i repeat-x
będzie pokazywać tylko 5 szarych gwiazd.
Z drugiej strony wewnętrzna rozpiętość ma, background-position
z 0 0
którego widoczne są tylko żółte gwiazdy.
To oczywiście działałoby z dwoma oddzielnymi plikami graficznymi, star_yellow.png i star_gray.png. Ale ponieważ gwiazdy mają stałą wysokość, możemy łatwo połączyć je w jeden obraz. Wykorzystuje to technikę sprite CSS .
Teraz, gdy przęsła są zagnieżdżone, są one automatycznie nakładane na siebie. W przypadku domyślnym, gdy szerokość obu rozpiętości wynosi 80 pikseli, żółte gwiazdy całkowicie zasłaniają szare gwiazdy.
Ale kiedy dostosujemy szerokość wewnętrznej rozpiętości, szerokość żółtych gwiazd zmniejsza się, odsłaniając szare gwiazdy.
Z text-indent: -9999px
punktu widzenia dostępności rozsądniej byłoby pozostawić liczbę zmiennoprzecinkową wewnątrz wewnętrznej rozpiętości i ukryć ją za pomocą , tak aby osoby z wyłączonym CSS widziały przynajmniej liczbę zmiennoprzecinkową zamiast gwiazd.
Mam nadzieję, że to miało jakiś sens.
Zaktualizowano 2010/10/22
Teraz jeszcze bardziej kompaktowy i trudniejszy do zrozumienia! Można go również ścisnąć do jednej wkładki:
$.fn.stars = function() {
return $(this).each(function() {
$(this).html($('<span />').width(Math.max(0, (Math.min(5, parseFloat($(this).html())))) * 16));
});
}