原理如下:. B/ l0 Z8 \7 ]8 c" L" i
- 去找个好看的iconfont,[Iconfont-阿里巴巴矢量图标库;
- 借用5个radio单选框,把默认样式都去掉,显示默认的星星;
- 用checked伪类监听用户选中,由默认的星星变成高亮的星星;
- 然后配合~兄弟操作符把当前选中的所有兄弟元素都一起高亮;
- 把5个radio单选框反向排列;
0 P/ o7 ]$ B2 y" o ; m1 P& S8 O. u8 f- g% h8 \$ B
基本布局:
# w4 F3 u) V5 i) d u 这是我事先生成好的iconfont:
; H" \$ o, o- z& f. u8 e- Q* J<link rel="stylesheet" href="//at.alicdn.com/t/font_1356455_c5d3d3ohlbq.css"> 一个很简洁的布局:! `# f8 X, V2 P" Q1 C* A! s) c
<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> 先把默认的星星显示出来: a3 N4 u0 v' q) \' 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;
} 效果如下:3 o' }7 F% \# ?8 Q J# o S g
% k8 [4 b1 y1 n6 T" U$ W: U( f
实现选中单个星星9 \, ], w# a5 ]1 c* Q
/* 实现选中单个星星 */
/* 高亮的星星 */
input[name="rate"]:checked::after {
content: "\e73c";
color: var(--main);
} 效果如下:
, Z, m+ [9 a' f) Y* y
1 w6 ?2 w- W; y; v/ I2 N实现连同兄弟元素一起高亮
0 C' F# f- `/ Y/* 实现选中单个星星 */
/* 高亮的星星 */
input[name="rate"]:checked::after,
input[name="rate"]:checked~input[name="rate"]::after {
/*实现连同兄弟元素一起高亮*/
content: "\e73c";
color: var(--main);
} 效果如下:/ n+ h/ f/ S+ V2 F: P
+ P3 c0 e/ e* J% j把input反向排列" X N- J/ Q* O. {6 j- z0 D/ F
.rate-content {
display: flex;
flex-flow: row-reverse;
} 效果如下:
' t: w. [1 v1 g& F
, o6 L; z* H5 o5 G' t/ l* o0 {2 o鼠标移入预览选中效果
4 A4 S S" N6 finput[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);
} 效果如下:
0 a3 V. g2 S4 a2 ? |4 J
0 ]- V' {& c6 ?* O
加入放大动画
' W( k$ d" W. vinput[name="rate"] {
transition: transform .2s ease;
}
input[name="rate"]:checked,
input[name="rate"]:hover {
transform: scale(1.2);
} 效果如下:) g4 Q) h+ {& g, s& n0 U: A0 H
1 y4 q* c( Q' G; M% k: C4 \; W总结:& ?* `- `% r- n z6 w L" D J% g
核心代码其实就是这两段,其他都是可选的。
7 S5 q" F: N% k' S, l 元素反向排列:% V, J& o7 l; q( o& L0 i3 I
- B+ W3 h5 N! U* ~2 I" J7 g U* j
display: flex;
flex-flow: row-reverse; 兄弟元素操作:
$ D3 U" k; c! y$ i4 ^+ p1 y) oinput:checked ~ input 点击查看演示>>
?+ L( U+ i3 S& r5 G# U7 B/ K点击下载源码>> |