原理如下:2 I- d: @/ m4 W* K9 O. x# O
- 去找个好看的iconfont,[Iconfont-阿里巴巴矢量图标库;
- 借用5个radio单选框,把默认样式都去掉,显示默认的星星;
- 用checked伪类监听用户选中,由默认的星星变成高亮的星星;
- 然后配合~兄弟操作符把当前选中的所有兄弟元素都一起高亮;
- 把5个radio单选框反向排列;+ h# p. T: }, X
1 ]+ b' W& n% W7 F# Q% [+ t基本布局:8 Y8 g$ G0 k) h8 p0 h. v1 a
这是我事先生成好的iconfont:* X i' T( w: g9 Q: N6 Z% o( x
<link rel="stylesheet" href="//at.alicdn.com/t/font_1356455_c5d3d3ohlbq.css"> 一个很简洁的布局:
& j# o4 v& Y# l5 x/ w0 u2 y<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> 先把默认的星星显示出来:
0 f W; I9 x( T) @3 S) @7 `9 m' H/* 去掉默认样式 */
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;
} 效果如下:# n- H* B0 n+ f9 M4 [( w
5 @; [" P# t% ]3 _, v( L6 o, }% c
实现选中单个星星
) M6 Z/ ~0 L' ^; Z$ Y: z( [5 R# Y/ H# `/* 实现选中单个星星 */
/* 高亮的星星 */
input[name="rate"]:checked::after {
content: "\e73c";
color: var(--main);
} 效果如下:- w/ k2 C; Z. w9 F3 {4 A" M
# [$ R) Z" C* U; K a$ a1 B$ e/ P
实现连同兄弟元素一起高亮
* j( P# M1 B# n% |% @& Y# E6 H/* 实现选中单个星星 */
/* 高亮的星星 */
input[name="rate"]:checked::after,
input[name="rate"]:checked~input[name="rate"]::after {
/*实现连同兄弟元素一起高亮*/
content: "\e73c";
color: var(--main);
} 效果如下:. ~! v$ N- X, O) p3 z( a5 `; t
" i8 N& D( |0 ?9 p" X
把input反向排列8 G3 w6 v% [' d) R8 j; i. }
.rate-content {
display: flex;
flex-flow: row-reverse;
} 效果如下:
& X7 w1 `- a- r. l- e# n7 v7 u3 ^3 K
) w6 K; ^% K) d" J1 v! ?, T鼠标移入预览选中效果8 M: r8 U5 E" s' J u
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);
} 效果如下:
. [8 l6 X$ \6 ]5 m1 Q. o' \
' v; C/ @% U2 [, \
加入放大动画7 @: X* Z$ l& L$ t! g, k* O
input[name="rate"] {
transition: transform .2s ease;
}
input[name="rate"]:checked,
input[name="rate"]:hover {
transform: scale(1.2);
} 效果如下:
3 g5 ^6 J1 o( ^- @6 `
3 u, s" H* e9 {3 T6 g总结:6 O% G7 |# Z/ M
核心代码其实就是这两段,其他都是可选的。8 l H+ A" I1 z/ m+ d; ?
元素反向排列:6 g% _( O: j* ~- Y. ^! b' s
; {' @: G3 Z" C5 `, E
display: flex;
flex-flow: row-reverse; 兄弟元素操作:
' Z, i- T) g4 L; ^2 Tinput:checked ~ input 点击查看演示>>
% q6 _6 l. g$ d" g点击下载源码>> |