react图标应用线性渐变

IT技术 reactjs svg gradient react-icons
2021-04-27 23:25:21

我想使用线性渐变动态地部分填充来自 react-icons 的 Font Awesome Star。我尝试了以下方法:

React Component with Inline Style - 将父跨度的背景设置为渐变并使 SVG 透明。似乎无法将 SVG 星形周围的边框设置为 #FFFFFF,所以我看到了父跨度的整个背景。见下文:

import React from 'react'
import FaStar from 'react-icons/lib/fa/star'

const Stars = () => {

  const inlineStyle = (pctFill) => {
    return(
      {background: 'linear-gradient(90deg, #134758 '+pctFill+'%, #d3d3d3 '+pctFill+'%)'}
    )
  }

  return(
    <div>
      <span style={inlineStyle(50)}>
        <FaStar />
      </span>
    </div>
  )
}

export default Stars

我也尝试过创建一个 linearGradient 组件并设置路径的 fill="url(#component)",但是 react-icons 路径是我父跨度的第三个孩子,我不知道如何访问。

请帮忙

3个回答

遇到了同样的问题,这是一个简单的工作解决方案:

  1. 添加一个 <svg> 元素包裹一个 <gradient> 元素到组件中。

  2. 给<渐变>添加一个id

  3. 通过“url(< id >)”将渐变链接到图标的“stroke”属性:

import { FiCheck } from 'react-icons/fi';

//...

<svg width="0" height="0">
  <linearGradient id="blue-gradient" x1="100%" y1="100%" x2="0%" y2="0%">
    <stop stopColor="#7a6ded" offset="0%" />
    <stop stopColor="#591885" offset="100%" />
  </linearGradient>
</svg>


<FiCheck style={{ stroke: "url(#blue-gradient)" }} />

obs:在某些包中,您可能需要将“描边”切换为“填充”。

  <svg width="1em" height="1em">
  <linearGradient id="blue-gradient" x1="100%" y1="100%" x2="0%" y2="0%">
    <stop stopColor="#7a6ded" offset="0%" />
    <stop stopColor="#591885" offset="100%" />
  </linearGradient>

<FaFacebook style={{ fill: "url(#blue-gradient)"}}/>

我的代码就是这样工作的。非常感谢。

我想我找到了一个解决方案,使用额外的 svg 和 def 标签。唯一的挫折是您必须指定 svg 的宽度和高度。

<Button className="border-0">
      <svg width="20" height="20">
         ------------------------------- // add linearGradient
        <defs>
          <linearGradient id="myGradient" gradientTransform="rotate(90)">
            <stop offset="5%"  stopColor="gold" />
            <stop offset="95%" stopColor="red" />
          </linearGradient>
        </defs>
          --------------------------------------- //pass attr to react icon
        <IconContext.Provider value={{ attr: {fill: "url('#myGradient')"}}}>
          <FaInstagram />
        </IconContext.Provider>
      </svg>
    </Button>

希望这有效!