uni-rate不能直接套用自定义图片,因其内部依赖字体图标或SVG渲染,不支持background-image或image标签;App端nvue下background-image失效,小程序禁用base64背景图,仅识别color/active-color颜色值。

为什么 uni-rate 不能直接套用自定义图片?
因为 uni-rate 内部使用字体图标或 SVG 渲染,不支持直接传入 background-image 或 <image></image> 标签;尤其在 App 端 nvue 下,background-image 完全失效,微信小程序又禁止 base64 图片作背景。你设了 active-color 和 color,但图片路径根本不会被解析——它只认颜色值。
怎么用 <image> + 定位实现多端一致的自定义星星图?
核心是放弃伪元素和背景图,改用绝对定位叠层:<view> 作为容器,内部放两层 <image>(空心星 + 实心星),通过 overflow: hidden + transform: translateX() 截断实心星宽度来模拟半星。
- 每颗星容器设固定宽高(如
width: 36rpx; height: 36rpx;),position: relative; - 空心星
<image>铺满,z-index: 1; - 实心星
<image>同样尺寸,position: absolute; top: 0; left: 0; z-index: 2; - 用
transform: translateX(-${(1 - ratio) * 100}%)控制实心星露出比例(ratio 是当前分值占单颗星的比例) - H5/小程序/App 三端都支持
<image>+transform,无兼容风险
滑动逻辑怎么绑定到自定义图片星星上?
不能依赖 uni-rate 的 @change,必须自己监听 touchstart/touchmove/touchend,并手动计算触点落在哪颗星的哪个位置。
-
touchstart记录起始clientX和当前分数(lastRating.value) -
touchmove中用e.touches[0].clientX - startX.value得偏移量,除以单星宽度(如36),加到上一次分数上 - 关键一步:用
Math.round(rating * 2) / 2四舍五入到最近的 0.5 倍数(半星步长) - 必须加边界限制:
Math.max(0, Math.min(props.max, ...)),否则手指滑出区域会导致负值或超限 - 微信小程序里别用
event.target.dataset.index定位——dataset 在 touchmove 中不可靠,纯坐标计算才稳
自定义图片路径在各端怎么写才不报错?
路径不是写对就行,得按平台规则来:
- H5:支持相对路径、绝对路径、base64(但慎用,体积大)
- 微信小程序:只认本地路径(
/static/star-empty.png)或网络 HTTPS 路径;base64会静默失败 - App(nvue):必须是本地路径,且需提前在
manifest.json中声明资源白名单;网络图默认不加载 - 鸿蒙:要求尺寸严格匹配(建议统一用 36×36px),路径必须是 https 或本地
ohos:/协议
最稳妥做法:所有图片放 /static/ 下,用相对路径引用,避免拼接字符串;多端构建时用条件编译做微调,而不是 runtime 判断。


















