原理如下:5 x/ |% ?& G7 a! ~6 O: ~/ P7 p1 y
- 去找个好看的iconfont,[Iconfont-阿里巴巴矢量图标库;
- 借用5个radio单选框,把默认样式都去掉,显示默认的星星;
- 用checked伪类监听用户选中,由默认的星星变成高亮的星星;
- 然后配合~兄弟操作符把当前选中的所有兄弟元素都一起高亮;
- 把5个radio单选框反向排列;0 n9 k% h2 [- P, u5 t
7 h; ~& C* i+ R C9 p3 E基本布局:
9 q4 o$ Q2 m+ C! p* s- `& P 这是我事先生成好的iconfont:* t+ H N: x; L( ~9 x4 U o) e
<link rel="stylesheet" href="//at.alicdn.com/t/font_1356455_c5d3d3ohlbq.css"> 一个很简洁的布局:3 o% L( M: W2 A/ j
<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> 先把默认的星星显示出来:
6 w+ ?! {7 |: Z- }. Q/* 去掉默认样式 */
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;
} 效果如下:
: p& L: v( U1 f* F9 Y( g1 k
2 q2 A- Z2 G. `: K5 a) H5 T
实现选中单个星星. @# \/ R$ l( J
/* 实现选中单个星星 */
/* 高亮的星星 */
input[name="rate"]:checked::after {
content: "\e73c";
color: var(--main);
} 效果如下:
- G) p& q7 p+ R, Q
5 e9 K3 ~- ^- ^7 r实现连同兄弟元素一起高亮
! {# Y+ z$ q+ R, n4 q+ W( w9 C% |/* 实现选中单个星星 */
/* 高亮的星星 */
input[name="rate"]:checked::after,
input[name="rate"]:checked~input[name="rate"]::after {
/*实现连同兄弟元素一起高亮*/
content: "\e73c";
color: var(--main);
} 效果如下:
) S! ^+ s$ [; u/ Y7 l0 ~+ y
$ a% G+ Q. S9 w2 X把input反向排列
6 r4 u$ ~! _3 r" g( A! a( l9 D5 L.rate-content {
display: flex;
flex-flow: row-reverse;
} 效果如下:
) O: ^) b1 y" k" x) ~4 I. q6 z
5 i; b7 a5 Y5 K, m
鼠标移入预览选中效果8 u& }1 f5 C6 i: j
input[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 }# i0 u: R F
8 a* |9 C0 F" F加入放大动画. M; U. p# C K6 A0 H) R- F$ G6 M0 B
input[name="rate"] {
transition: transform .2s ease;
}
input[name="rate"]:checked,
input[name="rate"]:hover {
transform: scale(1.2);
} 效果如下:6 Z" D7 Z; y. j- g& w' f0 L; B
0 e& Y8 v/ M' z8 Z! |# W
总结:1 b4 v5 E8 ?. f: ^: x. `, e% m
核心代码其实就是这两段,其他都是可选的。
7 ~( O# ^ P1 m. K7 w 元素反向排列:
9 T" H4 [$ i4 T) `2 b6 Q8 e- ]8 c% ?, ?& {) U( p
display: flex;
flex-flow: row-reverse; 兄弟元素操作: S+ }" P+ B: b: w9 X( `3 s
input:checked ~ input 点击查看演示>>
" e6 I6 F# q- f( M2 X1 x, m点击下载源码>> |