質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
SVG

SVGは、XMLを基盤とした2Dベクター画像記述言語。画像を線・面といった図形の集合体として扱うベクター画像のため、環境に適した表示が可能です。アニメーション機能もサポートされており、簡単なインタラクティブコンテンツ作成もできます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

3024閲覧

useで読み込んだSVG画像に余白が表示されてしまう

brsice

総合スコア17

SVG

SVGは、XMLを基盤とした2Dベクター画像記述言語。画像を線・面といった図形の集合体として扱うベクター画像のため、環境に適した表示が可能です。アニメーション機能もサポートされており、簡単なインタラクティブコンテンツ作成もできます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2020/03/19 05:26

編集2020/03/20 20:33

前提・実現したいこと

当初インラインだったSVGをuseタグを用いて表示することになったのですが、同じCSSを指定してもレイアウトが崩れてしまいます。
SVGをuseで読み込んだ部分にCSSを適用したい
こちらの質問・回答を読ませて頂き、fillが正しく設定されるのは分かったのですが、レイアウトが崩れる原因は分かりませんでした。

発生している問題・エラーメッセージ

レイアウトが崩れる原因となっている要素のコードを載せます。
画像はCodePenで実行した結果です。
期待する結果は、1つ目のように、heightのみを指定すればwidthはアスペクト比を維持するように設定されるというものです。
しかしuseを用いると、画像自体のアスペクト比は維持できているものの、親要素いっぱいまで余白が設定されてしまいます。

実行結果

該当のソースコード

HTML

1<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> 2 <symbol viewBox="0 0 10 10" id="circle"> 3 <circle cx="5" cy="5" r="5"/> 4 </symbol> 5</svg> 6 7<div class="box"> 8 <p>TEXT</p> 9 <svg class="circle" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10"> 10 <circle cx="5" cy="5" r="5"/> 11 </svg> 12</div> 13 14<div class="box"> 15 <p>TEXT</p> 16 <svg> 17 <use class="circle" xlink:href="#circle"></use> 18 </svg> 19</div>

CSS

1.box { 2 display: flex; 3 width: 300px; 4 height: 50px; 5 border: 1px solid black; 6} 7 8.circle { 9 fill: red; 10 height: 100%; 11 width: auto; 12}

解決策

useだと余白が発生してしまう明確な原因というのは分かりませんでしたが、viewBoxを与えれば意図通りに表示されることが分かったので解決とさせていただきます。
Reactを使用しているので、SVGからuseにidとviewBoxをセットにしたコンポーネントを作成して使用することにしました。
お二方ともありがとうございました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marlboro_tata

2020/03/19 13:36

既に回答もついていて、かつ、あまり明確な答えを示せないのでここに書くのですが、 <use>useで使う時のsvgには明示的な高さと幅が必要、という印象です。 <use>を使う時に、元の<svg>は「シャドウコンテンツ(#shadow-root (closed))」という(これがよくわかってないのですが)どうもなんか特殊なDOMになるみたいです。 シャドウコンテンツで表示されている要素が、ブラウザにもよると思いますが、width=100% や height=100% という高さや幅を持っていることがあるようです。(MacOSのSafariはそうでした) さらに、<svg>という要素は、ブラウザによってデフォルトCSSの display: 値; が異なるようです。 なので、明示的に幅を与えない限り、振る舞いが定まらないのでは?という気がします(根拠は弱いのですが)。 viewBox="" は、多分、その代わりとして機能するんだと思いますが、それでも、CSSで高さか幅を与えないと、うまく表示されなかったです。 検証→ https://codepen.io/ccc-labo/pen/RwPBNjR
brsice

2020/03/20 20:32 編集

回答ありがとうございます。 useは一般的な参照を用いて表示しているという感覚で、通常のインラインSVGと同じように使用できると思っていたのですが、思ったよりも複雑なようですね。 displayの件も知りませんでした。勉強になります。 CodePenのコードも参考にさせて頂きます。
guest

回答1

0

ベストアンサー

viewBox="0 0 10 10"の有無を揃えて、class="circle"の位置を変更すると見た目を揃えることはできました。
(id="circle"<symbol>だけに指定するようにもしています。)

useを用いるとレイアウトが崩れるというよりviewBox="0 0 10 10"を指定しないとレイアウトが崩れるのではないか、と思います。

<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <symbol id="circle" viewBox="0 0 10 10"> <circle cx="5" cy="5" r="5"/> </symbol> </svg> <div class="box"> <p>TEXT</p> <svg class="circle" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10"> <circle cx="5" cy="5" r="5"/> </svg> </div> <div class="box"> <p>TEXT</p> <svg class="circle" viewBox="0 0 10 10"> <use xlink:href="#circle"></use> </svg> </div>

イメージ説明

投稿2020/03/19 06:28

編集2020/03/19 06:33
new1ro

総合スコア4528

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

brsice

2020/03/19 07:13

回答ありがとうございます。 こちらでも正常に表示されることを確認しました。 しかし、useにもviewBoxが必要であるというのが気になります。 今回初めてSVGスプライトを使用したので色々と調べながらだったのですが、SVG本体を一箇所で管理しidのみで簡単に呼び出せるのは大きな利点の一つだと理解しています。 それなのに呼び出す度にオリジナルのviewBoxの値が必要というのは奇妙に感じます。 一般的にはuseを用いるもっと効率的な方法があるのでしょうか?
new1ro

2020/03/20 23:35

もしかしたら方法があるのかもしれませんが、 こちらではまだ把握できていません..。 ただ、CSSでサイズは指定する前提だと、以下のように縦横比だけをしっかり定義できたら動きはしました。 <svg class="circle" viewBox="0 0 10 10"> <svg class="circle" viewBox="0 0 1000 1000"> <svg class="circle" viewBox="0 0 64 64">
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問