资讯专栏INFORMATION COLUMN

纯CSS实现网站常用的五角星评分和分数展示交互效果

wyk1184 / 3203人阅读

摘要:技术我们使用一些特殊的选择器,然后配合单选框以及复选框自带的一些特性,可以实现元素的显示隐藏效果。当接口返回的分数是分的时候,刚好占据一半的星星,星半,只要计算出百分比就行,只用管数据,用上数据驱动的特点来动态展示样式这个简直不要太容易。

最近做的一个项目涉及到评分和展示分数的模块,UI设计师也给了几个切好的图片,实现五角星评分方式很多,本质爱折腾的精神和对性能追求以及便于维护的考虑,搜集和尝试了很多方式,最终采用了纯css驱动的实现方式完成评分和展示分数的功能,没有js,也就意味着没判断逻辑,代码出错的几率更少,也更便于维护,在此,把这个功能的实现的过程记录和分享一下,一起学习交流。

原文收录在我的 GitHub博客 (https://github.com/jawil/blog) ,喜欢的可以关注最新动态,大家一起多交流学习,共同进步。

五角星的实现 1.图片或者字体图标

不极致追求性能的话,直接利用设计师给的png或者jpg啥的,或者直接转成base64.

2:利用Fontawesome 图标库,其实只是一种矢量字体。

HTML:

</>复制代码

CSS:

</>复制代码

  1. @import url(http://netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css);
  2. .icon:before {
  3. content: "f005";
  4. font-family: FontAwesome;
  5. }

在线预览地址

3.利用css3描绘拼凑一个五角星。

基本原理:利用transparent的透明不可见和transform转换拼接一个正五角星。

HTML:

</>复制代码

CSS:

</>复制代码

  1. .star-five{
  2. width: 0;
  3. height: 0;
  4. color: red;
  5. margin: 50px 0;
  6. position: relative;
  7. display: block;
  8. border-left: 100px solid transparent;
  9. border-right: 100px solid transparent;
  10. border-bottom: 70px solid red;
  11. transform:rotate(35deg);
  12. }
  13. .star-five:before{
  14. width: 0;
  15. height: 0;
  16. border-left: 30px solid transparent;
  17. border-right: 30px solid transparent;
  18. border-bottom: 80px solid red;
  19. position: absolute;
  20. top: -45px;
  21. left: -65px;
  22. color: white;
  23. display: block;
  24. content: "";
  25. transform:rotate(-35deg);
  26. }
  27. .star-five:after{
  28. width: 0;
  29. height: 0;
  30. display: block;
  31. position: absolute;
  32. color: red;
  33. top: 3px;
  34. left: -105px;
  35. border-left: 100px solid transparent;
  36. border-right: 100px solid transparent;
  37. border-bottom: 70px solid red;
  38. content: "";
  39. transform:rotate(-70deg);
  40. }

在线预览地址

不建议使用这种,因为选择之后改变颜色状态比较麻烦,改起来很不方便,不如前面几种方便好维护。

4.直接使用五角星符号

★?

简单粗暴,容易控制,品相协调,下面实现方式以★为准。




关于CSS的一些选择器

不用js来控制评分,当然不能错过强大的css选择器,这里就先介绍一下关于实现这个功能要用到的一些css选择器。

在介绍css强大的选择器之前,先普及一下“CSS radio/checkbox单复选框元素显隐技术”,又称“checkbox hack技术”。

1.checkbox hack技术

</>复制代码

  1. 我们使用CSS一些特殊的选择器,然后配合单选框以及复选框自带的一些特性,可以实现元素的显示隐藏效果。然后通过一
  2. 些简单的扩展,我们可以不使用任何JavaScript代码实现类似:自定义的单复选框,“更多”展开与收起效果,选项卡切换
  3. 效果,或是多级下拉列表效果等等。
  4. 相信很多前端开发人员都会遇到boss让修改checkbox和radio样式,毕竟自带的样式太丑了。后来我们发现修改自带样式
  5. 并不是那么容易,最后直接使出杀手锏——点击之后替换图片。
  6. 今天教大家一种方法,不用替换图片,随意修改样式。还是先看效果图:

`先讲一下原理:两个关键东东,一是伪类选择器:checked,表示对应控件元素(单选框或是复选框)选中时的样式;二就是加号+ 相邻兄弟选择器,这个符号表示选择后面的兄弟节点。于是,两者配合,就可以轻松自如控制后面元素的显示或者隐藏,或是其他样式了。
而如何让单复选框选中和不选中了,那就是label标签了哈,for属性锚定对应的单选框或是复选框,然后点击这里的label标签元素的时候,对应的单复选框就会选中或是取消选中。然后,就有上面的效果啦!`

这里只给一个radio单选框的代码,仅供参考:

HTML:

</>复制代码

  1. 前端工程师
  2. 后端工程师
  3. 全栈工程师

SCSS:

</>复制代码

  1. .radio-beauty-container {
  2. font-size: 0;
  3. $bgc: green;
  4. %common {
  5. padding: 2px;
  6. background-color: $bgc;
  7. background-clip: content-box;
  8. }
  9. .radio-name {
  10. vertical-align: middle;
  11. font-size: 16px;
  12. }
  13. .radio-beauty {
  14. width: 18px;
  15. height: 18px;
  16. box-sizing: border-box;
  17. display: inline-block;
  18. border: 1px solid $bgc;
  19. vertical-align: middle;
  20. margin: 0 15px 0 3px;
  21. border-radius: 50%;
  22. &:hover {
  23. box-shadow: 0 0 7px $bgc;
  24. @extend %common;
  25. }
  26. }
  27. input[type="radio"]:checked+.radio-beauty {
  28. @extend %common;
  29. }
  30. }

美化radio单选框在线预览地址:点击我呀
美化checkbox复选框在线预览地址:点击我呀

更多关于这方面的介绍和例子可以参看张鑫旭大神的这篇文章:CSS radio/checkbox单复选框元素显隐技术

2.CSS一些选择器

HTML:

</>复制代码

  1. 1

  2. 2

  3. 3

  4. 4

  5. 5

CSS:

</>复制代码

  1. p{
  2. width:20px;
  3. line-height:20px;
  4. border:1px solid gray;
  5. text-align:center;
  6. font-weight: 700;
  7. }
E + F: 相邻兄弟选择器 选择匹配F的元素,且该元素为所匹配E元素后面相邻的位置。

</>复制代码

  1. .test1+p{
  2. background-color:green;
  3. }

E > F:子包含选择器 选择匹配F的元素,且该元素为所匹配E元素的子元素。

</>复制代码

  1. .wrapper>p{
  2. background-color:green;
  3. }

E ~ F: 选择后面的兄弟节点们

</>复制代码

  1. .test2~p{
  2. background-color:green;
  3. }

E::after,E::before: 伪元素选择器 在匹配E的元素后面(前面)插入内容

</>复制代码

  1. .test2::before{
  2. background-color:green;
  3. content:"前"
  4. }
  5. .test2::after{
  6. background-color:green;
  7. content:"后"
  8. }

:not(E) 选择非 元素的每个元素。

</>复制代码

  1. .wrapper>:not(.test2){
  2. background-color:green;
  3. }

:checked input:checked 选择每个被选中的input元素。

HTML:

</>复制代码

  1. 3333

CSS:

</>复制代码

  1. input:checked+span{
  2. border:10px solid red;
  3. }





这里只提一下本文要用到的CSS选择器,更多关于CSS3强大的选择器请移步这里:全面整理 CSS3 选择器的用法




实现评分模块

HTML:

</>复制代码

关于input标签的隐藏,我这里只要用hidden属性实现隐藏,当然还有很多实现方式,只要input不占据文档的位置但是看不见就OK,我们需要隐藏单选框,且为可用性隐藏。这里还有几种方式仅供大家参考:

1. display: none;

</>复制代码

  1. .rating >input {
  2. display: none;
  3. }
2. css3的clip

</>复制代码

  1. .rating >input {
  2. position: absolute;
  3. clip: rect(0 0 0 0);
  4. }
3.opcity

</>复制代码

  1. .rating >input {
  2. position: absolute;
  3. opacity: 0;
  4. }

CSS:

</>复制代码

  1. .rating {
  2. font-size: 0;
  3. display: table;
  4. }
  5. .rating > label {
  6. color: #ffffd;
  7. float: right;
  8. }
  9. .rating > label:before {
  10. padding: 5px;
  11. font-size: 24px;
  12. line-height: 1em;
  13. display: inline-block;
  14. content: "★";
  15. }
  16. .rating > input:checked ~ label,
  17. .rating:not(:checked) > label:hover,
  18. .rating:not(:checked) > label:hover ~ label {
  19. color: #FFD700;
  20. }
  21. .rating > input:checked ~ label:hover,
  22. .rating > label:hover ~ input:checked ~ label,
  23. .rating > input:checked ~ label:hover ~ label {
  24. opacity: 0.5;
  25. }

在线预览地址






展示评分模块

用户评完分之后,会看到展示的分数,假设五个星星,满分10分。

展示评分就比较简单,放两个一模一样的html,五角星颜色不同,灰色的放在下面,评分的亮色放在上面,然后按照百分比显示分数。

HTML:

</>复制代码

CSS:

</>复制代码

  1. .star-rating {
  2. unicode-bidi: bidi-override;
  3. color: #ffffd;
  4. font-size: 0;
  5. height: 25px;
  6. margin: 0 auto;
  7. position: relative;
  8. display: table;
  9. padding: 0;
  10. text-shadow: 0px 1px 0 #a2a2a2;
  11. }
  12. .star-rating span {
  13. padding: 5px;
  14. font-size: 20px;
  15. }
  16. .star-rating span:after {
  17. content: "★";
  18. }
  19. .star-rating-top {
  20. color: #FFD700;
  21. padding: 0;
  22. position: absolute;
  23. z-index: 1;
  24. display: block;
  25. top: 0;
  26. left: 0;
  27. overflow: hidden;
  28. white-space: nowrap;
  29. }
  30. .star-rating-bottom {
  31. padding: 0;
  32. display: block;
  33. z-index: 0;
  34. }

当接口返回的分数是5分的时候,刚好占据一半的星星,2星半,只要计算出百分比就行,只用管数据,用上vue.js数据驱动的特点来动态展示样式这个简直不要太容易。

在线预览地址:

本文方法好处在于,纯CSS驱动,各种切换根本不需要JS,省了不少JS,对于类似这种需求大家也可以举一反三,这里只提供一些思路,没有细说;同时图片背景比较小或者可以直接不使用图片,比起使用图片节省不少资源,和提高些许性能。但是,学习以及理解成本稍高,可能并不适用于所有同行,因此,此文适合喜欢“折腾”的童鞋。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82311.html

相关文章

  • CSS实现网站常用角星评分分数展示交互效果

    摘要:技术我们使用一些特殊的选择器,然后配合单选框以及复选框自带的一些特性,可以实现元素的显示隐藏效果。当接口返回的分数是分的时候,刚好占据一半的星星,星半,只要计算出百分比就行,只用管数据,用上数据驱动的特点来动态展示样式这个简直不要太容易。 最近做的一个项目涉及到评分和展示分数的模块,UI设计师也给了几个切好的图片,实现五角星评分方式很多,本质爱折腾的精神和对性能追求以及便于维护的考虑,...

    Towers 评论0 收藏0
  • CSS实现网站常用角星评分分数展示交互效果

    摘要:技术我们使用一些特殊的选择器,然后配合单选框以及复选框自带的一些特性,可以实现元素的显示隐藏效果。当接口返回的分数是分的时候,刚好占据一半的星星,星半,只要计算出百分比就行,只用管数据,用上数据驱动的特点来动态展示样式这个简直不要太容易。 最近做的一个项目涉及到评分和展示分数的模块,UI设计师也给了几个切好的图片,实现五角星评分方式很多,本质爱折腾的精神和对性能追求以及便于维护的考虑,...

    Tony_Zby 评论0 收藏0
  • SegmentFault 技术周刊 Vol.38 - 神奇 CSS

    摘要:层叠即表示允许以多种方式来描述样式,一个元素可以被渲染呈现出多种样式。可以让属性的变化过程持续一段时间,而不是立即生效。比如,将元素的颜色从白色改为黑色,通常这个改变是立即生效的,使用后,将按一个曲线速率变化。 showImg(https://segmentfault.com/img/bVZwyL?w=900&h=385); CSS 的全称是 Cascading Style Sheet...

    elliott_hu 评论0 收藏0
  • 微信小程序之店铺评分组件及vue中用svg实现评分显示组件

    摘要:在微信小程序中,有遇到要展示店铺评分,或者是订单完成后对商品进行评价,用到了星星展示,查了下,在微信中无法使用实现图片,微信中只能将图片转成来显示,所以是在中使用的来实现评分效果图微信中的可以点击及显示,但是,显示的话,在分,点多分的时候, 在微信小程序中,有遇到要展示店铺评分,或者是订单完成后对商品进行评价,用到了星星展示,查了下,在微信中无法使用svg实现图片,微信中只能将svg图...

    BetaRabbit 评论0 收藏0

发表评论

0条评论

wyk1184

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<