我试图仅使用CSS和HTML制作一个5圈评级系统(请参阅下面的图片,了解我喜欢它的样子),但我不确定如何实现此
我最初的想法是制作5个圆圈,然后以某种方式将它们用作背景颜色的蒙版,这是所有5个圆圈的完整宽度。因此,第一张图片的宽度为90%,背景色为#4a494a
,而第二张图片的宽度为60%,背景色为#4a494a
。
这些圆圈是固定的,因此不需要任何交互来绘制它们。
有没有人对如何做到这一点有任何想法?
答案 0 :(得分:6)
您可以使用位于.rating:after
顶部的伪元素(div.rating
)来完成此操作。 .rating
有一个linear-gradient
,其中background-size
决定了圈子的填充量,.rating:after
中有一个radial-gradient
生成五个圆圈,其行为类似于掩模)。
我使用动画来显示当background-size
增加时圆圈如何填充。您可以使用JS(或生成rating元素的任何后端代码)设置所需的background-size
,然后通过内联样式将其添加到div.rating
。
使用这种方法,即使在评级之间(或任何值的评级,如3.65,2.25,1.85等),只需计算所需的background-size
即可轻松处理。我在演示中添加了一些示例。
.rating {
position: relative;
height: 50px;
width: 250px;
background: linear-gradient(to right, black, black);
background-repeat: no-repeat;
background-position: 0px 0px;
background-size: 0px 100%;
}
.rating.auto-anim {
animation: fill-circle 5s ease infinite;
}
.rating:after {
position: absolute;
content: '';
height: 100%;
width: 100%;
background: radial-gradient(20px at center, transparent 7.5px, beige 9px);
background-position: 0px 0px;
background-size: 50px 100%;
border: 1px solid;
}
@keyframes fill-circle {
to {
background-size: 100% 100%;
}
}
<div class='rating auto-anim'></div>
<div class='rating' style="background-size: 50px 100%;"></div> <!-- rating of 1 -->
<div class='rating' style="background-size: 75px 100%;"></div> <!-- rating of 1.5 -->
<div class='rating' style="background-size: 121.25px 100%;"></div> <!-- rating of 2.25 -->
<div class='rating' style="background-size: 228.75px 100%;"></div> <!-- rating of 4.75 -->
<div class='rating' style="background-size: 177.25px 100%;"></div> <!-- rating of 3.65 -->
<div class='rating' style="background-size: 80.25px 100%;"></div> <!-- rating of 1.85 -->
<!--
Background Size Calculation Logic: Each circle is only 15px wide with 17.5px gap on either side
1 rating = 50px (for 1 circle)
1.5 rating = 50px (for 1 circle) + 17.5px (gap before 2nd circle on left) + 7.5px (.5 of 15px circle)
2.25 rating = 100px (for 2 circles) + 17.5px (gap before 3rd circle on left) + 3.75px (.25 of 15px circle)
4.75 rating = 200px (for 4 circles) + 17.5px (gap before 5th circle on left) + 11.25px (.75 of 20px circle)
3.65 rating = 150px (for 3 circles) + 17.5px (gap before 4th circle on left) + 9.75px (.65 of 20px circle)
1.85 rating = 50px (for 1 circle) + 17.5px (gap before 2nd circle on left) + 12.75px (.85 of 20px circle)
-->
答案 1 :(得分:3)
这可以通过非常小的CSS来完成,以便能够创建所需的效果。
.rating {
direction: rtl;
text-align: center;
}
.rating > span {
display: inline-block;
position: relative;
box-sizing: border-box;
width: 20px;
height: 20px;
border: 1px solid black;
border-radius: 10px;
}
.rating > span:hover,
.rating > span:hover ~ span {
background: transparent;
}
.rating > span:hover:before,
.rating > span:hover ~ span:before {
content: "";
position: absolute;
left: -2px;
top: -2px;
background: gold;
width: 20px;
height: 20px;
border: 1px solid gold;
border-radius: 20px;
}
<div class="rating">
<span></span><span></span><span></span><span></span><span></span>
</div>
这是由css-tricks.com开发的Star Ratings
的变体。 Click here to read more!
答案 2 :(得分:1)
如果您使用一些聪明的CSS和一些radio
输入,您可以使用纯css和html实现此目的,而甚至保持交互式。看看我设置的小提琴:https://jsfiddle.net/2rs79wsh/
#ratings {
font-size: 0;
}
#ratings * {
float: right;
}
#ratings input {
display: none;
}
#ratings label {
width: 20px;
height: 40px;
background-color: #ccc;
display: inline-block;
}
#ratings label:nth-of-type(even) {
border-top-left-radius: 20px;
border-bottom-left-radius: 20px;
margin-left: 10px;
}
#ratings label:nth-of-type(odd) {
border-top-right-radius: 20px;
border-bottom-right-radius: 20px;
margin-right: 10px;
}
#ratings input:checked ~ label {
background-color: red;
}
<div id="ratings">
<input type="radio" id="rating-10" name="rating" value="10">
<label for="rating-10"></label>
...
<input type="radio" id="rating-1" name="rating" value="1" checked=checked>
<label for="rating-1"></label>
</div>
您看到的圆圈是输入的标签。顺序颠倒(通过使用向右浮动),因此您可以使用~
选择器显示检查后的所有兄弟姐妹的状态。收音机可以存储状态,甚至允许您通过在表单内提交更改来发送任何更改。每个圆圈由两个标签组成,因此根据您点击的圆圈的哪一半,您将获得不同的分数。 odd
/ even
选择器将两半移动到一起,使其看起来像一个圆圈。
随意询问是否有任何不清楚的地方!
答案 3 :(得分:0)
答案 4 :(得分:0)
使用psuedo元素可以很容易地做到这一点: 的 HTML 强>
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li class="half"></li>
</ul>
<强> CSS 强>
ul {
display:block;
}
li {
display:inline-block;
list-style: none;
width:20px;
height:20px;
border-radius:50%;
background-color:orange;
overflow:hidden;
position:relative;
}
li::after {
position:absolute;
content: '';
background-color:rgba(0,0,0,.5);
display:block;
width:20px;
height:20px;
top:0;
left:0;
}
li.half::after {
left:-10px;
}
<强>小提琴强> https://jsfiddle.net/fz2qo82m/
您只需在最后一个圈子上调整课程(或者最后一对,如果评分低于4个圈子,您可以添加none
课程)