尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

vue-star-rating 颜色解析揭秘:AlphaColor 类如何优雅处理 rgba、hsla 与透明色

vue-star-rating 颜色解析揭秘:AlphaColor 类如何优雅处理 rgba、hsla 与透明色 vue-star-rating 颜色解析揭秘AlphaColor 类如何优雅处理 rgba、hsla 与透明色【免费下载链接】vue-star-rating:star: A simple, highly customisable star rating component for Vue 2.x. / 3.x项目地址: https://gitcode.com/gh_mirrors/vu/vue-star-ratingvue-star-rating 是一款简单且高度可定制的 Vue 2.x / 3.x 星级评分组件开发者可以通过active-color、inactive-color等属性自由定制星星颜色。很多人不知道的是当你传入 rgba、hsla、带透明度的十六进制颜色甚至transparent时组件并不会把字符串直接丢给浏览器而是先由内部的AlphaColor 类完成一次巧妙的颜色解析把颜色值与透明度拆分成两个独立属性。这篇源码解析将带你揭开这套机制的实现细节。为什么组件需要一套颜色解析机制星星的填充色是用 SVG 的linearGradient渐变实现的。查看 star.vue 的模板可以发现渐变由两个stop节点构成分别控制已评分与未评分部分的颜色。关键难点在于SVG 的stop只接受stop-color与stop-opacity两个独立属性并不认识rgba()、hsla()这类颜色 透明度合写的字符串。因此组件必须先把颜色和透明度拆开才能分别赋给这两个属性——这正是 AlphaColor 类存在的意义。AlphaColor 类的整体设计一次解析两路输出AlphaColor 是位于 src/classes/AlphaColor.js 的一个小巧工具类核心只有几十行代码设计思路非常清晰构造函数接收原始颜色字符串唯一公开的方法parseAlphaColor()负责识别格式 拆分颜色与透明度最终统一返回{ color, opacity }结构让颜色和透明度各归其位。new AlphaColor(rgba(255, 0, 0, 0.5)).parseAlphaColor() // { color: rgb(255, 0, 0), opacity: .5 }四种分支的解析效果可以先用一张表直观感受输入颜色解析后颜色解析后透明度rgba(100, 100, 100, 0.67)rgb(100, 100, 100).67hsla(100, 50%, 50%, 0.67)hsl(100, 50%, 50%).67#0009#0000.60#00000080#0000000.50transparent#fff0四种颜色格式的识别与拆分方法parseAlphaColor()内部通过正则表达式依次匹配四种自带透明度的格式命中的分支调用对应解析方法如果全部未命中则原样返回颜色并默认透明度为1。分支一rgba() 颜色的拆分方法当颜色形如rgba(100, 100, 100, 0.67)时进入parseRgba()处理方式相当巧妙用正则匹配最后一个逗号及之后的内容并删除同时去掉字母a得到rgb(100, 100, 100)再用一条匹配规则从字符串中提取透明度片段得到.67。即使写成rgba(50%, 50%, 50%, .67)这种带百分号、省略前导零的形态同样能正确解析兼容性做得很到位。分支二hsla() 颜色同样适用hsla(100, 50%, 50%, 0.67)的处理逻辑与 rgba 几乎一致只是匹配正则针对 HSL 语法做了调整。解析后得到颜色hsl(100, 50%, 50%)与透明度.67。分支三#RGBA 与 #RRGGBBAA 十六进制透明度换算除了函数式写法AlphaColor 还支持带透明度的十六进制色例如 5 位的#0009或 9 位的#00000080。解析时会把末尾的透明度字节转为十六进制整数再除以 255 换算成 0~1 之间的不透明度#0009→ 颜色#000透明度0.60#00000080→ 颜色#000000透明度0.50。分支四transparent 的伪颜色处理当传入关键字transparent时parseTransparent()直接返回白色#fff和透明度0。由于透明度已经为 0实际渲染成什么颜色已无关紧要这种以退为进的处理方式非常务实。组件中的实际调用getColor 与 getOpacity 如何协作在 star.vue 中组件封装了getColor()与getOpacity()两个方法分别调用 AlphaColor 取出颜色与透明度再喂给模板中的stop-color与stop-opacity属性。于是你只需要在父组件里写上一行star-rating :active-colorrgba(255, 215, 0, 0.7)/star-rating就能得到一颗半透明的金色星星完全无需关心颜色与透明度的拆分细节。测试用例如何保障颜色解析的正确性格式分支这么多靠什么保证不出错答案藏在 star.spec.js 的测试用例里。它覆盖了 rgb/rgba、hsl/hsla、长短十六进制、百分号写法、省略前导零等各种边界情况例如rgba(100, 100, 100, 0)→ 透明度0rgba(100,100,100,.67)→ 无空格写法也能正常解析#0009→ 透明度精确换算为0.60。正是这些用例让颜色解析在各种输入下都能保持稳定输出。小结AlphaColor 类用不到百行代码就为 vue-star-rating 解决了 SVG 渐变不支持 rgba、hsla 的难题同时兼顾了十六进制透明度与transparent关键字并用测试保障了健壮性。下次你再给星星配置半透明颜色时不妨想想这背后优雅的颜色解析设计。 如果你想亲自阅读这套源码可以通过git clone https://gitcode.com/gh_mirrors/vu/vue-star-rating获取仓库重点关注src/classes/AlphaColor.js即可。【免费下载链接】vue-star-rating:star: A simple, highly customisable star rating component for Vue 2.x. / 3.x项目地址: https://gitcode.com/gh_mirrors/vu/vue-star-rating创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表