如何让SVG的fill属性继承父元素的background-color?
问题
我正在尝试将SVG图标适配为可动态控制颜色的内联元素(使用React实现,但框架不影响核心问题),我们的流程中没有CSS预处理器。该图标包含填充外圈和内部字母两部分,我尽量不想过多修改原始SVG文件。
我的需求是:
- 外圈默认继承上下文的前景色,已经通过
currentColor实现 - 内部字母默认继承父元素的背景色,但目前只能默认设为白色,在特殊场景(比如带自定义背景色的按钮上)需要手动调整,非常麻烦
当前的React代码如下:
/* ORCIDiD_iconBwVector.svg */ export function OrcidSvgIcon({circleColor, letterColor}: { circleColor?: string, letterColor?: string }){ // currentColor是SVG中对应color的关键字 circleColor = circleColor ?? "currentColor"; // 找不到对应background的currentColor等价关键字 letterColor = letterColor ?? "white"; /* 我们很可能想要移除text/css样式,改用常规的fill属性,但目前尽量保持SVG内容与原始文件接近。 */ return <SvgIcon viewBox="0 0 256 256" x={0} y={0} xmlSpace="preserve" > <style type="text/css">{` .st0{fill:${circleColor};} .st1{fill:${letterColor};} `}</style> <path className="st0" d="M256,128c0,70.7-57.3,128-128,128C57.3,256,0,198.7,0,128C0,57.3,57.3,0,128,0C198.7,0,256,57.3,256,128z"/> <g> <path className="st1" d="M86.3,186.2H70.9V79.1h15.4v48.4V186.2z"/> <path className="st1" d="M108.9,79.1h41.6c39.6,0,57,28.3,57,53.6c0,27.5-21.5,53.6-56.8,53.6h-41.8V79.1z M124.3,172.4h24.5 c34.9,0,42.9-26.5,42.9-39.7c0-21.5-13.7-39.7-43.7-39.7h-23.7V172.4z"/> <path className="st1" d="M88.7,56.8c0,5.5-4.5,10.1-10.1,10.1c-5.6,0-10.1-4.6-10.1-10.1c0-5.6,4.5-10.1,10.1-10.1 C84.2,46.7,88.7,51.3,88.7,56.8z"/> </g> </SvgIcon> }
想请教:有没有办法让SVG里的字母fill属性直接继承父上下文的背景色?
解决方案
目前SVG没有直接对应background-color的currentColor式关键字,但可以通过以下几种方式实现需求:
利用CSS变量传递背景色
这是最灵活且无需修改SVG结构的方案:- 在图标的父元素样式中,将背景色赋值给一个CSS变量:
.icon-parent { background-color: #your-bg-color; --parent-bg-color: var(--background-color, #fff); /* 可设置默认值 */ } - 修改React组件中
letterColor的默认值,直接引用该变量:
这样字母会自动继承父元素通过变量传递的背景色,无需手动传参。letterColor = letterColor ?? "var(--parent-bg-color)";
- 在图标的父元素样式中,将背景色赋值给一个CSS变量:
轻微修改组件结构:反向利用currentColor
若能接受给SVG外层添加容器,可以通过反向映射实现:- 修改组件,给SVG套一个外层容器,并让字母的
fill使用currentColor:export function OrcidSvgIcon({circleColor}: {circleColor?: string}){ circleColor = circleColor ?? "currentColor"; return ( <span className="icon-letter-container"> <SvgIcon viewBox="0 0 256 256" x={0} y={0} xmlSpace="preserve"> <style type="text/css">{` .st0{fill:${circleColor};} .st1{fill:currentColor;} `}</style> {/* 原SVG内容 */} </SvgIcon> </span> ) } - 在使用图标的父元素中,将容器的
color设为父元素的背景色:
这种方式不需要维护.icon-parent .icon-letter-container { color: background-color; }letterColor参数,仅需少量组件结构调整。
- 修改组件,给SVG套一个外层容器,并让字母的
内容的提问来源于stack exchange,提问作者Shorn
相关产品推荐
相关产品推荐

