原理如下:8 }1 g& T. N4 C# P' ` O, l4 A
- 去找个好看的iconfont,[Iconfont-阿里巴巴矢量图标库;
- 借用5个radio单选框,把默认样式都去掉,显示默认的星星;
- 用checked伪类监听用户选中,由默认的星星变成高亮的星星;
- 然后配合~兄弟操作符把当前选中的所有兄弟元素都一起高亮;
- 把5个radio单选框反向排列;( x; H; b h! v' X0 @6 m
9 s! H- R* b; G( \. f* j+ v
基本布局:+ x$ O/ r& V% m+ o ^. v4 D8 G& `
这是我事先生成好的iconfont:4 P' p4 w: M& H' b- R
<link rel="stylesheet" href="//at.alicdn.com/t/font_1356455_c5d3d3ohlbq.css"> 一个很简洁的布局:' c- G% H0 v4 e# ^( Z, t- g
<div class="rate-content">
<input type="radio" name="rate">
<input type="radio" name="rate">
<input type="radio" name="rate">
<input type="radio" name="rate">
<input type="radio" name="rate">
</div> 先把默认的星星显示出来:
M& c! E; p. u C/* 去掉默认样式 */
input {
-webkit-appearance: none;
border: none;
outline: none;
cursor: pointer;
}
:root {
/*高亮颜色*/
--main: #ffa822;
/*默认颜色*/
--basic: #999;
}
.rate-contentinput[name="rate"] {
font-family: "iconfont";
/*之前引入的iconfont字体*/
font-size: 30px;
padding-right: 10px;
}
.rate-contentinput[name="rate"]::after {
content: "\e645";
color: var(--basic);
/*加点颜色过渡效果*/
transition: color .4s ease;
} 效果如下:9 a1 E% X+ j5 a
' ?% o" K- t7 R$ v
实现选中单个星星" R, z. [; d& h$ H- j4 Y+ v* B
/* 实现选中单个星星 */
/* 高亮的星星 */
input[name="rate"]:checked::after {
content: "\e73c";
color: var(--main);
} 效果如下:
2 I+ I! w( R. R ]2 A. r
L- X% b; |( J* D3 L) {
实现连同兄弟元素一起高亮
6 M, F$ q8 r8 o( ~0 @/* 实现选中单个星星 */
/* 高亮的星星 */
input[name="rate"]:checked::after,
input[name="rate"]:checked~input[name="rate"]::after {
/*实现连同兄弟元素一起高亮*/
content: "\e73c";
color: var(--main);
} 效果如下:9 T4 D. v3 j& t0 e5 L
: v! k) s8 ~5 t. h把input反向排列
; \" f' E, U3 {.rate-content {
display: flex;
flex-flow: row-reverse;
} 效果如下:& l/ `0 u g5 w
7 E9 U O5 k# p3 Z" j$ M3 C+ B, \
鼠标移入预览选中效果
/ W" @6 W6 Q; Q g! w( p! ainput[name="rate"]:checked,
input[name="rate"]:hover::after {
content: "\e73c";
color: var(--main);
}
/* 兄弟元素一起高亮 */
input[name="rate"]:hover~input[name="rate"]::after {
content: "\e73c";
color: var(--main);
} 效果如下:( H* H h5 m% n9 ~
8 B! i8 F% t3 m: Z0 |) K9 {
加入放大动画
3 A! z' T7 F- \, k! Iinput[name="rate"] {
transition: transform .2s ease;
}
input[name="rate"]:checked,
input[name="rate"]:hover {
transform: scale(1.2);
} 效果如下:; x" j# i8 t2 P5 T, d
# g& E. a) @0 i1 X% o2 W
总结:# T: \; I1 g1 p( d$ ^
核心代码其实就是这两段,其他都是可选的。* A4 u& f/ ]- N% [- w; m& [
元素反向排列:
, u" Z6 c. c# L/ U2 K8 k Z2 R) \1 ~% M$ P1 n+ k0 L3 h
display: flex;
flex-flow: row-reverse; 兄弟元素操作:
. y4 k. J8 |& |% minput:checked ~ input 点击查看演示>>
7 W f |& E5 n: F$ j& |点击下载源码>> |