CSS打分组件的另一种实现方式
时间:2023-04-02 15:15:07
HTML
打分组件想必大家也遇到过。纯CSS方式的实现网上有很多,通常是通过input[type="radio"],例如,大致原理如下通过flex-direction:row-reverse或者其他方式(direction:rtl,transform:scaleX(-1)),元素位置翻转结合:checked和~选择可视化前端兄弟节点,非常精妙,不需要js访问。兼容性也不错,但是这里还是有两个缺陷,视觉展示和页面结构不一致,比如给每个input添加value属性,需要倒序添加,不符合一般人的认知
当组件获得焦点时,通过键盘的左右键切换也是相反的。具体表现是按“右”方向键会减少分数,反之则减少。优化上面提到的两个缺陷其实是元素位置翻转造成的,目的也是为了达到视觉上的前瞻性。设置兄弟节点选择器,有什么办法可以避免这个问题吗?答案是复位,处理如下。默认选中样式:勾选和~选中以下元素,样式设置为未选中样式。具体实现如下,html为普通结构
下面是keystyle[type="收音机"]{-webkit外观:无;宽度:20px;高度:20px;-webkit-mask:url("data:image/svg+xml,%3Csvgwidth='12'height='11'viewBox='001211'fill='none'xmlns='http://www.w3.org/2000/svg'%3E%3Cpathd='M60l1.6933.674.013.476L8.746.89l.7883.964L68.88l-3.5271.974.788-3.964L.2944.146l4.013-.476L60z'fill='%23F67600'/%3E%3C/svg%3E");-webkit-mask-size:20px;-webkit-mask-repeat:不重复;-webkit-掩码位置:中心;背景色:珊瑚色;/*默认是选中的样式,橙色*/margin:0;过渡:.2s;}[type="radio"]:checked~[type="radio"]{背景颜色:#E8EAED;/*uncheckedstyle,gray*/}这里的星图是通过mask实现的,也可以根据实际需要使用传统的背景图可以看出优化方案的代码更加精简,html符合常规认知,键盘切换也正常。当然,这个实现还是有点瑕疵的。由于默认选中,即使没有:checked,也会全部高亮(满分),不会出现0分的情况,所以建议最后一项设置为checked属性默认情况下当然,实际场景是没有0分的选项的。很多场景都是默认满分,所以这个小问题无伤大雅~半星的实现就是基于上面的。半星也很容易,只需要用到10个Input,每个只占一半的空间,10个input,每个input的宽度都是前一个的一半,显示区域用nth-child(奇数)设置,nth-child(偶),具体实现如下
下面是keystyle.rate-half[type="radio"]{width:10像素;/*将宽度设置为一半*/}.rate-half[type="radio"]:nth-child(odd){-webkit-mask-position:left;/*设置星星的显示区域*/}.rate-half[type="radio"]:nth-child(even){-webkit-mask-position:right;}以上源码可以在codepen上查看,以获得更好的实现。上面的实现很完美,不需要js,兼容性也不错,但是还是有一些需要改进的地方。比如修改html就比较麻烦。从5分到10分,需要改变每个输入的值属性。修改星数比较麻烦。从5星到10星,需要手动添加新的输入节点js获取当前值比较麻烦,需要使用document.quertSelector([type="radio"][name="rate"]:checked).value,语义不是很深,新手可能不太熟悉那么,有没有其他的方法可以达到类似的效果呢?这样想,评分组件本质上就是一个表单输入组件。不管是哪种风格,普通输入法也能实现同样的输入功能,只是需要手动键盘输入。有没有不需要手动输入,只需要简单拖拽就可以完成的表单输入?答案是输入范围范围选择器