svg要素の色を変更する方法は?


346

このテクニックhttp://css-tricks.com/svg-fallbacks/を使用してsvgの色を変更したいのですが、これまではできませんでした。私はこれをCSSに入れましたが、何があっても私のイメージは常に黒です。私のコード:

.change-my-color {
  fill: green;
}
<svg>
    <image class="change-my-color" xlink:href="https://svgur.com/i/AFM.svg" width="96" height="96" src="ppngfallback.png" />
</svg>


私はSVGの専門家ではありませんが、塗りつぶしを背景色に変更してみましたか?
メグ

svg background-colorの@Meganは、「Illustrator」で行うように、「fill」プロパティと「ストローク」の境界線で指定されます。w3.org/TR/SVG/propidx.html
Barbara

4
HTMLドキュメントからのCSSは、<img />内のSVG要素には適用されません
pawel

1
これは現在可能です。ここでシンプルで機能的な答え:stackoverflow.com/a/53336754/467240
mtyson

回答:


188

画像の色をそのように変更することはできません。SVGを画像としてロードする場合、ブラウザーでCSSまたはJavaScriptを使用して、SVGの表示方法を変更することはできません。

SVG画像を変更したい場合は、を使用して<object><iframe>または<svg>インラインを使用してロードする必要があります。

このページの手法を使用する場合は、Modernizrライブラリが必要です。このライブラリでは、SVGサポートを確認し、条件付きでフォールバックイメージを表示するかどうかを確認できます。その後、SVGをインライン化して、必要なスタイルを適用できます。

見る :

SVGをインライン化し、フォールバックイメージにクラス名(my-svg-alternate)をタグ付けできます。

<svg width="96px" height="96px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
<path id="time-3-icon" .../>
</svg>

<image class="my-svg-alternate" width="96" height="96" src="ppngfallback.png" />

そしてCSSでは、no-svgModernizr のクラス(CDN:http : //ajax.aspnetcdn.com/ajax/modernizr/modernizr-2.7.2.js)を使用してSVGサポートを確認します。SVGサポートがない場合、SVGブロックは無視され、画像が表示されます。それ以外の場合、画像はDOMツリーから削除されます(display: none):

.my-svg-alternate {
  display: none;
}
.no-svg .my-svg-alternate {
  display: block;
  width: 100px;
  height: 100px;
  background-image: url(image.png);
}

次に、インライン要素の色を変更できます。

#time-3-icon {
   fill: green;
}

5
objectホスティングドキュメントから埋め込みSVGのスタイルを設定することはできません。
ハビエルレイ

1
@JavierReyでは、JavaScriptを介してオブジェクトタグのコンテンツにスタイルを挿入できます。しかし、ホスティングドキュメントのスタイルシートに追加するだけでは適用されないのは正しいことです。
ロバートロングソン2018

2
私は@ manish-menariaのソリューションを使用しており、完全に機能します。
ライアンエリス

1
承認された回答は次のように変更する必要があります:stackoverflow.com/a/53336754/467240
mtyson

374

2020年の答え

CSSフィルターは現在のすべてのブラウザーで動作します

SVGの色を変更するには

  1. <img>タグを使用してSVG画像を追加します。
<img src="dotted-arrow.svg" class="filter-green"/>
  1. 特定の色にフィルターするには、次のCodepen(ここをクリックしてcodepenを開く)を使用して、16進数のカラーコードをCSSフィルターに変換します。

たとえば、出力#00EE00

filter: invert(42%) sepia(93%) saturate(1352%) hue-rotate(87deg) brightness(119%) contrast(119%);
  1. filterこのクラスにCSS を追加します。
    .filter-green{
        filter: invert(48%) sepia(79%) saturate(2476%) hue-rotate(86deg) brightness(118%) contrast(119%);
    }

5
古いバージョンのブラウザではサポートされていないについてこれは、通常の警告が付属しています:developer.mozilla.org/en-US/docs/Web/CSS/...
ケビン王

17
CodePenに記載されているように、SVGが黒ではない(灰色だった)場合、brightness(0) saturate(100%)フィルターのリストの先頭に追加すると、最初に100%黒になり、他のフィルターで正しい色に変更できるようになります。
jdunning

2
また、CodePenに情報を提供したこのStackOverflowの質問のソリューションに関する魅力的な背景がたくさんあります。
jdunning

3
私の男。サポートは受け入れられるようですcaniuse.com/#feat=css-filters
Sam Doidge

うまく機能し、この無関係のコードペンを使用して、16進数をフィルターに入れました:codepen.io/sosuke/pen/Pjoqqp
WEBjuju

220

SVGの色を変更するには、テキストエディタでsvgファイルを開いて、svgコードを直接変更します。コードは以下のコードのようになります

<?xml version="1.0" encoding="utf-8"?>
    <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
    <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
    <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
         width="500px" height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve">
    <g>
        <path d="M114.26,436.584L99.023,483h301.953l-15.237-46.416H114.26z M161.629,474.404h-49.592l9.594-29.225h69.223
            C181.113,454.921,171.371,464.663,161.629,474.404z"/>
    /*Some more code goes on*/
    </g>
    </svg>

パス、円、ポリゴンなどのXMLタグいくつかあることがわかります。そこで、style属性を使用して独自の色を追加できます。以下の例を見てください

<path style="fill:#AB7C94;" d="M114.26,436.584L99.023,483h301.953l-15.237-46.416H114.26z M161.629,474.404h-49.592l9.594-29.225h69.223
                C181.113,454.921,171.371,464.663,161.629,474.404z"/>

すべてのタグにスタイル属性を追加して、必要な色のSVGを取得できるようにします


48
なぜfillこのような属性を使用しないのfill = "#AB7C94"ですか?style属性が必要な理由がわからない
bg17aw 2017年

4
こんにちはダニエル、そうです。fillが属性として使用できることを知りませんでした。@ bg17awのコメントが長すぎることに気づかず申し訳ありません
sushant047

30

テストページを追加しました-フィルター設定を介してSVGを色付けします。

例えば filter: invert(0.5) sepia(1) saturate(5) hue-rotate(175deg)

SVGのアップロードとカラーリング-Jsfiddle

アイデアを取りました:https : //blog.union.io/code/2017/08/10/img-svg-fill/


1
ありがとう、あなたは私を私から救ってくれます。.custom-disabled > svg {filter:invert(0.2) sepia(1) saturte(0) hue-rotate(0);}アイコンを無効にするために必要な仕事をしました。
ロジャー

19

パス情報を持つSVGのみ。画像に対してそれを行うことはできません。パスとして、ストロークと塗りつぶしの情報を変更でき、完了です。イラストレーターのように

そう:CSSを介してパスfill値を上書きできます

path { fill: orange; }

しかし、ホバリング効果が発生しているときにテキストで変更したいので、より柔軟な方法が必要な場合。

path { fill: currentcolor; }

body {
  background: #ddd;
  text-align: center;
  padding-top: 2em;
}

.parent {
  width: 320px;
  height: 50px;
  display: block;
  transition: all 0.3s;
  cursor: pointer;
  padding: 12px;
  box-sizing: border-box;
}

/***  desired colors for children  ***/
.parent{
  color: #000;
  background: #def;
}
.parent:hover{
  color: #fff;
  background: #85c1fc;
}

.parent span{
  font-size: 18px;
  margin-right: 8px;
  font-weight: bold;
  font-family: 'Helvetica';
  line-height: 26px;
  vertical-align: top;
}
.parent svg{
  max-height: 26px;
  width: auto;
  display: inline;
}

/****  magic trick  *****/
.parent svg path{
  fill: currentcolor;
}
<div class='parent'>
  <span>TEXT WITH SVG</span>
  <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128" viewBox="0 0 32 32">
<path d="M30.148 5.588c-2.934-3.42-7.288-5.588-12.148-5.588-8.837 0-16 7.163-16 16s7.163 16 16 16c4.86 0 9.213-2.167 12.148-5.588l-10.148-10.412 10.148-10.412zM22 3.769c1.232 0 2.231 0.999 2.231 2.231s-0.999 2.231-2.231 2.231-2.231-0.999-2.231-2.231c0-1.232 0.999-2.231 2.231-2.231z"></path>
</svg>
</div>


12

最も簡単な方法は、https://icomoon.io/app/#/selectなどのサービスを使用してSVGからフォントを作成することです。SVGをアップロードし、[フォントを生成]をクリックして、フォントファイルとCSSをサイドに含め、他のテキストと同じように使用してスタイルを設定します。スタイリングがずっと簡単になるので、いつもこのように使用します。

編集: @ CodeMouse92アイコンフォントでコメントされた記事で述べたように、スクリーンリーダーを台無しにしてしまいます(SEOにはおそらく悪影響があります)。したがって、SVGに固執してください。


4
また、スクリーンリーダーを混乱させます。Seren Daviesによる「Death to Icon Fonts」を
CodeMouse92 2017年

6

いくつかのトリックを使用する場合は、CSSでSVGの色を変更できます。そのための小さなスクリプトを書きました。

  • svg画像を持っている要素のリストを調べます
  • svgファイルをxmlとしてロードします
  • SVGパーツのみをフェッチ
  • パスの色を変更する
  • インライン画像としてsrcを変更されたsvgに置き換えます
$('img.svg-changeable').each(function () {
  var $e = $(this);
  var imgURL = $e.prop('src');

  $.get(imgURL, function (data) {
    // Get the SVG tag, ignore the rest
    var $svg = $(data).find('svg');

    // change the color
    $svg.find('path').attr('fill', '#000');

    $e.prop('src', "data:image/svg+xml;base64," + window.btoa($svg.prop('outerHTML')));
  });

});

上記のコードは正しく動作しない可能性があります。これとほぼ同じように機能するsvg背景画像を持つ要素にこれを実装しました。しかし、とにかく、あなたはあなたのケースに合うようにこのスクリプトを修正しなければなりません。お役に立てば幸いです。


ちなみに、あなたがRoR開発者であれば、sassプリコンパイラーに新しいメソッドを追加することもできます。コンパイルされたcssファイルにbase64でエンコードされた正しい色の画像が含まれるため、これははるかに優れています。JSはもう必要ありません!たぶん私が書いたコードを提供したり、CTOに連絡したりする必要があるかもしれません。
cydoc 2015

2
ソリューションを提供するための+1は、実行できないと言うのではなく、この回答も関連しています:stackoverflow.com/questions/11978995/…–
クレイトロニコン

6

背景色を持つボックス要素のSVG マスクは次のようになります。

.icon{
  --size     : 70px;
  display    : inline-block;
  width      : var(--size);
  height     : var(--size);
  transition : .12s;
  -webkit-mask-size: cover;
  mask-size  : cover;
}

.icon-bike{
  background: black;
  -webkit-mask-image: url(https://image.flaticon.com/icons/svg/89/89139.svg);
  mask-image: url(hhttps://image.flaticon.com/icons/svg/89/89139.svg);
  animation: 1s frames infinite ease;
}

@keyframes frames {
  50% { background:red;  }
}
<i class="icon icon-bike" style="--size:150px"></i>


注-SVGマスクはInternet Explorerブラウザーではサポートされていません


5

svg内のパスをターゲットにします。

<svg>
   <path>....
</svg>

次のようにインラインで実行できます。

<path fill="#ccc">

または

svg{
   path{
        fill: #ccc


2

これを、たとえばcssの背景画像であるインラインsvgに実行する場合:

background: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='rgba(31,159,215,1)' viewBox='...'/%3E%3C/svg%3E");

もちろん、...をインライン画像コードに置き換えます


2

たとえば、HTMLで次のようにします。

<body>
  <svg viewBox="" width="" height="">
    <path id="struct1" fill="#xxxxxx" d="M203.3,71.6c-.........."></path>
  </svg>
</body>

jQueryを使用します。

$("#struct1").css("fill","<desired colour>");

これは、HTMLにインラインでSVGファイルを含める場合にのみ機能します。これを明確にするために、回答を編集しました。
Flimm

0

実際、この問題にはかなり柔軟な解決策があります。実行時にSVGをテキストとしてパッチするWebコンポーネントを記述します。JSFiddleへのリンクを含む要旨も公開

👍フィルター:反転(42%)セピア(93%)飽和(1352%)色相回転(87deg)明るさ(119%)コントラスト(119%);

<html>

<head>
  <title>SVG with color</title>
</head>

<body>
  <script>
    (function () {
      const createSvg = (color = '#ff9933') => `
          <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="76px" height="22px" viewBox="-0.5 -0.5 76 22">
            <defs/>
              <g>
                <ellipse cx="5" cy="10" rx="5" ry="5" fill="#ff9933" stroke="none" pointer-events="all"/>
                <ellipse cx="70" cy="10" rx="5" ry="5" fill="#ff9933" stroke="none" pointer-events="all"/>
                <path d="M 9.47 12.24 L 17.24 16.12 Q 25 20 30 13 L 32.5 9.5 Q 35 6 40 9 L 42.5 10.5 Q 45 12 50 6 L 52.5 3 Q 55 0 60.73 3.23 L 66.46 6.46" fill="none" stroke="#ff9933" stroke-miterlimit="10" pointer-events="stroke"/>
              </g>
          </svg>`.split('#ff9933').join(color);

      function SvgWithColor() {
        const div = Reflect.construct(HTMLElement, [], SvgWithColor);
        const color = div.hasAttribute('color') ? div.getAttribute('color') : 'cyan';
        div.innerHTML = createSvg(color);
        return div;
      }

      SvgWithColor.prototype = Object.create(HTMLElement.prototype);
      customElements.define('svg-with-color', SvgWithColor);

      document.body.innerHTML += `<svg-with-color
        color='magenta' 
      ></svg-with-color>`;

    })();

  </script>
</body>

</html>

-1

最短のBootstrap互換の方法、JavaScriptなし:

.cameraicon {
height: 1.6em;/* set your own icon size */
mask: url(/camera.svg); /* path to your image */
-webkit-mask: url(/camera.svg) no-repeat center;
}

そしてそれを次のように使用します:

<td class="text-center">
    <div class="bg-secondary cameraicon"/><!-- "bg-secondary" sets actual color of your icon -->
</td>

-1

ブラウザを使用して画像を開き、画像を右クリックして[ページのソースを表示]をクリックすると、画像のsvgタグが表示されます。コピーしてHTMLに貼り付け、塗りつぶしを選択した色に変更します


受け入れ答えはすでにインライン化して、解決策としての色を設定することを示唆しています。
Robert Longson

-1

画像のsvgタグにfill: "desiredColor"を追加するだけです:例:

<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="#bbb9c6">
<path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-2 12H6v-2h12v2zm0-3H6V9h12v2zm0-3H6V6h12v2z"/><path d="M0 0h24v24H0z" fill="none"/></svg>

これは基本的にこの回答またはこれ
Robert Longson

これらの回答では、パスタグの入力について説明しています。svgタグで機能するため、投稿しました
Shivani
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.