401

SVG出力をページコードと直接インラインに配置すると、次のようにCSSで塗りつぶしの色を簡単に変更できます。

polygon.mystar {
    fill: blue;
}​

circle.mycircle {
    fill: green;
}

これはうまく機能しますが、SVGがBACKGROUND-IMAGEとして提供されているときに、SVGの「fill」属性を変更する方法を探しています。

html {      
    background-image: url(../img/bg.svg);
}

どうすれば色を変更できますか?それも可能ですか?

参考までに、外部SVGファイルの内容は次のとおりです。

<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="320px" height="100px" viewBox="0 0 320 100" enable-background="new 0 0 320 100" xml:space="preserve">
<polygon class="mystar" fill="#3CB54A" points="134.973,14.204 143.295,31.066 161.903,33.77 148.438,46.896 151.617,65.43 134.973,56.679 
    118.329,65.43 121.507,46.896 108.042,33.77 126.65,31.066 "/>
<circle class="mycircle" fill="#ED1F24" cx="202.028" cy="58.342" r="12.26"/>
</svg>
4

20 に答える 20

195

CSSマスクを使用できます。「mask」プロパティを使用して、要素に適用されるマスクを作成します。

.icon {
    background-color: red;
    -webkit-mask-image: url(icon.svg);
    mask-image: url(icon.svg);
}

詳細については、このすばらしい記事を参照してください:https ://codepen.io/noahblon/post/coloring-svgs-in-css-background-images

于 2017-10-24T07:49:48.250 に答える
182

私は似たようなものが必要で、CSSに固執したかったのです。これは、LESSとSCSSのミックスイン、およびこれに役立つプレーンなCSSです。残念ながら、ブラウザのサポートは少し緩いです。ブラウザのサポートの詳細については、以下を参照してください。

少ないミックスイン:

.element-color(@color) {
  background-image: url('data:image/svg+xml;utf8,<svg ...><g stroke="@{color}" ... /></g></svg>');
}

使用量が少ない:

.element-color(#fff);

SCSSミックスイン:

@mixin element-color($color) {
  background-image: url('data:image/svg+xml;utf8,<svg ...><g stroke="#{$color}" ... /></g></svg>');
}

SCSSの使用法:

@include element-color(#fff);

CSS:

// color: red
background-image: url('data:image/svg+xml;utf8,<svg ...><g stroke="red" ... /></g></svg>');

完全なSVGコードをCSSファイルに埋め込む方法の詳細は次のとおりです。また、ブラウザの互換性についても言及しましたが、これは実行可能なオプションには少し小さすぎます。

于 2015-01-07T19:25:28.513 に答える
96

これを行う1つの方法は、サーバー側のメカニズムからsvgを提供することです。GETパラメーターに従ってsvgを出力するリソースサーバー側を作成するだけで、特定のURLでそれを提供できます。

次に、cssでそのURLを使用します。

背景画像として、それはDOMの一部ではなく、操作できないためです。もう1つの可能性は、定期的に使用し、通常の方法でページに埋め込むことですが、絶対に配置し、ページの全幅と高さにしてから、z-indexcssプロパティを使用して他のすべてのDOM要素の後ろに配置しますページ上。

于 2012-11-13T20:06:13.737 に答える
67

さらに別のアプローチは、マスクを使用することです。次に、マスクされた要素の背景色を変更します。これは、svgのfill属性を変更するのと同じ効果があります。

HTML:

<glyph class="star"/>
<glyph class="heart" />
<glyph class="heart" style="background-color: green"/>
<glyph class="heart" style="background-color: blue"/>

CSS:

glyph {
    display: inline-block;
    width:  24px;
    height: 24px;
}

glyph.star {
  -webkit-mask: url(star.svg) no-repeat 100% 100%;
  mask: url(star.svg) no-repeat 100% 100%;
  -webkit-mask-size: cover;
  mask-size: cover;
  background-color: yellow;
}

glyph.heart {
  -webkit-mask: url(heart.svg) no-repeat 100% 100%;
  mask: url(heart.svg) no-repeat 100% 100%;
  -webkit-mask-size: cover;
  mask-size: cover;
  background-color: red;
}

完全なチュートリアルはここにあります:http://codepen.io/noahblon/blog/coloring-svgs-in-css-background-images(私自身のものではありません)。さまざまなアプローチを提案します(マスクに限定されません)。

于 2015-08-03T23:28:05.993 に答える
31

セピアフィルターを色相回転、明るさ、彩度とともに使用して、必要な色を作成します。

.colorize-pink {
  filter: brightness(0.5) sepia(1) hue-rotate(-70deg) saturate(5);
}

https://css-tricks.com/solved-with-css-colorizing-svg-backgrounds/

于 2020-02-11T11:09:48.797 に答える
22

Sassで可能です!あなたがしなければならない唯一のことはあなたのsvgコードをurlエンコードすることです。そして、これはSassのヘルパー関数で可能です。このためのcodepenを作成しました。これを見てください:

http://codepen.io/philippkuehn/pen/zGEjxB

// choose a color

$icon-color: #F84830;


// functions to urlencode the svg string

@function str-replace($string, $search, $replace: '') {
  $index: str-index($string, $search);
  @if $index {
    @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
  }
  @return $string;
}

@function url-encode($string) {
  $map: (
    "%": "%25",
    "<": "%3C",
    ">": "%3E",
    " ": "%20",
    "!": "%21",
    "*": "%2A",
    "'": "%27",
    '"': "%22",
    "(": "%28",
    ")": "%29",
    ";": "%3B",
    ":": "%3A",
    "@": "%40",
    "&": "%26",
    "=": "%3D",
    "+": "%2B",
    "$": "%24",
    ",": "%2C",
    "/": "%2F",
    "?": "%3F",
    "#": "%23",
    "[": "%5B",
    "]": "%5D"
  );
  $new: $string;
  @each $search, $replace in $map {
    $new: str-replace($new, $search, $replace);
  }
  @return $new;
}

@function inline-svg($string) {
  @return url('data:image/svg+xml;utf8,#{url-encode($string)}');
}


// icon styles
// note the fill="' + $icon-color + '"

.icon {
  display: inline-block;
  width: 50px;
  height: 50px;
  background: inline-svg('<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
   viewBox="0 0 30 30" enable-background="new 0 0 30 30" xml:space="preserve">
<path fill="' + $icon-color + '" d="M18.7,10.1c-0.6,0.7-1,1.6-0.9,2.6c0,0.7-0.6,0.8-0.9,0.3c-1.1-2.1-0.4-5.1,0.7-7.2c0.2-0.4,0-0.8-0.5-0.7
  c-5.8,0.8-9,6.4-6.4,12c0.1,0.3-0.2,0.6-0.5,0.5c-0.6-0.3-1.1-0.7-1.6-1.3c-0.2-0.3-0.4-0.5-0.6-0.8c-0.2-0.4-0.7-0.3-0.8,0.3
  c-0.5,2.5,0.3,5.3,2.1,7.1c4.4,4.5,13.9,1.7,13.4-5.1c-0.2-2.9-3.2-4.2-3.3-7.1C19.6,10,19.1,9.6,18.7,10.1z"/>
</svg>');
}
于 2015-06-21T10:59:17.663 に答える
13
 .icon { 
  width: 48px;
  height: 48px;
  display: inline-block;
  background: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/18515/heart.svg) no-repeat 50% 50%; 
  background-size: cover;
}

.icon-orange { 
  -webkit-filter: hue-rotate(40deg) saturate(0.5) brightness(390%) saturate(4); 
  filter: hue-rotate(40deg) saturate(0.5) brightness(390%) saturate(4); 
}

.icon-yellow {
  -webkit-filter: hue-rotate(70deg) saturate(100);
  filter: hue-rotate(70deg) saturate(100);
}

codebenの記事とデモ

于 2017-04-11T08:20:26.480 に答える
10

svgをテキストとしてダウンロードします。

javascriptを使用してsvgテキストを変更し、ペイント/ストローク/塗りつぶしの色を変更します。

次に、ここで説明するように、変更したsvg文字列をcssにインラインで埋め込みます。

于 2013-11-24T16:07:08.813 に答える
10

これで、次のようにクライアント側でこれを実現できます。

var green = '3CB54A';
var red = 'ED1F24';
var svg = '<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="320px" height="100px" viewBox="0 0 320 100" enable-background="new 0 0 320 100" xml:space="preserve"> <polygon class="mystar" fill="#'+green+'" points="134.973,14.204 143.295,31.066 161.903,33.77 148.438,46.896 151.617,65.43 134.973,56.679 118.329,65.43 121.507,46.896 108.042,33.77 126.65,31.066 "/><circle class="mycircle" fill="#'+red+'" cx="202.028" cy="58.342" r="12.26"/></svg>';      
var encoded = window.btoa(svg);
document.body.style.background = "url(data:image/svg+xml;base64,"+encoded+")";

ここでフィドル!

于 2014-08-14T09:53:18.243 に答える
8

SVGを変数に保存できます。次に、必要に応じてSVG文字列を操作します(つまり、幅、高さ、色などを設定します)。次に、結果を使用して背景を設定します。例:

$circle-icon-svg: '<svg xmlns="http://www.w3.org/2000/svg"><circle cx="10" cy="10" r="10" /></svg>';

$icon-color: #f00;
$icon-color-hover: #00f;

@function str-replace($string, $search, $replace: '') {
    $index: str-index($string, $search);

    @if $index {
        @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
    }

    @return $string;
}

@function svg-fill ($svg, $color) {
  @return str-replace($svg, '<svg', '<svg fill="#{$color}"');
}

@function svg-size ($svg, $width, $height) {
  $svg: str-replace($svg, '<svg', '<svg width="#{$width}"');
  $svg: str-replace($svg, '<svg', '<svg height="#{$height}"');

  @return $svg;
}

.icon {
  $icon-svg: svg-size($circle-icon-svg, 20, 20);

  width: 20px; height: 20px; background: url('data:image/svg+xml;utf8,#{svg-fill($icon-svg, $icon-color)}');

  &:hover {
    background: url('data:image/svg+xml;utf8,#{svg-fill($icon-svg, $icon-color-hover)}');
  }
}

私もデモを作成しました、http://sassmeister.com/gist/4cf0265c5d0143a9e734

このコードは、SVGについていくつかの仮定を行っています。たとえば、<svg />要素に既存の塗りつぶしの色がなく、幅または高さのプロパティが設定されていないことなどです。入力はSCSSドキュメントにハードコーディングされているため、これらの制約を適用するのは非常に簡単です。

コードの重複について心配する必要はありません。圧縮により、違いはごくわずかになります。

于 2015-10-30T12:13:57.220 に答える
7

このようにCSSで直接SVGを使用しようとしている場合url();

a:before {
  content: url('data:image/svg+xml; utf8, <svg xmlns="http://www.w3.org/2000/svg" x="0" y="0" viewBox="0 0 451 451"><path d="M345.441,2...

#toをエンコードする必要%23があります。そうしないと、機能しません。

<svg fill="%23FFF" ...
于 2021-08-15T01:05:03.357 に答える
4

このために独自のSCSS関数を作成できます。config.rbファイルに以下を追加します。

require 'sass'
require 'cgi'

module Sass::Script::Functions

  def inline_svg_image(path, fill)
    real_path = File.join(Compass.configuration.images_path, path.value)
    svg = data(real_path)
    svg.gsub! '{color}', fill.value
    encoded_svg = CGI::escape(svg).gsub('+', '%20')
    data_url = "url('data:image/svg+xml;charset=utf-8," + encoded_svg + "')"
    Sass::Script::String.new(data_url)
  end

private

  def data(real_path)
    if File.readable?(real_path)
      File.open(real_path, "rb") {|io| io.read}
    else
      raise Compass::Error, "File not found or cannot be read: #{real_path}"
    end
  end

end

次に、CSSで使用できます。

.icon {
  background-image: inline-svg-image('icons/icon.svg', '#555');
}

SVGファイルを編集し、マークアップの塗りつぶし属性をfill="{color}"に置き換える必要があります。

アイコンパスは、常に同じconfig.rbファイル内のimages_dirパラメーターからの相対パスです。

他のいくつかのソリューションと似ていますが、これはかなりクリーンで、SCSSファイルを整理します。

于 2015-07-16T21:37:32.777 に答える
3

一部の(非常に具体的な)状況では、これはフィルターを使用することで実現できます。たとえば、を使用して色相を45度回転させることにより、青色のSVG画像を紫色に変更できますfilter: hue-rotate(45deg);。ブラウザのサポートは最小限ですが、それでも興味深いテクニックです。

デモ

于 2016-05-11T13:59:28.533 に答える
2

モノクロの背景の場合、背景色を表示する必要があるマスク付きのsvgを使用できます。

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" preserveAspectRatio="xMidYMid meet" focusable="false" style="pointer-events: none; display: block; width: 100%; height: 100%;" >
    <defs>
        <mask id="Mask">
            <rect width="100%" height="100%" fill="#fff" />
            <polyline stroke-width="2.5" stroke="black" stroke-linecap="square" fill="none" transform="translate(10.373882, 8.762969) rotate(-315.000000) translate(-10.373882, -8.762969) " points="7.99893906 13.9878427 12.7488243 13.9878427 12.7488243 3.53809523"></polyline>
        </mask>
    </defs>
    <rect x="0" y="0" width="20" height="20" fill="white" mask="url(#Mask)" />
</svg>

そしてこのcssを使用するより

background-repeat: no-repeat;
background-position: center center;
background-size: contain;
background-image: url(your/path/to.svg);
background-color: var(--color);
于 2019-08-07T15:21:55.747 に答える
1

ここでのショーの後半ですが、SVGコードを直接編集できる場合は、SVGポリゴンに塗りつぶしの色を追加できました。たとえば、次のsvgは、デフォルトの黒ではなく赤にレンダリングされます。私はChromeの外でテストしていません:

<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">
    <polygon 


        fill="red"


        fill-rule="evenodd" clip-rule="evenodd" points="452.5,233.85 452.5,264.55 110.15,264.2 250.05,390.3 229.3,413.35 
47.5,250.7 229.3,86.7 250.05,109.75 112.5,233.5 "/>
</svg>
于 2015-04-09T00:29:05.970 に答える
1

私がこれを見つけ、クロスブラウザ(別名防弾)になる唯一の方法は、PHPでSVGをレンダリングし、クエリ文字列を渡して色を設定することです。

ここでは「arrow.php」と呼ばれるSVG

<?php
$fill = filter_input(INPUT_GET, 'fill');
$fill = strtolower($fill);
$fill = preg_replace("/[^a-z0-9]/", '', $fill);
if(empty($fill)) $fill = "000000";
header('Content-type: image/svg+xml');
echo '<?xml version="1.0" encoding="utf-8"?>';
?>
<svg xmlns="http://www.w3.org/2000/svg" width="7.4" height="12" viewBox="0 0 7.4 12">
    <g>
        <path d="M8.6,7.4,10,6l6,6-6,6L8.6,16.6,13.2,12Z" transform="translate(-8.6 -6)" fill="#<?php echo htmlspecialchars($fill); ?>" fill-rule="evenodd"/>
    </g>
</svg>

次に、このような画像を呼び出します

.cssclass{ background-image: url(arrow.php?fill=112233); }

PHPでのみ動作します。また、色の値を変更するたびに、ブラウザが新しい画像をロードすることを忘れないでください。

于 2021-10-04T14:07:57.480 に答える
0

明るさフィルターを使用できます。値が1より大きい場合は要素が明るくなり、値が1より小さい場合は要素が暗くなります。したがって、これらの明るいSVGを暗くすることができ、その逆も可能です。たとえば、これによりsvgが暗くなります。

filter: brightness(0);

明るさのレベルだけでなく色を変更するために、色相回転、明るさとともにセピアフィルターを使用できます。たとえば、次のようになります。

.colorize-blue {
  filter: brightness(0.5) sepia(1) hue-rotate(140deg) saturate(6);
}
于 2021-06-07T09:08:12.933 に答える
0

scsscreate関数

@function url-svg($icon) {
  @return url("data:image/svg+xml;utf8,#{str-replace($icon, "#", "%23")}");
}

scss使用

url-svg('<svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M13.125 0H1.875C0.84082 0 0 0.84082 0 1.875V10.3125C0 11.3467 0.84082 12.1875 1.875 12.1875H4.6875V14.6484C4.6875 14.9355 5.01563 15.1025 5.24707 14.9326L8.90625 12.1875H13.125C14.1592 12.1875 15 11.3467 15 10.3125V1.875C15 0.84082 14.1592 0 13.125 0Z" fill="#8A8A8F"/></svg>')

生成されたcss

url('data:image/svg+xml;utf8,<svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M13.125 0H1.875C0.84082 0 0 0.84082 0 1.875V10.3125C0 11.3467 0.84082 12.1875 1.875 12.1875H4.6875V14.6484C4.6875 14.9355 5.01563 15.1025 5.24707 14.9326L8.90625 12.1875H13.125C14.1592 12.1875 15 11.3467 15 10.3125V1.875C15 0.84082 14.1592 0 13.125 0Z" fill="%238A8A8F"/></svg>')

str-replace関数はbootstrapから使用されます。

于 2021-10-21T07:33:02.723 に答える
-2

これは私のお気に入りの方法ですが、ブラウザのサポートは非​​常に進歩的でなければなりません。maskプロパティを使用して、要素に適用されるマスクを作成します。マスクが不透明または塗りつぶされているところはどこでも、下にある画像が透けて見えます。透明な場合、下にある画像はマスクされるか、非表示になります。CSSマスクイメージの構文はbackground-imageに似ています。Codepenを見てくださいmask

于 2016-11-03T05:52:15.547 に答える
-5

多くのIFがありますが、base64より前にエンコードされたSVGが開始された場合:

<svg fill="#000000

次に、base64でエンコードされた文字列が開始されます。

PHN2ZyBmaWxsPSIjMDAwMDAw

事前にエンコードされた文字列が始まる場合:

<svg fill="#bfa76e

次に、これは次のようにエンコードされます。

PHN2ZyBmaWxsPSIjYmZhNzZl

エンコードされた両方の文字列は同じように始まります。

PHN2ZyBmaWxsPSIj

base64エンコーディングの癖は、3つの入力文字ごとに4つの出力文字になることです。SVGがこのように開始すると、6文字の16進塗りつぶしの色は、エンコーディングブロック「境界」から正確に開始されます。したがって、クロスブラウザJS置換を簡単に実行できます。

output = input.replace(/MDAwMDAw/, "YmZhNzZl");

しかし、上記のtnt-roxの答えは、前進するための方法です。

于 2016-02-17T11:52:53.337 に答える