原理如下:
( S/ k9 @- R3 y% ]. C0 C. ^! x1 p- 去找个好看的iconfont,[Iconfont-阿里巴巴矢量图标库;
- 借用5个radio单选框,把默认样式都去掉,显示默认的星星;
- 用checked伪类监听用户选中,由默认的星星变成高亮的星星;
- 然后配合~兄弟操作符把当前选中的所有兄弟元素都一起高亮;
- 把5个radio单选框反向排列;
|5 r4 i- Y9 S' s" u4 n1 i
! w9 z. w/ x- S. ^5 o1 m基本布局:* J$ P# q" i, N: o; Q
这是我事先生成好的iconfont:' W7 B- t. d6 m6 a5 C+ {
<link rel="stylesheet" href="//at.alicdn.com/t/font_1356455_c5d3d3ohlbq.css"> 一个很简洁的布局:- `3 c7 L' r7 o+ m# 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> 先把默认的星星显示出来:
' P1 C- g; ^7 N8 O! U/* 去掉默认样式 */
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;
} 效果如下:2 [ {" W( q3 D
/ d7 N$ V& s* x+ P
实现选中单个星星: s3 e& N+ R0 \
/* 实现选中单个星星 */
/* 高亮的星星 */
input[name="rate"]:checked::after {
content: "\e73c";
color: var(--main);
} 效果如下:" a! ~$ u0 O/ `; t+ a- b
& I/ I: `9 w5 j1 i/ g n3 n
实现连同兄弟元素一起高亮
, U6 Y. E$ S% o, P/* 实现选中单个星星 */
/* 高亮的星星 */
input[name="rate"]:checked::after,
input[name="rate"]:checked~input[name="rate"]::after {
/*实现连同兄弟元素一起高亮*/
content: "\e73c";
color: var(--main);
} 效果如下:3 c: n' K0 J4 z4 X
) n7 o! o1 s. Y! e( j把input反向排列7 D& C0 }) P0 i8 Q3 o- l
.rate-content {
display: flex;
flex-flow: row-reverse;
} 效果如下:
/ z" G/ u# D3 s& X* O: X
7 }! Y/ j$ N1 k4 Q9 q( m% e( {鼠标移入预览选中效果
/ r5 L( m1 E. @# T$ w2 h! einput[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);
} 效果如下:
/ N, e2 Y4 U5 ?; \2 K
0 z- E8 ^. U/ O) }! j加入放大动画
: ~0 s( M: G9 f: B% ^4 ainput[name="rate"] {
transition: transform .2s ease;
}
input[name="rate"]:checked,
input[name="rate"]:hover {
transform: scale(1.2);
} 效果如下:* y, M% U! ^- l; m( v9 l
, I3 |: Q' X! M" x Y, J# E
总结:
$ E1 w8 d! t1 n 核心代码其实就是这两段,其他都是可选的。
3 H+ D" {2 T5 y7 m3 N8 q% K) y 元素反向排列:9 ?% v, n4 N* s+ F
$ m5 ]# B+ j! G% Y. o1 K1 kdisplay: flex;
flex-flow: row-reverse; 兄弟元素操作:. F1 j8 a- E2 E, V5 F
input:checked ~ input 点击查看演示>> ?5 C z8 a' g- l7 W: V+ |
点击下载源码>> |