使用HTML和CSS创建评分星级

3
我想创建一个评分星星,附带我的HTML脚本示例。 如果我的HTML脚本像这样:
<input type="radio" name="rating" id="rating-5"><label for="rating-5" class="fas fa-star"></label>, 则这个CSS脚本可以运行,
但我想按照以下方式运行
<label for="rating-5" class="fas fa-star"> <input type="radio" name="rating" id="rating-5"> </label>
就像下面的示例脚本一样,但CSS无法工作。

{
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  font-family: arial;
}

.star-rating input {
  display: none;
}

.star-rating {
  margin: 50px auto;
  display: table;
  width: 350px;
}

.star-rating label {
  padding: 10px;
  float: right;
  font-size: 44px;
  color: #eee;
}

.star-rating input:not(:checked)~label:hover,
.star-rating input:not(:checked)~label:hover~label {
  color: #ffc107;
}

.star-rating input:checked {
  color: #ffc107;
}
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.10.2/css/all.css" />

<div class="star-rating">
  <div class="star-input">
    <label for="rating-5" class="fas fa-star">
        <input type="radio" name="rating" id="rating-5"></label>
    <label for="rating-4" class="fas fa-star">  
        <input type="radio" name="rating" id="rating-4"></label>
    <label for="rating-3" class="fas fa-star">    
        <input type="radio" name="rating" id="rating-3"></label>
    <label for="rating-2" class="fas fa-star">       
        <input type="radio" name="rating" id="rating-2"></label>
    <label for="rating-1" class="fas fa-star">     
        <input type="radio" name="rating" id="rating-1"></label>
  </div>
</div>

请帮助我解决问题,谢谢。抱歉我的英语不太好。


请重新表述你的第一句话,并使用逗号和/或句号。 - pso
我已经编辑完了,也许你能理解。 - yagami cell
这个回答解决了你的问题吗?SCSS:如果子输入框被选中或未选中,则更改元素样式 - Cornel Raiu
1
据我所知,如果没有 JS,你无法做到那样。没有方法可以根据子组件状态来设置项的样式。 - Cornel Raiu
你没有使用 JavaScript,这项工作是错误的。 - yagami cell
2个回答

4
这可能是一种无需使用JS的解决方案。

 .rating {
  display: inline-block;
  position: relative;
  height: 50px;
  line-height: 50px;
  font-size: 25px;
}

.rating label {
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  cursor: pointer;
}

.rating label:last-child {
  position: static;
}

.rating label:nth-child(1) {
  z-index: 5;
}

.rating label:nth-child(2) {
  z-index: 4;
}

.rating label:nth-child(3) {
  z-index: 3;
}

.rating label:nth-child(4) {
  z-index: 2;
}

.rating label:nth-child(5) {
  z-index: 1;
}

.rating label input {
  position: absolute;
  top: 0;
  left: 0;
  opacity: 0;
}

.rating label .icon {
  float: left;
  color: transparent;
}

.rating label:last-child .icon {
  color: #000;
}

.rating:not(:hover) label input:checked ~ .icon,
.rating:hover label:hover input ~ .icon {
  color: #ffa904;
}

.rating label input:focus:not(:checked) ~ .icon:last-child {
  color: #000;
  text-shadow: 0 0 5px #ffa904;
}
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.10.2/css/all.css" />
<form class="rating">
  <label>
    <input type="radio" name="stars" value="1" />
    <span class="fa fa-star icon"></span>
  </label>
  <label>
    <input type="radio" name="stars" value="2" />
    <span class="fa fa-star icon"></span>
    <span class="fa fa-star icon"></span>
  </label>
  <label>
    <input type="radio" name="stars" value="3" />
    <span class="fa fa-star icon"></span>
    <span class="fa fa-star icon"></span>
    <span class="fa fa-star icon"></span>   
  </label>
  <label>
    <input type="radio" name="stars" value="4" />
    <span class="fa fa-star icon"></span>
    <span class="fa fa-star icon"></span>
    <span class="fa fa-star icon"></span>
    <span class="fa fa-star icon"></span>
  </label>
  <label>
    <input type="radio" name="stars" value="5" />
    <span class="fa fa-star icon"></span>
    <span class="fa fa-star icon"></span>
    <span class="fa fa-star icon"></span>
    <span class="fa fa-star icon"></span>
    <span class="fa fa-star icon"></span>
  </label>
</form>


你为什么会支持一个无法正常工作的解决方案呢?在我们进行选择时,我认为悬停效果不应该存在(对于已选中的内容)。 - Todor Markov
1
@TodorMarkov,你能告诉我我的解决方案的确切问题吗?因为我已经指出了你答案中的问题,所以你可以修复它。至于悬停效果,我已经按照我的项目构建了它,你可以根据需要进行修改。 - Mohammed Noor Alam

0
如果我们从标签中取出输入会怎样呢?

已编辑!

HTML:

<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.10.2/css/all.css" />

<div class="star-rating">
  <div class="star-input">
      <input type="radio" name="rating" id="rating-5">
    <label for="rating-5" class="fas fa-star">
    </label>
        <input type="radio" name="rating" id="rating-4">
    <label for="rating-4" class="fas fa-star">  
     </label>
    <input type="radio" name="rating" id="rating-3">
    <label for="rating-3" class="fas fa-star">    
    </label>
          <input type="radio" name="rating" id="rating-2">
     
    <label for="rating-2" class="fas fa-star">       
       </label>
              <input type="radio" name="rating" id="rating-1">
    <label for="rating-1" class="fas fa-star">     
     </label>
   
  </div>
</div>

CSS:

{
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  font-family: arial;
}

.star-rating input {
  display: none;
}

.star-rating {
  margin: 50px auto;
  display: table;
  width: 350px;
}

.star-rating label {
  padding: 10px;
  float: right;
  font-size: 44px;
  color: #eee;
}

.star-rating input:not(:checked)~label:hover,
.star-rating input:not(:checked)~label:hover~label {
  color: #ffc107;
}
.star-rating input[type="radio"]:checked ~label  
  {
  color: red!important;
}

jsfiddle

现在似乎选择器可以正常工作了。没有在使用nth-child等特殊情况时出现问题。


1
悬停效果是有效的,但选定效果无法实现。 - Mohammed Noor Alam
1
现在正在工作,请检查它。 - Todor Markov
是的,现在工作正常。干得好。 - Mohammed Noor Alam
第一次它不起作用...也许应该为第一个编写一些CSS :/// - Todor Markov
不需要更改 CSS,只需在输入框后放置标签。 - Mohammed Noor Alam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接