原理如下:0 n5 Q6 g; V- K% P+ w
- 去找个好看的iconfont,[Iconfont-阿里巴巴矢量图标库;
- 借用5个radio单选框,把默认样式都去掉,显示默认的星星;
- 用checked伪类监听用户选中,由默认的星星变成高亮的星星;
- 然后配合~兄弟操作符把当前选中的所有兄弟元素都一起高亮;
- 把5个radio单选框反向排列;- o" j) L2 ?$ o+ N% E! c6 B
( U2 x; _5 H% K/ S% y! e! z基本布局:
( ^- }* b! q0 r/ j% I5 | 这是我事先生成好的iconfont:
- e, R, S- p4 U/ y1 e3 d$ z<link rel="stylesheet" href="//at.alicdn.com/t/font_1356455_c5d3d3ohlbq.css"> 一个很简洁的布局:
7 h0 {$ q: ]! R+ F8 h" u# f5 q" {<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> 先把默认的星星显示出来:& @! z7 d- L4 N. j z
/* 去掉默认样式 */
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;
} 效果如下:" t" A6 Y0 p, ^
5 \* b; ^8 m, N2 w" z) q! K实现选中单个星星: B+ W% |* E; V' {3 g+ B
/* 实现选中单个星星 */
/* 高亮的星星 */
input[name="rate"]:checked::after {
content: "\e73c";
color: var(--main);
} 效果如下:
2 d1 E6 }' f0 s% W# ~, c
1 g( k5 d" P( A/ J) M5 x
实现连同兄弟元素一起高亮# o7 Q; I9 j4 A8 x0 ^
/* 实现选中单个星星 */
/* 高亮的星星 */
input[name="rate"]:checked::after,
input[name="rate"]:checked~input[name="rate"]::after {
/*实现连同兄弟元素一起高亮*/
content: "\e73c";
color: var(--main);
} 效果如下:
9 C" W5 D! E$ T. \1 c
! B8 f8 ]/ a! d; O" l* w把input反向排列3 A! j) C1 l& t F- z
.rate-content {
display: flex;
flex-flow: row-reverse;
} 效果如下:
8 q7 t" ]2 b' D/ d( g
2 k( z y: o' L鼠标移入预览选中效果
' O* T" l- ^1 H6 g- \7 S$ |6 hinput[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);
} 效果如下:. t( H* a- [* ^
( T; }8 l! B+ @" [加入放大动画* u0 Y- ?3 l7 ^, o; I
input[name="rate"] {
transition: transform .2s ease;
}
input[name="rate"]:checked,
input[name="rate"]:hover {
transform: scale(1.2);
} 效果如下:5 G1 [# d$ O6 o) U# c# D
; { a+ i9 @! G+ z& x总结:* W4 R/ ^: x$ A& B7 D
核心代码其实就是这两段,其他都是可选的。
# M0 j8 P; x4 W 元素反向排列:( @( x0 P$ h; _0 \
# g9 ?9 e F0 O7 ~: H4 W% Wdisplay: flex;
flex-flow: row-reverse; 兄弟元素操作:! V: S1 q% _/ Z4 `! ]0 L5 \, O
input:checked ~ input 点击查看演示>> f# W6 S( ]2 K1 S, T
点击下载源码>> |