【问题标题】:Pass variable from CSS or HTML to inline SVG将变量从 CSS 或 HTML 传递到内联 SVG
【发布时间】:2018-10-18 21:41:45
【问题描述】:

我正在尝试仅使用单个 svg 制作非常轻量级的 SVG 星级组件。

我有一个带有 5 颗星的形状,我正在用水平渐变填充它们。

在这里,运行代码sn-p:

<svg width="68" height="11" viewBox="0 0 68 11">
  <linearGradient id="grad">
        <stop offset="70%" stop-color="tomato"/>
        <stop offset="70%" stop-color="grey"/>
   </linearGradient>
  <g fill="url(#grad)">
    <path d="M6 8.84L9.708 11l-.984-4.07L12 4.192l-4.314-.354L6 0 4.314 3.838 0 4.192 3.276 6.93 2.292 11zM20 8.84L23.708 11l-.984-4.07L26 4.192l-4.314-.354L20 0l-1.686 3.838L14 4.192l3.276 2.738-.984 4.07zM34 8.84L37.708 11l-.984-4.07L40 4.192l-4.314-.354L34 0l-1.686 3.838L28 4.192l3.276 2.738-.984 4.07zM48 8.84L51.708 11l-.984-4.07L54 4.192l-4.314-.354L48 0l-1.686 3.838L42 4.192l3.276 2.738-.984 4.07zM62 8.84L65.708 11l-.984-4.07L68 4.192l-4.314-.354L62 0l-1.686 3.838L56 4.192l3.276 2.738-.984 4.07z"/>
  </g>
</svg>

评分可以是小数(不仅是“满”星和“半星”),甚至可以是 3.35

问题是 - 我不知道如何动态定义offset="70%"

  • 有没有办法将百分比传递给 SVG? (例如我可以使用 currentColor 从 CSS 传递颜色)
  • 是否有某种方法可以应用线性渐变而无需通过url(#id) 引用它?我想避免为每个评分生成唯一 ID,每页可能有数百个。
  • 或者也许有某种方法可以仅通过 CSS 填充 X% 的水平空间?

【问题讨论】:

    标签: html css svg


    【解决方案1】:

    您可以使用 SVG 作为背景,并且可以轻松控制大小:

    .rating {
      background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="68" height="11" viewBox="0 0 68 11"><path fill="grey" d="M6 8.84L9.708 11l-.984-4.07L12 4.192l-4.314-.354L6 0 4.314 3.838 0 4.192 3.276 6.93 2.292 11zM20 8.84L23.708 11l-.984-4.07L26 4.192l-4.314-.354L20 0l-1.686 3.838L14 4.192l3.276 2.738-.984 4.07zM34 8.84L37.708 11l-.984-4.07L40 4.192l-4.314-.354L34 0l-1.686 3.838L28 4.192l3.276 2.738-.984 4.07zM48 8.84L51.708 11l-.984-4.07L54 4.192l-4.314-.354L48 0l-1.686 3.838L42 4.192l3.276 2.738-.984 4.07zM62 8.84L65.708 11l-.984-4.07L68 4.192l-4.314-.354L62 0l-1.686 3.838L56 4.192l3.276 2.738-.984 4.07z"/></svg>');
      width: 68px;
      height: 11px;
    }
    
    .rating:before {
      content: "";
      display: block;
      background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="68" height="11" viewBox="0 0 68 11"><path fill="tomato" d="M6 8.84L9.708 11l-.984-4.07L12 4.192l-4.314-.354L6 0 4.314 3.838 0 4.192 3.276 6.93 2.292 11zM20 8.84L23.708 11l-.984-4.07L26 4.192l-4.314-.354L20 0l-1.686 3.838L14 4.192l3.276 2.738-.984 4.07zM34 8.84L37.708 11l-.984-4.07L40 4.192l-4.314-.354L34 0l-1.686 3.838L28 4.192l3.276 2.738-.984 4.07zM48 8.84L51.708 11l-.984-4.07L54 4.192l-4.314-.354L48 0l-1.686 3.838L42 4.192l3.276 2.738-.984 4.07zM62 8.84L65.708 11l-.984-4.07L68 4.192l-4.314-.354L62 0l-1.686 3.838L56 4.192l3.276 2.738-.984 4.07z"/></svg>');
      height: 100%;
      width: var(--p, 50%);
    }
    <div class="rating"></div>
    <div class="rating" style="--p:20%"></div>
    <div class="rating" style="--p:80%"></div>
    <div class="rating" style="--p:100%"></div>

    为了获得更好的支持,您可以将 CSS 变量替换为经典 CSS:

    .rating {
      background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="68" height="11" viewBox="0 0 68 11"><path fill="grey" d="M6 8.84L9.708 11l-.984-4.07L12 4.192l-4.314-.354L6 0 4.314 3.838 0 4.192 3.276 6.93 2.292 11zM20 8.84L23.708 11l-.984-4.07L26 4.192l-4.314-.354L20 0l-1.686 3.838L14 4.192l3.276 2.738-.984 4.07zM34 8.84L37.708 11l-.984-4.07L40 4.192l-4.314-.354L34 0l-1.686 3.838L28 4.192l3.276 2.738-.984 4.07zM48 8.84L51.708 11l-.984-4.07L54 4.192l-4.314-.354L48 0l-1.686 3.838L42 4.192l3.276 2.738-.984 4.07zM62 8.84L65.708 11l-.984-4.07L68 4.192l-4.314-.354L62 0l-1.686 3.838L56 4.192l3.276 2.738-.984 4.07z"/></svg>');
      width: 68px;
      height: 11px;
    }
    
    .rating > div {
      background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="68" height="11" viewBox="0 0 68 11"><path fill="tomato" d="M6 8.84L9.708 11l-.984-4.07L12 4.192l-4.314-.354L6 0 4.314 3.838 0 4.192 3.276 6.93 2.292 11zM20 8.84L23.708 11l-.984-4.07L26 4.192l-4.314-.354L20 0l-1.686 3.838L14 4.192l3.276 2.738-.984 4.07zM34 8.84L37.708 11l-.984-4.07L40 4.192l-4.314-.354L34 0l-1.686 3.838L28 4.192l3.276 2.738-.984 4.07zM48 8.84L51.708 11l-.984-4.07L54 4.192l-4.314-.354L48 0l-1.686 3.838L42 4.192l3.276 2.738-.984 4.07zM62 8.84L65.708 11l-.984-4.07L68 4.192l-4.314-.354L62 0l-1.686 3.838L56 4.192l3.276 2.738-.984 4.07z"/></svg>');
      height: 100%;
      width:50%;
    }
    <div class="rating"></div>
    <div class="rating" ><div style="width:20%"></div></div>
    <div class="rating" ><div style="width:80%"></div></div>
    <div class="rating" ><div style="width:100%"></div></div>

    【讨论】:

      【解决方案2】:

      您可以使用svg clipping

      .rating {
        position: relative;
        height: 11px;
        width: 68px;
        background: grey;
        clip-path: url(#myClip);
      }
      
      .fill {
        position: absolute;
        top: 0;
        left: 0;
        height: 100%;
        background: tomato;
      }
      <svg width="68" height="11" viewBox="0 0 68 11">
        <defs>
          <clipPath id="myClip">
            <path d="M6 8.84L9.708 11l-.984-4.07L12 4.192l-4.314-.354L6 0 4.314 3.838 0 4.192 3.276 6.93 2.292 11zM20 8.84L23.708 11l-.984-4.07L26 4.192l-4.314-.354L20 0l-1.686 3.838L14 4.192l3.276 2.738-.984 4.07zM34 8.84L37.708 11l-.984-4.07L40 4.192l-4.314-.354L34 0l-1.686 3.838L28 4.192l3.276 2.738-.984 4.07zM48 8.84L51.708 11l-.984-4.07L54 4.192l-4.314-.354L48 0l-1.686 3.838L42 4.192l3.276 2.738-.984 4.07zM62 8.84L65.708 11l-.984-4.07L68 4.192l-4.314-.354L62 0l-1.686 3.838L56 4.192l3.276 2.738-.984 4.07z"/>
          </clipPath>
        </defs>
      </svg>
      
      <div class="rating">
        <div class="fill" style="width: 55%;"></div>
      </div>
      <div class="rating">
        <div class="fill" style="width: 80%;"></div>
      </div>

      【讨论】:

      • 这几乎是完美的,谢谢!太糟糕的剪辑路径支持似乎很低caniuse.com/#feat=css-clip-path
      • IE 不支持 clip-path 和 css 自定义属性;(
      • @Marvin3 自定义属性可以很容易地替换为一些常见的 CSS ;)
      猜你喜欢
      • 1970-01-01
      • 2016-10-25
      • 2021-12-29
      • 1970-01-01
      • 2018-12-28
      • 2019-01-06
      • 2017-06-12
      • 2017-06-30
      • 1970-01-01
      相关资源
      最近更新 更多