2011-09-09 13 views
22

SVGをバックグラウンドイメージとして指定できますか?また、同じCSSファイル内のSVGをスタイル付けすることはできますか?背景イメージとしてSVGを指定し、CSSでSVGスタイルを設定しますか?

SVGイメージを単一のファイルまたはスプライトとして配置、スケーリング、およびクリップするのはとても快適ですが、SVGイメージを同じCSSファイル内でスタイル設定することは可能です背景画像。私は親要素のクラスに基づいて単純な形状の色を変化させるために、次の操作を行いたいのですが、擬似CSSで

element1 { 
background-image(icon.svg); 
} 

element1.black .svg-pathclass { 
fill: #000000; 
} 

element1.white .svg-pathclass { 
fill: #ffffff; 
} 

は明らかにこれはSVG持つクラスのパスを想定している.SVG -pathclass

これは可能ですか?

答えて

14

いいえ、これはできません。 SVGはある文書(data URIまたは外部参照ファイルでもよい)に用意されていて、別のファイルの背景としてをバックグラウンドとして使用する必要があります。

+0

そうそうです。ありがとう。えっ? – Jonathon

+0

@joneb私はそれがきちんとしているとは思わない、私は循環参照の問題を引き起こすと思う。 :) – Phrogz

+10

はい、あなたは正しいです。この例ではきちんとした使い方があります:「もっと広い意味合いを考えていないときに、私が今使っている目的ではうまくいきたいです。」D – Jonathon

6

あなたはSVGの内部のスタイルを通常のCSSを使用し、その後、この効果を再現するSVGCSSマスクを使用することができ、でもbackground-image

-webkit-mask: url(filename.svg) 50% 50%/100px 50px no-repeat; 
    -o-mask: url(filename.svg) 50% 50%/100px 50px no-repeat; 
    -ms-mask: url(filename.svg) 50% 50%/100px 50px no-repeat; 

background-color: red; 
background-image: url(animated.gif); 

/* Filename, Position/Size, Repeat */ 
/* Modernizr.cssmask is the test needed to pass - snippet below */ 

あなたはelementに付加することによって、ドロップシャドウを作成するためにこれを使用することができますDOMとそれよりも低いZ-インデックスと不透明度を設定したスタイリング。

希望に役立ちます!

編集:Modernizrテスト

+2

-oと-msが存在しない場合:/ – okliv

+1

これはすてきです画像がどの程度複雑であるかに応じて動作しない場合があります。すべてのブラウザでサポートされているわけではありません:http://caniuse.com/#feat=css-masks。 –

+0

Firefoxでうまくいきません.. –

6

それは、バックグラウンドのSVGを "インライン化" により、生産にプリプロセッサを使用することができる人のために実際に可能ですで操作したい部分へのアクセスを得るために、svgの全体を「スライス」するSASS mixinsのビットを使用します。あなたは、

を要素
<div class="element1"></div>を持って、あなたのオリジナルのシナリオでは

ので、あなたはあなたのためにSVGをインライン化しますmixin/functionを必要としています。あなたはそう、fillの制御したいとしましょう:

@mixin inline-svg($color, $svg-content) { 
    $start: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><style>path { fill:#{$color}; }</style>'; 
    $end: '</svg>'; 

    background-image: url('data:image/svg+xml;utf8, #{$start}#{$svg-content}#{$end}'); 
} 

$svg-content変数があなたの<svg>もの(あなたがmixinの内側からアクセスしたい)<style>要素を除くとsvgタグをラップです,,すなわち: $svg-content = "<path .... />"

これは単なる内部渡された値に含まれる必要があります。
@include inline-svg(salmon, $svg-content);

Wholおよびを合計するにはEの事がアップ、これはSASSコード例を次に示します。

$svg-content = "<path .... />" 

@mixin inline-svg($color, $svg-content) { 
    $start: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><style>path { fill:#{$color}; }</style>'; 
    $end: '</svg>'; 

    background-image: url('data:image/svg+xml;utf8, #{$start}#{$svg-content}#{$end}'); 
} 

.element1 { 
    @include inline-svg(rgba(0,0,0,0.6), $svg-content); 
} 

私はここの可能性が(制限はここでそのアプローチにもあります)かなり大きいと思います。実際にSASS mapを私のmixincssのスタイルでkeyvalueのペアに渡してcssスタイルの全体束をsvgの部分に注入します。

これは技術的には可能ですが、より多くのコンピュテイティが必要ですが、これが完了すると、プロジェクト全体でこのmixinを再利用するメリットが得られます。

+0

元のユースケースを念頭に置いていたのは、例えばUXイベントが、おそらく 'data-mode'属性を使って子SVG要素の外観を自動的に変更できるようにすることでした。要求は最小のフットプリントで相互作用を促進するために単一のSVGを使用することでした。しかし、良い仕事の例 – Jonathon

+0

@robjezこれに感謝、正確に私が必要なもの –

+0

ありがとう!それがトリックでした! – kstratis

関連する問題