JSFiddle - React, Tailwind, and code Playground

HTML

<h1>Js仿淘宝星级评分</h1>
     <ul class="star" id="star">
         <p></p>
         <li id="L1">
             <label>宝贝与描述A</label>
             <span>1分</span>
             <span>2分</span>
             <span>3分</span>
             <span>4分</span>
             <span>5分</span>
             <strong></strong>
             <strong class="s"></strong>
         </li>
         <li id="L2">
             <label>宝贝与描述B</label>
             <span>1分</span>
             <span>2分</span>
             <span>3分</span>
             <span>4分</span>
             <span>5分</span>
             <strong></strong>
             <strong class="s"></strong>
         </li>
         <li id="L3">
             <label>宝贝与描述C</label>
             <span>1分</span>
             <span>2分</span>
             <span>3分</span>
             <span>4分</span>
             <span>5分</span>
             <strong></strong>
             <strong class="s"></strong>
         </li>           
     </ul>

CSS

*{margin:0;padding:0;}
 body{color:#666;font:12px/1.5 Arial;}
 h1{font-size: 18px;}
 ul.star {position:relative;list-style-type:none;}
 ul.star li{height: 24px;clear: both;}
 ul.star li label, ul.star li span, ul.star li strong{display: block;float:left;}
 ul.star li label{margin-right: 5px;}
 ul.star li strong{margin-left: 5px;}
 ul.star li span{width:24px;background:url(http://www.codefans.net/jscss/demoimg/201206/star.png) no-repeat;text-indent: -9999px;cursor: pointer;}
 ul.star li span.active{background-position:0 -28px;}
 ul.star li strong{color:#f60;font-size: 14px;}
 ul.star li strong.s{color:#666;font-size: 12px;font-weight: normal;}
 ul.star p{position:absolute;padding:2px 5px;display:none;background-color: #fff;border: 2px orange solid;z-index: 99;}
 ul.star p em{color:#f60;font-style:normal;font-weight: bold;}

JavaScript

star("L1", ["很不满意0|差得太离谱,与卖家描述的严重不符,非常不满", "不满意0|部分有破损,与卖家描述的不符,不满意", "一般0|质量一般,没有卖家描述的那么好", "满意0|质量不错,与卖家描述的基本一致,还是挺满意的", "非常满意0|质量非常好,与卖家描述的完全一致,非常满意"])
 star("L2", ["很不满意1|差得太离谱,与卖家描述的严重不符,非常不满", "不满意1|部分有破损,与卖家描述的不符,不满意", "一般1|质量一般,没有卖家描述的那么好", "满意1|质量不错,与卖家描述的基本一致,还是挺满意的", "非常满意1|质量非常好,与卖家描述的完全一致,非常满意"])
 star("L3", ["很不满意2|差得太离谱,与卖家描述的严重不符,非常不满", "不满意2|部分有破损,与卖家描述的不符,不满意", "一般2|质量一般,没有卖家描述的那么好", "满意2|质量不错,与卖家描述的基本一致,还是挺满意的", "非常满意2|质量非常好,与卖家描述的完全一致,非常满意"])
 
 function star(id, aMsg){    //aMsg为数组描述
     var star = document.getElementById("star"),
         li = document.getElementById(id),
         spans = li.getElementsByTagName("span"),
         p = star.getElementsByTagName("p")[0],
         strong1 = li.getElementsByTagName("strong")[0],
         strong2 = li.getElementsByTagName("strong")[1];
     var iStar;
 
     for(var i=0; i<spans.length; i++){
 
         //给每个span加一个index
         spans[i].index = i+1; 
 
         //鼠标移动上添加active
         spans[i].onmouseover = function(){
             onStar(this.index);
             p.innerHTML = "<em>" + aMsg[this.index - 1].match(/(.+)\|/)[1] + "</em><br />" + aMsg[this.index - 1].match(/\|(.+)/)[1];
             p.style.display = "block";
             p.style.top = (getPosition(this).top-5) + "px";
             p.style.left = getPosition(this).left + "px";
         };
 
         //鼠标移出删除acitve
         spans[i].onmouseout = function(){
             onStar();
             
             p.style.display = "";
         };
 
         //鼠标点击后进行评分处理
         spans[i].onclick = function(){
             iStar = this.index;
             strong1.innerHTML = this.innerHTML;
             strong2.innerHTML = "("+ aMsg[this.index - 1].match(/\|(.+)/)[1] +")";
         };
 
     };
 
 
     //当前访问到第几个index
     function onStar(spanIndex){
         var iScore = spanIndex || iStar;
         for(var i = 0; i < spans.length; i++){
             spans[i].className = (i<iScore ? "active" : "");        
         }
     };
 
 }
 
 
...