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

如何在页面多次复用SVG时为不同路径设置不同颜色?

如何用CSS复用SVG并在不同容器高亮不同部分

你之前的选择器无效,是因为<use>引用的SVG symbol内容处于独立的DOM上下文,外部CSS无法直接穿透选中内部的.sq1等类元素。不过可以通过CSS变量的继承特性实现需求,具体方案如下:

核心思路

利用CSS变量的继承性,给每个父容器(.div1/.div2等)设置专属的变量值,在SVG symbol内部的元素上绑定这些变量,这样每个SVG实例会继承所在容器的变量,从而呈现不同的高亮效果。

修改后的完整代码

<!DOCTYPE html>
<html lang="de">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>SVGs</title>
    <style>
      :root {
        --colorSQ1: lightblue;
        --colorSQ2: lightblue;
        --colorSQ3: lightblue;
        --colorSQ4: lightblue;
      }

      /* 每个容器单独设置对应正方形的颜色 */
      .div1 { --colorSQ1: red; }
      .div2 { --colorSQ2: green; }
      .div3 { --colorSQ3: blue; }
      .div4 { --colorSQ4: yellow; }

      /* 确保SVG显示尺寸正常 */
      .dkarte {
        width: 200px;
        height: 200px;
      }
    </style>
  </head>

  <body>
    <div style="display: none">
      <svg xmlns="http://www.w3.org/2000/svg">
        <symbol viewBox="0 0 200 200" id="4squares">
          <!-- 每个正方形的fill绑定对应的CSS变量 -->
          <g class="sq1">
            <rect id="sq-1" width="50" height="50" x="0" y="0" fill="var(--colorSQ1)" />
          </g>
          <g class="sq2">
            <rect id="sq-2" width="50" height="50" x="50" y="0" fill="var(--colorSQ2)" />
          </g>
          <g class="sq3">
            <rect id="sq-3" width="50" height="50" x="0" y="50" fill="var(--colorSQ3)" />
          </g>
          <g class="sq4">
            <rect id="sq-4" width="50" height="50" x="50" y="50" fill="var(--colorSQ4)" />
          </g>
        </symbol>
      </svg>
    </div>

    <section class="d-karte">
      <div class="div1" id="div1">
        <h4>squares I</h4>
        <div class="dkarte-box">
          <span><svg class="dkarte"><use href="#4squares"></use></svg></span>
        </div>
      </div>
      <div class="div2">
        <h4>squares II</h4>
        <div class="dkarte-box">
          <span><svg class="dkarte"><use href="#4squares"></use></svg></span>
        </div>
      </div>
      <div class="div3">
        <h4>squares III</h4>
        <div class="dkarte-box">
          <span><svg class="dkarte"><use href="#4squares"></use></svg></span>
        </div>
      </div>
      <div class="div4">
        <h4>squares IV</h4>
        <div class="dkarte-box">
          <span><svg class="dkarte"><use href="#4squares"></use></svg></span>
        </div>
      </div>
    </section>
  </body>
</html>

关键修改点说明

  • 移除了symbol上的默认fill样式,改为给每个rect单独设置fill="var(--colorSQx)",默认继承:root里的浅蓝色。
  • 给每个.div1到.div4容器设置对应的变量值,比如.div1 { --colorSQ1: red; },这样该容器下的SVG实例会继承这个变量,将sq1的颜色改为红色。
  • 简化了xlink:href为href(现代浏览器已支持,更简洁)。
  • 给.dkarte设置固定宽高,确保SVG显示尺寸符合预期。

为什么之前的选择器无效?

<use>元素会克隆symbol的内容到一个独立的Shadow DOM片段中,这个片段和主DOM树隔离,外部的CSS选择器(比如.div1 .dkarte .sq1)无法穿透到这个隔离的上下文里选中内部元素,所以直接用类选择器控制样式会失效。而CSS变量是可以通过DOM树继承的,所以能绕过这个限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:39:57