原理如下:
0 H4 C4 @& l' L1 D G7 ^2 Q) L- 去找个好看的iconfont,[Iconfont-阿里巴巴矢量图标库;
- 借用5个radio单选框,把默认样式都去掉,显示默认的星星;
- 用checked伪类监听用户选中,由默认的星星变成高亮的星星;
- 然后配合~兄弟操作符把当前选中的所有兄弟元素都一起高亮;
- 把5个radio单选框反向排列;
9 ?/ k8 r" ^- T! B. ]$ L + M8 r8 z! F8 v
基本布局:4 n1 n9 ^7 Y! u
这是我事先生成好的iconfont:/ B2 @& I# n2 P0 E
- <link rel="stylesheet" href="//at.alicdn.com/t/font_1356455_c5d3d3ohlbq.css">
一个很简洁的布局:7 e% n7 ~) A- T
- <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>
先把默认的星星显示出来:
# o" ^, J8 f; X' A. F5 J9 s/ 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;
- }
效果如下:
# Z4 p( u3 Y4 f5 |
3 _# p6 f( A& s4 D. V3 j实现选中单个星星
) k8 ?$ o- a; Y5 c$ l6 h- /* 实现选中单个星星 */
- /* 高亮的星星 */
- input[name="rate"]:checked::after {
- content: "\e73c";
- color: var(--main);
- }
效果如下:+ J$ H. O5 t+ A" N$ G3 |% b" ]
2 ^9 ?$ a0 [8 o, Z% ^- i
实现连同兄弟元素一起高亮
7 s0 ^$ X' y! a, I+ p- /* 实现选中单个星星 */
- /* 高亮的星星 */
- input[name="rate"]:checked::after,
- input[name="rate"]:checked~input[name="rate"]::after {
- /*实现连同兄弟元素一起高亮*/
- content: "\e73c";
- color: var(--main);
- }
效果如下:: X; j1 ]- O1 R! C6 C
( Z% F' Z; e8 ~* Y5 q) q9 Y把input反向排列 H7 }- n: T4 n$ B9 g
- .rate-content {
- display: flex;
- flex-flow: row-reverse;
- }
效果如下:4 |3 ?& o v! I2 B4 M' L+ k
4 y3 W; P. [4 Y9 k
鼠标移入预览选中效果
/ A @: ?, \+ _$ S$ _- 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);
- }
效果如下:
! t- T4 f2 {6 t' ]. f+ {# {
! d% a2 }# d3 ` n9 u' F1 X
加入放大动画% f4 h p4 k; e% ^" m: y" K
- input[name="rate"] {
- transition: transform .2s ease;
- }
- input[name="rate"]:checked,
- input[name="rate"]:hover {
- transform: scale(1.2);
- }
效果如下:
7 I/ G2 |) h# E# I2 k! f
4 g% O1 O8 p. d; E2 j, W% ^总结:
9 M2 f5 x( p( X4 e- x 核心代码其实就是这两段,其他都是可选的。# o" V2 i V v/ i
元素反向排列:
# N( ?' U/ c: P$ V8 u; T, F" X: A6 f5 v# ?- K8 I3 O
- display: flex;
- flex-flow: row-reverse;
兄弟元素操作:
8 M( n% J0 n1 i Z3 X, p
点击查看演示>>! {- p/ `0 u |. s6 a
点击下载源码>> |