-
Notifications
You must be signed in to change notification settings - Fork 837
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
纯CSS实现网站常用的五角星评分和分数展示交互效果 #8
Comments
一个页面同时有多个评分的话,好像只有一个能生效 |
两个的话name是一样的话,说明这个只是一组,要把name改变一下,ID也改一下就ok @phpcxy |
抱歉~多个评分也是可以的。之前是我多个评分的input id 和label for 都是相同的。 |
跨平台会有问题,不同字体渲染出的大小不一样 |
恩,确实存在这个问题,最好样式统一一下字体,因为不同字体好像行高有所区别,我也忘了,采用第二种矢量字体图标更好一点。@zuibunan |
这个只实现了 点击星星的效果,如何实现点击星星 显示不同分数? |
关于评星,这个方式存在一个 BUG,就是宫选择的 label 是顺序的,而input 是倒序,意思就说 当选择五星的时候 实际提交的是1星。 我的解决是 页面上循环倒序,不知道这样可好? |
|
# for free
to join this conversation on GitHub.
Already have an account?
# to comment
最近做的一个项目涉及到评分和展示分数的模块,UI设计师也给了几个切好的图片,实现五角星评分方式很多,本质爱折腾的精神和对性能追求以及便于维护的考虑,搜集和尝试了很多方式,最终采用了纯css驱动的实现方式完成评分和展示分数的功能,没有js,也就意味着没判断逻辑,代码出错的几率更少,也更便于维护,在此,把这个功能的实现的过程记录和分享一下,一起学习交流。
原文收录在我的 GitHub博客 (https://github.com/jawil/blog) ,喜欢的可以关注最新动态,大家一起多交流学习,共同进步。
五角星的实现
1.图片或者字体图标
不极致追求性能的话,直接利用设计师给的png或者jpg啥的,或者直接转成base64.
2:利用Fontawesome 图标库,其实只是一种矢量字体。
HTML:
CSS:
在线预览地址
3.利用css3描绘拼凑一个五角星。
基本原理:利用transparent的透明不可见和transform转换拼接一个正五角星。
HTML:
CSS:
在线预览地址
不建议使用这种,因为选择之后改变颜色状态比较麻烦,改起来很不方便,不如前面几种方便好维护。
4.直接使用五角星符号
★😄
简单粗暴,容易控制,品相协调,下面实现方式以★为准。
关于CSS的一些选择器
不用js来控制评分,当然不能错过强大的css选择器,这里就先介绍一下关于实现这个功能要用到的一些css选择器。
在介绍css强大的选择器之前,先普及一下“CSS radio/checkbox单复选框元素显隐技术”,又称“checkbox hack技术”。
1.checkbox hack技术
先讲一下原理:两个关键东东,一是伪类选择器:checked,表示对应控件元素(单选框或是复选框)选中时的样式;二就是加号+ 相邻兄弟选择器,这个符号表示选择后面的兄弟节点。于是,两者配合,就可以轻松自如控制后面元素的显示或者隐藏,或是其他样式了。 而如何让单复选框选中和不选中了,那就是label标签了哈,for属性锚定对应的单选框或是复选框,然后点击这里的label标签元素的时候,对应的单复选框就会选中或是取消选中。然后,就有上面的效果啦!
这里只给一个radio单选框的代码,仅供参考:
HTML:
SCSS:
美化radio单选框在线预览地址:点击我呀
美化checkbox复选框在线预览地址:点击我呀
更多关于这方面的介绍和例子可以参看张鑫旭大神的这篇文章:CSS radio/checkbox单复选框元素显隐技术
2.CSS一些选择器
HTML:
CSS:
E + F: 相邻兄弟选择器 选择匹配F的元素,且该元素为所匹配E元素后面相邻的位置。
E > F:子包含选择器 选择匹配F的元素,且该元素为所匹配E元素的子元素。
E ~ F: 选择后面的兄弟节点们
E::after,E::before: 伪元素选择器 在匹配E的元素后面(前面)插入内容
:not(E) 选择非 元素的每个元素。
:checked input:checked 选择每个被选中的input元素。
HTML:
CSS:
这里只提一下本文要用到的CSS选择器,更多关于CSS3强大的选择器请移步这里:全面整理 CSS3 选择器的用法
实现评分模块
HTML:
关于input标签的隐藏,我这里只要用hidden属性实现隐藏,当然还有很多实现方式,只要input不占据文档的位置但是看不见就OK,我们需要隐藏单选框,且为可用性隐藏。这里还有几种方式仅供大家参考:
1. display: none;
2. css3的clip
3.opcity
CSS:
在线预览地址
展示评分模块
用户评完分之后,会看到展示的分数,假设五个星星,满分10分。
展示评分就比较简单,放两个一模一样的html,五角星颜色不同,灰色的放在下面,评分的亮色放在上面,然后按照百分比显示分数。
HTML:
CSS:
当接口返回的分数是5分的时候,刚好占据一半的星星,2星半,只要计算出百分比就行,只用管数据,用上vue.js数据驱动的特点来动态展示样式这个简直不要太容易。
在线预览地址:
本文方法好处在于,纯CSS驱动,各种切换根本不需要JS,省了不少JS,对于类似这种需求大家也可以举一反三,这里只提供一些思路,没有细说;同时图片背景比较小或者可以直接不使用图片,比起使用图片节省不少资源,和提高些许性能。但是,学习以及理解成本稍高,可能并不适用于所有同行,因此,此文适合喜欢“折腾”的童鞋。
The text was updated successfully, but these errors were encountered: