You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用SVG实现支持1位小数、多实例的动态百分比五星评分

SVG五星评分无JS多实例实现方案

我们可以抛弃全局mask的实现思路,利用SVG元素天然的overflow:hidden特性,仅在需要部分填充的星星内部嵌套一个控制显示宽度的子SVG元素,就能直接自定义任意填充比例,完全不需要JS,也不会出现多实例冲突问题。

方案优势

  • 无需提前定义任意数量的mask,没有全局ID冲突风险
  • 所有填充比例直接内联设置,和你期望的自定义属性用法逻辑完全一致
  • 多实例完全独立,修改一个评分的展示不会影响其他评分
  • 支持0-100%任意精度的填充,完美适配1位小数的评分需求

实现代码

公共基础代码(页面仅需引入一次)

<svg width="0" height="0" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
  <defs>
    <symbol id="star" viewBox="0 0 64 64">
      <path d="M32 2l-10 22l-20 2l15 14l-5 22l20-12l20 12l-5-22l15-14l-20-2Z"
        stroke-width="3" stroke="#FFC800" />
    </symbol>
  </defs>
</svg>

2.5分评分示例

<!-- 第1颗全亮星 -->
<svg width="32" height="32" viewBox="0 0 64 64">
  <use href="#star" fill="#FFC800"></use>
  <use href="#star" fill="none"></use>
</svg>
<!-- 第2颗全亮星 -->
<svg width="32" height="32" viewBox="0 0 64 64">
  <use href="#star" fill="#FFC800"></use>
  <use href="#star" fill="none"></use>
</svg>
<!-- 第3颗50%填充星:修改内部svg的width属性即可控制填充比例 -->
<svg width="32" height="32" viewBox="0 0 64 64">
  <svg width="50%" overflow="hidden">
    <use href="#star" fill="#FFC800"></use>
  </svg>
  <use href="#star" fill="none"></use>
</svg>
<!-- 第4颗未亮星 -->
<svg width="32" height="32" viewBox="0 0 64 64">
  <use href="#star" fill="none"></use>
</svg>
<!-- 第5颗未亮星 -->
<svg width="32" height="32" viewBox="0 0 64 64">
  <use href="#star" fill="none"></use>
</svg>

4.2分评分示例(和其他实例完全互不干扰)

<!-- 前4颗全亮星 -->
<svg width="32" height="32" viewBox="0 0 64 64">
  <use href="#star" fill="#FFC800"></use>
  <use href="#star" fill="none"></use>
</svg>
<svg width="32" height="32" viewBox="0 0 64 64">
  <use href="#star" fill="#FFC800"></use>
  <use href="#star" fill="none"></use>
</svg>
<svg width="32" height="32" viewBox="0 0 64 64">
  <use href="#star" fill="#FFC800"></use>
  <use href="#star" fill="none"></use>
</svg>
<svg width="32" height="32" viewBox="0 0 64 64">
  <use href="#star" fill="#FFC800"></use>
  <use href="#star" fill="none"></use>
</svg>
<!-- 第5颗20%填充星,对应0.2分 -->
<svg width="32" height="32" viewBox="0 0 64 64">
  <svg width="20%" overflow="hidden">
    <use href="#star" fill="#FFC800"></use>
  </svg>
  <use href="#star" fill="none"></use>
</svg>

可选:CSS变量控制写法

如果需要更灵活的样式控制,也可以用CSS变量传递填充比例:

<svg width="32" height="32" viewBox="0 0 64 64" style="--fill-percent: 70%">
  <svg width="var(--fill-percent)" overflow="hidden">
    <use href="#star" fill="#FFC800"></use>
  </svg>
  <use href="#star" fill="none"></use>
</svg>

内容的提问来源于stack exchange,提问作者freefaller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:45:06