像rate评分组件一般都用javascript写,所以这次将是一个全新的尝试,用css实现一个rate评分 ❗ 核心代码也就三行?

01

效果图

02

原理

主要是借助radio单选框,梳理如下:

  • 去找个好看的iconfont;

  • 借用5个radio单选框,把默认样式都去掉,显示默认的星星;

  • 用checked伪类监听用户选中✅,由默认的星星变成高亮的星星;

  • 然后配合~兄弟操作符把当前选中的所有兄弟元素都一起高亮?;

  • 把5个radio单选框反向排列❗;

03

代码

这是我事先生成好的iconfont:


<link rel="stylesheet" href="//at.alicdn.com/t/font_1356455_c5d3d3ohlbq.css">

一个很简洁的布局:


<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>

先把默认的星星显示出来:


// 去掉默认样式
input {
-webkit-appearance: none;
border: none;
outline: none;
cursor: pointer;
}

.rate-content {
$main: #ffa822; // 高亮颜色
$basic: #999; // 默认颜色

// 单个星星
input[name="rate"] {
font-family: "iconfont"; // 之前引入的iconfont字体
font-size: 30px;
padding-right: 10px;

// 默认显示的星星
&::after {
content: "\e645";
color: $basic;
transition: color .4s ease; // 加点颜色过渡效果
}
}
}

效果如下:

实现选中单个星星:


input[name="rate"] {
// 高亮的星星
&:checked {
&::after {
content: "\e73c";
color: $main;
}
}
}

效果如下:

实现连同兄弟元素一起高亮:


input[name="rate"] {
// 高亮的星星
&:checked,
&:checked ~ input[name="rate"] {
...
}
}

效果如下:

然后把星星反向排列:


.rate-content {
display: flex;
flex-flow: row-reverse;
}

效果如下:

鼠标移入预览选中效果:

罗嗦版:


input[name="rate"] {
// 高亮的星星
&:checked,
&:checked ~ input[name="rate"],
&:hover,
&:hover ~ input[name="rate"] {
...
}
}

优化版:


input[name="rate"] {
// 高亮的星星
&:checked,
&:hover {
&::after {
content: "\e73c";
color: $main;
}

// 兄弟元素一起高亮
& ~ input[name="rate"] {
&::after {
content: "\e73c";
color: $main;
}
}
}
}

效果如下:

加入放大动画:


input[name="rate"] {
transition: transform .2s ease; // 加入过渡效果

// 高亮的星星
&:checked,
&:hover {
...
}

// 鼠标移入使星星放大
&:hover {
transform: scale(1.2);
}
}

效果如下:

04

总结

核心代码其实就是这两段,其他都是可选的?

元素反向排列:


display: flex;
flex-flow: row-reverse;

兄弟元素操作:


input:checked ~ input

如果不用flex反向排列,还可以用rotateZ:


.rate-content {
display: flex;
// flex-flow: row-reverse;
transform: rotateZ(180deg);
}

效果如下:

z轴旋转180deg之后发现星星的头跟尾巴反过来了,那么子元素也旋转180deg即可:


.rate-content {
input[name="rate"] {
transform: rotateZ(180deg);
}
}

效果如下:

05

需要注意的细节

这里用的是内边距:


input[name="rate"] {
// padding-right: 10px;
margin-right: 10px;
}

如果用外边距的话,那么会出现以下情形:

内边距的作用是保持元素连贯性以及扩大点击范围?


06

最后

本文到此结束,希望以上内容对你有些许帮助,如若喜欢请记得在右下角点个在看跟关注?

如果您觉得本文不错,

请点击文章底部广告,支持一下我啦!

原创系列推荐

1. JavaScript 重温系列(22篇全)

2. ECMAScript 重温系列(10篇全)

3. JavaScript设计模式 重温系列(9篇全)

4. 正则 / 框架 / 算法等 重温系列(16篇全)

5. Webpack4 入门手册(共 18 章)(上)

6. Webpack4 入门手册(共 18 章)(下)

7. 59篇原创系列汇总

点这,与大家一起分享本文吧~

【CSS】329- 非常强!3行核心css代码的rate评分组件的更多相关文章

  1. Bootstrap源码分析系列之核心CSS

    本节主要介绍核心CSS,从整体架构中的7个Less文件对应的源码分别进行分析 scaffolding.less 这个文件编译后的css文件(886~989行)其作用就像定义全局样式. //调整css盒 ...

  2. 如何提升我的HTML&CSS技术,编写有结构的代码

    前言 之前写了四篇HTML和CSS的知识点,也相当于是一个知识点汇总.有需要的可以收藏,平时开发过程中应该会遇到这些点,到时候再查看这些博客可能更容易理解.从这篇开始更多的介绍开发过程经常让人头痛的前 ...

  3. CSS,点击去除虚线边框代码

  4. css 10 款非常棒的CSS代码格式化工具推荐

    http://www.iteye.com/news/23692/  10 款非常棒的CSS代码格式化工具推荐 2011-12-14 09:31 by 副主编 wangguo 评论(0) 有9111人浏 ...

  5. css强制html不换行 css强制英文单词断行 重拾丢失的

    css强制html不换行 css强制英文单词断行 强制不换行 div{ white-space:nowrap; } 自动换行 div{ word-wrap: break-word; word-brea ...

  6. 在css加载完毕后执行后续代码

    最近在写项目的framework,写个JQueryMessageBox的类,以使用jquery ui中的dialog()来显示消息框,为了使方法方便调用,便加入了自动判断页面是否加入了ui.js和ui ...

  7. css伪类实现行号自动填充

    css伪类实现行号自动填充 大多数时候我们需要行号自动填充的时候我们可以 大多数时候是插入元素, 在元素里用js填入行号,或者用 ol > li 实现行号填充, 对于上面的方式,都不太灵活,而且 ...

  8. css文字单行/多行超出显示省略号...

    css文字单行/多行超出显示省略号... 项目里写css样式我们经常会遇到将文字超出显示省略号的情况,记录一下以后能用到. 单行超出 .oneline { width:300upx; /*宽度一定要设 ...

  9. 谈谈一些有趣的CSS题目(十一)-- reset.css 知多少?

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

随机推荐

  1. 如何在当前文件夹打开cmd(基于win10)

    如何在当前文件夹打开cmd(基于win10) 方法一: 1.先打开你要进入的文件夹 2.在标记的位置输入cmd,就可以进入当前文件的cmd 方法二: 1.打开你要进入的文件夹 2.通过shift + ...

  2. WeTest明星工具-移动端性能测试PerfDog初探

    在十一月初,腾讯就官宣了一则消息,腾讯WeTest明星工具-PerfDog面向全球发布.官宣介绍如下:https://wetest.qq.com/lab/view/475.html.我在看到该新闻时, ...

  3. 动手造轮子:实现简单的 EventQueue

    动手造轮子:实现简单的 EventQueue Intro 最近项目里有遇到一些并发的问题,想实现一个队列来将并发的请求一个一个串行处理,可以理解为使用消息队列处理并发问题,之前实现过一个简单的 Eve ...

  4. 达梦关键字(如:XML,EXCHANGE,DOMAIN,link等)配置忽略

    背景:在使用达梦数据库时,查询SQL中涉及XML,EXCHANGE,DOMAIN,link字段,在达梦中是关键字,SQL报关键词不能使用的错误. 解决办法: 配置达梦安装文件E:\MyJava\dmd ...

  5. kafka-manager新手安装入门指南

    Kafka-manager安装教程 使用环境 ubuntu18.04 Java 8 一.下载kafka 官网下载地址如下 https://www.apache.org/dyn/closer.cgi?p ...

  6. 新闻实时分析系统-HBase分布式集群部署与设计

    HBase是一个高可靠.高性能.面向列.可伸缩的分布式存储系统,利用Hbase技术可在廉价PC Server上搭建 大规模结构化存储集群. HBase 是Google Bigtable 的开源实现,与 ...

  7. 【Luogu P3375】字符串匹配KMP算法模板

    Luogu P3375 模式串:即题目中的S2所代表的意义 文本串:即题目中的S1所代表的意义 对于字符串匹配,有一种很显然的朴素算法:在S1中枚举起点一位一位匹配,失配之后起点往后移动一位,从头开始 ...

  8. 【NHOI2018】跳伞登山赛

    [题目描述] 某山区有高高低低的 n 个山峰,根据海拔高度的不同,这些山峰由低到高进行了 1 到 n 编号.有 m 条只能单向通行的羊肠小道连接这些山峰.现在,这里要举行一场跳伞登山赛,选手们伞降到某 ...

  9. FullGC排查心得

    最近线上系统(JDK1.7)出现了多次FullGC,但是情况都不一样,今天有时间,将FullGC的排查思路以及如何解决记录下,供大家一起探讨. 场景一: 系统发布上线之后,里面收到如下告警信息: 内容 ...

  10. java Random类详解

    java Random类位于java.util包下,主要用来生成随机数,本文详解介绍了Random类的用法,希望能帮到大家 Random类 (java.util) Random类中实现的随机算法是伪随 ...