Я нашел отличный CSS единственный способ делать эффекты при наведении . Сохранение выделенных звезд все еще потребует некоторого JavaScript, но намного меньше.
Общая идея заключается в том, что у вас есть фоновое изображение (звезда) для ul с установленной длиной (в вашем случае, в 5 раз больше ширины изображения, для 5 звезд) и повторное изображение по оси x (background: url(star.gif) repeat-x;
). Каждый <a>
имеет разную ширину (20%, 40%, 60%, 80%, 100% для 5 звезд) и помещается в другой z-индекс.
Вот обновление идеи автора, которая немного ближе к вашему варианту использования:
HTML:
<div class='rate_widget'>
<ul>
<li><a href='#' class='one-star'>1</a></li>
<li><a href='#' class='two-stars'>2</a></li>
<li><a href='#' class='three-stars'>3</a></li>
<li><a href='#' class='four-stars'>4</a></li>
<li><a href='#' class='five-stars'>5</a></li>
</ul>
</div>
CSS:
.rate_widget ul{
background: url(star_empty.png) repeat-x;
}
.rate_widget a:hover{
background: url(star_highlight.png) repeat-x;
}
.rate_widget a:active,
.rate_widget a:focus,
.rate_widget a.checked{
background: url(star_full.png) repeat-x;
}
.rate_widget ul{
position:relative;
width:125px; /*5 times the width of your star*/
height:25px; /*height of your star*/
overflow:hidden;
list-style:none;
margin:0;
padding:0;
background-position: left top;
}
.rate_widget li{
display: inline;
}
.rate_widget a{
position:absolute;
top:0;
left:0;
text-indent:-1000em;
height:25px; /*height of your star*/
line-height:25px; /*height of your star*/
outline:none;
overflow:hidden;
border: none;
}
.rate_widget a.one-star{
width:20%;
z-index:6;
}
.rate_widget a.two-stars{
width:40%;
z-index:5;
}
.rate_widget a.three-stars{
width:60%;
z-index:4;
}
.rate_widget a.four-stars{
width:80%;
z-index:3;
}
.rate_widget a.five-stars{
width:100%;
z-index:2;
}
.rate_widget a.checked{
z-index:1;
}
Javascript:
$('.rate_widget a').click(function(){
// make sure the chosen star stays selected
var star = $(this);
star.closest('ul').find('.checked').removeClass('checked');
star.addClass('checked');
//whatever else you want to do when something gets clicked
});
А вот скрипка, чтобы увидеть это в действии: http://www.jsfiddle.net/BHaTu/