🐧

svgファイルを加工する

に公開

おなじデザインで色違い、サイズ違いだけで
ファイルを新たに作って管理するのめんどくさい...となったので
1ファイルだけ用意してどれほどパターン作れるのか試したときの記録です

環境

windows
vscode
拡張機能live server を使って確認しました
https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer

svgファイルを用意

google fontのiconを使いました
https://fonts.google.com/icons
任意のアイコンを選択してデフォルト設定のままダウンロードします

加工する

1. 外部参照する

svgファイルを直接定義せず、外部参照できるようにします

  1. ダウンロードしたsvgファイルにidを追加する
- <svg
xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#1f1f1f"><path d="M660-160h40v-160h-40v160Zm20-200q8 0 14-6t6-14q0-8-6-14t-14-6q-8 0-14 6t-6 14q0 8 6 14t14 6ZM200-800v640-640 200-200Zm80 400h147q11-23 25.5-43t32.5-37H280v80Zm0 160h123q-3-20-3-40t3-40H280v80ZM200-80q-33 0-56.5-23.5T120-160v-640q0-33 23.5-56.5T200-880h320l240 240v92q-19-6-39-9t-41-3v-40H480v-200H200v640h227q11 23 25.5 43T485-80H200Zm480-400q83 0 141.5 58.5T880-280q0 83-58.5 141.5T680-80q-83 0-141.5-58.5T480-280q0-83 58.5-141.5T680-480Z"/></svg>
+ <svg id="quick_reference"
xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#1f1f1f"><path d="M660-160h40v-160h-40v160Zm20-200q8 0 14-6t6-14q0-8-6-14t-14-6q-8 0-14 6t-6 14q0 8 6 14t14 6ZM200-800v640-640 200-200Zm80 400h147q11-23 25.5-43t32.5-37H280v80Zm0 160h123q-3-20-3-40t3-40H280v80ZM200-80q-33 0-56.5-23.5T120-160v-640q0-33 23.5-56.5T200-880h320l240 240v92q-19-6-39-9t-41-3v-40H480v-200H200v640h227q11 23 25.5 43T485-80H200Zm480-400q83 0 141.5 58.5T880-280q0 83-58.5 141.5T680-80q-83 0-141.5-58.5T480-280q0-83 58.5-141.5T680-480Z"/></svg>

  1. ファイルパスを指定する
    useタグのxlink:href属性にダウンロードしたファイルパスと追加したID名を指定します
    xlink:href="{ファイルパス}#<追加したid名>"
  <svg>
    <use xlink:href="./quick_reference_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg#quick_reference"></use>
  </svg>

2. 拡大縮小する

svgファイルはそのままにサイズ指定して拡大縮小します

  1. ダウンロードしたファイルからwidth, height属性を削除
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#1f1f1f">
  <path d="M660-160h40v-160h-40v160Zm20-200q8 0 14-6t6-14q0-8-6-14t-14-6q-8 0-14 6t-6 14q0 8 6 14t14 6ZM200-800v640-640 200-200Zm80 400h147q11-23 25.5-43t32.5-37H280v80Zm0 160h123q-3-20-3-40t3-40H280v80ZM200-80q-33 0-56.5-23.5T120-160v-640q0-33 23.5-56.5T200-880h320l240 240v92q-19-6-39-9t-41-3v-40H480v-200H200v640h227q11 23 25.5 43T485-80H200Zm480-400q83 0 141.5 58.5T880-280q0 83-58.5 141.5T680-80q-83 0-141.5-58.5T480-280q0-83 58.5-141.5T680-480Z"/></svg>
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960" fill="#1f1f1f">
  <path d="M660-160h40v-160h-40v160Zm20-200q8 0 14-6t6-14q0-8-6-14t-14-6q-8 0-14 6t-6 14q0 8 6 14t14 6ZM200-800v640-640 200-200Zm80 400h147q11-23 25.5-43t32.5-37H280v80Zm0 160h123q-3-20-3-40t3-40H280v80ZM200-80q-33 0-56.5-23.5T120-160v-640q0-33 23.5-56.5T200-880h320l240 240v92q-19-6-39-9t-41-3v-40H480v-200H200v640h227q11 23 25.5 43T485-80H200Zm480-400q83 0 141.5 58.5T880-280q0 83-58.5 141.5T680-80q-83 0-141.5-58.5T480-280q0-83 58.5-141.5T680-480Z"/></svg>
  1. 拡大する
    ダウンロードした10倍にする
  <svg width="240px" height="240px">
    <use xlink:href="./quick_reference_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg#quick_reference"></use>
  </svg>
  1. 縮小する
    ダウンロードした1/2倍にする
  <svg width="12px" height="12px">
    <use xlink:href="./quick_reference_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg#quick_reference"></use>
  </svg>

3. 色指定する

svgファイルはそのままにスタイル変更して色を変更します

  1. ダウンロードしたファイルからfill属性をすべて削除
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#1f1f1f">
  <path d="M660-160h40v-160h-40v160Zm20-200q8 0 14-6t6-14q0-8-6-14t-14-6q-8 0-14 6t-6 14q0 8 6 14t14 6ZM200-800v640-640 200-200Zm80 400h147q11-23 25.5-43t32.5-37H280v80Zm0 160h123q-3-20-3-40t3-40H280v80ZM200-80q-33 0-56.5-23.5T120-160v-640q0-33 23.5-56.5T200-880h320l240 240v92q-19-6-39-9t-41-3v-40H480v-200H200v640h227q11 23 25.5 43T485-80H200Zm480-400q83 0 141.5 58.5T880-280q0 83-58.5 141.5T680-80q-83 0-141.5-58.5T480-280q0-83 58.5-141.5T680-480Z"/></svg>
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px">
  <path d="M660-160h40v-160h-40v160Zm20-200q8 0 14-6t6-14q0-8-6-14t-14-6q-8 0-14 6t-6 14q0 8 6 14t14 6ZM200-800v640-640 200-200Zm80 400h147q11-23 25.5-43t32.5-37H280v80Zm0 160h123q-3-20-3-40t3-40H280v80ZM200-80q-33 0-56.5-23.5T120-160v-640q0-33 23.5-56.5T200-880h320l240 240v92q-19-6-39-9t-41-3v-40H480v-200H200v640h227q11 23 25.5 43T485-80H200Zm480-400q83 0 141.5 58.5T880-280q0 83-58.5 141.5T680-80q-83 0-141.5-58.5T480-280q0-83 58.5-141.5T680-480Z"/></svg>
  1. 色指定する
    svg {
      width: 24px;
      height: 24px;
      fill: red;
    }
  <svg>
    <use xlink:href="./quick_reference_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg#quick_reference"></use>
  </svg>

透過させる

アイコンの透明度指定により、濃淡の色違いを作成できました

    svg {
      width: 24px;
      height: 24px;
      fill: red;
      fill-opacity: 0.5;
    }
  <svg>
    <use xlink:href="./quick_reference_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg#quick_reference"></use>
  </svg>

グラデーションさせる

アイコンのグラデーションもつくることができました
ただし、外部参照させる方法ではできませんでした..

    .mask-img {
      width: 24px;
      height: 24px;
      background: linear-gradient(to bottom right, rgb(7, 67, 105), rgb(172, 191, 191), rgb(242, 225, 207), rgb(255, 110, 61));
      -webkit-mask-image: url(./quick_reference_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg);
      mask-image: url(./quick_reference_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg);
      mask-repeat: no-repeat;
    }
<div class="mask-img"></div>

4. 反転させる

    svg {
      width: 24px;
      height: 24px;
      transform: rotateY(180deg);
    }
  <svg>
    <use xlink:href="./quick_reference_24dp_1F1F1F_FILL0_wght400_GRAD0_opsz24.svg#quick_reference"></use>
  </svg>

まとめ

これだけバリデーションつくれたので1ファイルでだいぶまかなえそうです
加工したsvgファイルを表示している画面キャプチャ

Discussion