基本功能
Codepen Demo
标记(使用data-* 属性)
<h1>
<div class="rating" style="width:200px;float:left;padding-left:1px">
<span data-rating="terrible">☆</span>
<span data-rating="unsatisfied">☆</span>
<span data-rating="satisfied">☆</span>
<span data-rating="happy">☆</span>
<span data-rating="delighted">☆</span>
</div>
</h1>
<p id="rateText"></p>
原版 JS
var rating = document.getElementsByClassName('rating')[0];
var result = document.getElementById('rateText');
rating.addEventListener('click', function(evt) {
var elm = evt.target;
if (elm.nodeName.toLowerCase() === 'span') {
result.textContent = elm.dataset.rating;
}
});
在包装元素上附加了一个事件侦听器,无需为每个span 元素附加一个处理程序
添加简单的鼠标悬停效果
Codepen Demo
为了创建纯 CSS 鼠标悬停效果,我颠倒了标记中星形元素的顺序,并使用 flexbox 直观地恢复了它们的顺序
<span id="span5" data-rating="delighted">☆</span>
<span id="span4" data-rating="happy">☆</span>
<span id="span3" data-rating="satisfied">☆</span>
<span id="span2" data-rating="unsatisfied">☆</span>
<span id="span1" data-rating="terrible">☆</span>
黑星(unicode U+2605)被放置为每个span元素的::before伪元素
CSS
.rating {
display: flex;
flex-flow: row-reverse;
justify-content: space-around; }
.rating span {
position: relative;
cursor: pointer; }
.rating span:hover::before,
.rating span:hover ~ span::before {
content: "\2605";
display: block;
position: absolute;
}
作为最后一点,我强烈建议使用 SVG 元素 <use xlink:href="...">...</use> 来表示星星,这样您就可以通过简单地更改它们的 fill 或 stroke 属性来设置它们的样式,如下例所示。
SVG 版本
Codepen Demo
评分的标记如前所述已更改(注意:data-rating 属性现在定义在 use 元素上,因此脚本也略有更改)
<span>
<svg><use xlink:href="#star" data-rating="delighted"></use></svg>
</span>
<span>
<svg><use xlink:href="#star" data-rating="happy"></use></svg>
</span>
<span>
<svg><use xlink:href="#star" data-rating="satisfied"></use></svg>
</span>
<span>
<svg><use xlink:href="#star" data-rating="unsatisfied"></use></svg>
</span>
<span>
<svg><use xlink:href="#star" data-rating="terrible"></use></svg>
</span>
在这个例子中,样式部分是通过覆盖 fill 和 stroke 属性来完成的
.rating use {
fill: #fff;
stroke: #363636;
stroke-width: 3px;
transition: fill .33s, stroke-width .33s }
.rating span:hover use,
.rating span:hover ~ span use{
stroke-width: 0;
fill: #37393b; }