2017-05-21 14 views
1

内で定義されたとき、私は私が外部を定義し、次にuseを使用してDOMの中に含まれるSVGスター持って動作します:SVGクリップパスは、同じ<svg>タグ

この場合
<svg> 
    <defs> 
    <symbol id="Star" viewBox="0 0 256 244"> 
     <polygon points="128 0 168.79 78.61 256 93.2 194 156.37 207.11 244 128 204.43 48.89 244 62 156.37 0 93.2 87.21 78.61 128 0"/> 
    </symbol> 
    </defs> 
</svg> 

<svg class="icon star" viewBox="0 0 256 244"> 
    <title>Add Favorite</title> 
    <use xlink:href="#Star"></use> 
</svg> 

を、それがあります単に本体の上部に定義されていますが、実際には外部ファイルになります。

私がしたいのは、星座を外側から埋めるように見せることです。これを行うために、私はstroke-widthトランジションを追加し、同じパスでSVGをクリップ:

*HTML* 

<svg class="icon star" viewBox="0 0 256 244"> 
    <defs> 
    <clipPath id="clip" viewBox="0 0 256 244"> 
     <polygon points="128 0 168.79 78.61 256 93.2 194 156.37 207.11 244 128 204.43 48.89 244 62 156.37 0 93.2 87.21 78.61 128 0"/> 
    </clipPath> 
    </defs> 

    <title>Add Favorite</title> 
    <use xlink:href="#Star" clip-path="url(#clip)"></use> 
</svg> 


*CSS* 

.icon { 
    margin: 50px; 
    width: 50px; 
    height: 50px; 
} 
.star { 
    fill: #0F0; 
    stroke: #F00; 
    stroke-width: 1px; 
    transition: stroke-width 200ms linear; 
} 
.star:hover { 
    stroke-width: 50%; 
} 

そして、それは御馳走に動作します!私が先頭にclipPath定義を上に移動しようとすると、ここで

<svg style="display: none;"> 
    <defs> 
    <clipPath id="clip" viewBox="0 0 256 244"> 
     <polygon points="128 0 168.79 78.61 256 93.2 194 156.37 207.11 244 128 204.43 48.89 244 62 156.37 0 93.2 87.21 78.61 128 0"/> 
    </clipPath> 
    </defs> 

    <defs> 
    <symbol id="Star" viewBox="0 0 256 244" clip-path="url(#clip)"> 
     <polygon points="128 0 168.79 78.61 256 93.2 194 156.37 207.11 244 128 204.43 48.89 244 62 156.37 0 93.2 87.21 78.61 128 0"/> 
    </symbol> 
    </defs> 
</svg> 

<svg class="icon star" viewBox="0 0 256 244"> 
    <title>Add Favorite</title> 
    <use xlink:href="#Star"></use> 
</svg> 

...それはもう動作しません...、working fiddle

しかしです。ここにはnot working fiddleがあります。

以下のuseclip-path="url(#clip)"を含めると変更はありません。同じ結果。同様に、CSS内に追加するには:

.star { 
    ... 
    clip-path: url(#clip); 
} 

これは何ですか?どのように2つのお互いに異なるのですか?もし私がならばを使ってください。しかし、理想的には、私はDOMを可能な限りきれいに保ちたいし、すべてのSVG定義を別々にするか、少なくとも一番上にまとめてください。

+0

**このトリックを行うように見えました。しかし、スタイルのないSVGの定義によって残された巨大な穴について私は何をしますか?** – Birrel

+0

うん、あなたは私をパンチに倒しました。私はちょうどそれを実行し、それをコメントに戻ってきた。勝者 - 勝者。 Thnx、Robert。 – Birrel

答えて

1

display:SVGコンテンツが関係している場合、何も避けてください。これはCSSを無効にし、クリップパスのようなものはCSSマッピングされた属性なので、もはや動作しません。

代わりにwidth = "0"とheight = "0"を使用します(または、必要に応じてCSSを使用して外側のSVGの幅と高さを設定します)。

0

ロバートロンソンは、display: noneを避けることを推奨します。

width: 0; height: 0;に置き換えると問題が解決しました。

https://jsfiddle.net/uq37cxep/12/

関連する問題