使用纯css实现星星效果(3)
时间:2023-03-31 12:00:33
CSS
题外话查看原文以获得更好的排版效果从后面开始,文章中的代码演示将替换为Codepen。这样做的好处是方便大家对自己写的demo进行统一管理,方便在文章中展示。前面你在文章中直接嵌入了html代码和css样式,会造成css样式名称的冲突。之前的解决办法是不断重命名star、star01、star02等,方便转载到其他平台。由于markdown语法中的html嵌入不是标准语法,将嵌入大量html的markdown复制到其他平台,如segmentfault,会出现乱码。方法,然后继续扩展更多的功能,看起来更接近平时的效果,我们还是会坚持用css来实现如何实现鼠标滑动时的文字提示?我们这里所说的文字变化并不是指标题效果。我们在淘宝上会看到,当我们在不同的明星上滑动鼠标的时候,右边会有文字,分别提示类似满意,很满意,一般,这样的提示效果,现在我们就来实现这个效果。先看效果https://codepen.io/xboxyan/pe...结构html结构还是引用上一篇的:
一个小idea如果你想实现有一行提示文字在star的结尾,按照general的思路可能是在最后一个star的正后方加一个labelspan,然后通过监听mouseo修改span的客栈ver和mouseout事件通过jserHTML,只要能点击js,应该是可以的,那么如何通过css来实现呢?很明显,innerhtml是不能直接修改的,那怎么修改呢?我们可以直接使用:after伪元素生成内容,比如span:after{content:'我是生成的内容'},那么我们可以使用伪元素的content生成内容用css修改结构
现在让我们添加一点css来生成content.star-item[title="garbage"]:hover~.star-tip:after{contnet:"garbage"}这样当鼠标滑过第一颗星时,后面会产生一点垃圾提示完整的写法是.star-item[title="garbage"]:hover~.star-tip:after{contnet:"garbage"}.star-item[title="verypoor"]:hover~.star-tip:after{contnet:"Verybad"}.star-item[title="Normal"]:hover~.star-tip:after{contnet:"Normal"}.star-item[title="Verygood"]:hover~.star-tip:after{contnet:"verygood"}.star-item[title="perfect"]:hover~.star-tip:after{contnet:"perfect"}这应该允许鼠标移动到它会提示相应的文字,但是你不觉得这种写法有点不智能吗?它只是复制和粘贴。如果你有Less或Sass,你可以简单地写一个循环来自动生成这些,但本质还是一样的。写这么多重复代码是没办法合并的。css就没有办法了吗?其实还是有一些的。我们需要用到content的attr函数,就是获取对应属性的值,表示有点变量,比如
这样span会根据自己的a属性生成内容。现在我们把之前添加的去掉,就不可能再用了就是生成了,我们现在需要根据标签自己生成内容,添加下面的css。star{position:relative;/*添加相对定位,因为生成的内容是相对于最外层的*/}.star-item:after{/*dotstyle*/position:absolute;宽度:100px;字体大小:14px;高度:20px;行高:20px;右:0;右边距:-105px;color:#666}.star-item:hover:after{content:attr(title)}这还不够,我们还需要根据:checkedinput[type="radio"]:checked+.star-item:after{/*选择下一个与input相邻的标签*/content:attr(title)}来记住当前选项有问题这里,label输入的顺序是颠倒的,这里我们颠倒过来,所以需要固定前面的代码 这样也可以达到同样的效果,选中效果也有显示,但是选中和滑动会有重叠效果,选中需要滑动的时候去掉选中效果,也是清空再添加的思路。}input[type="radio"]:checked+.star-item:after{content:attr(title)}.star:hover.star-item:hover:after{content:attr(title)!important}注意Hierarchical覆盖关系,你可以多试试完整代码在下面专用