<svg>要素を親コンテナに拡張または縮小するにはどうすればよいですか?


112

目標は、<svg>要素がその親コン​​テナのサイズに拡張さ<div>れることです。この場合は、コンテナの大きさに関係なく、です。

コード:

<style>
    svg, #container{
        height: 100%;
        width: 100%;
    }
</style>

<div id="container">
    <svg xmlns="http://www.w3.org/2000/svg" version="1.1" >
         <rect x="0" y="0" width="100" height="100" />
    </svg>
</div>

この問題の最も一般的な解決策viewBoxは、<svg>要素の属性を設定することです。

viewBox="0 0 widthOfContainer heightOfContainer"

ただし、これは、要素内の<svg>要素に事前定義された幅や高さがある場合は機能しないようです。たとえば<rect>、上のコードの要素には、幅と高さが明示的に設定されています。

したがって、明らかな解決策は、これらの要素にも幅と高さを使用することです。しかし、これは実行する必要があるのでしょうか?特に、高さや幅<img src=test.svg >を明示的に設定しても問題なく機能し、問題なく拡張/縮小し<rect>ます。

のような要素<rect>とそのような他の要素の幅と高さをパーセンテージで定義する必要がある場合、Inkscapeでそれを設定して、<svg>ドキュメントのすべての要素が固定サイズの代わりにパーセンテージの幅、高さなどを使用するようにする方法があります。 ?


1
<img src = "file.svg" />のように画像として参照するのではなく、svgをファイルとして保存します。これにより、width:100%またはheight:100%を使用できます
Burimi

回答:


56

これviewBoxはコンテナの高さではなく、図面のサイズです。あなたの定義viewBoxあなたを定義し、その後、幅になるように100単位をrect10個の単位であることを。その後、SVGをどれだけ大きくしてrectも、画像の幅の10%になります。


33
しかし、問題は、SVGをどのようにスケーリングするかです。
エイドリアンハイネ2012年

6
@AdrianLang問題のコードで既に行われているように、SVGオブジェクトにサイズを設定すると、スケーリングが自動的に行われます。 これは例の修正バージョンです
robertc 2012年

あなたは正しい、素晴らしい、それは実際に私のために働く。私の問題は、svgルート要素の高さと幅のプロパティにあったと思います。
エイドリアンハイネ

2
私はそのフィドルにいくつかのマイナーな微調整を行って、縦横比を維持せずにサイズ変更を水平および垂直に強制し、IEで機能させましたが、提出されたフィドル@robertcはそうではありませんでした。それが将来の誰かを助けることを願っています!
ミスタークリムゾン

3
デフォルトでは、svgは可能な限り拡大され、完全に表示されますが、アスペクト比は保持されます(したがって、正方形のviewBoxが長方形の親を完全に埋めることはありません)。親コンテナを完全にカバーするように強制したい場合は、SVG要素にpreserveAspectRatio = "none"を追加します。
patricksurry

24

次のようなSVGがあるとします。 pic1

そして、私はそれをdivに入れて、応答的にdivを満たすようにしたいと思います。私のやり方は次のとおりです:

まず、SscapeのようなアプリケーションでSVGファイルを開きます。File-> Document Propertiesで、ドキュメントの幅を800pxに、高さを600pxに設定します(他のサイズを選択できます)。次に、SVGをこのドキュメントに適合させます。

pic2

次に、このファイルを新しいSVGファイルとして保存し、このファイルからパスデータを取得します。HTMLで、魔法を行うコードは次のとおりです。

<div id="containerId">    
    <svg
    id="svgId" 
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
    version="1.1"
    x="0"
    y="0"
    width="100%"
    height="100%"
    viewBox="0 0 800 600"
    preserveAspectRatio="none">
       <path d="m0 0v600h800v-600h-75.07031l-431 597.9707-292.445315-223.99609 269.548825-373.97461h-271.0332z" fill="#f00"/>
    </svg>
</div>

SVGの幅と高さは両方とも100%に設定されていることに注意してください。これは、コンテナーを垂直方向と水平方向に埋めるためですが、viewBoxの幅と高さは、インクスケープ内のドキュメントの幅と高さ(800px X)と同じです。 600px。次に、preserveAspectRatioを "none"に設定する必要があります。この属性に関する詳細情報が必要な場合は、こちらのリンクをクリックしてください。これですべてです。

もう1つは、このコードが古いブラウザーを含むほとんどすべての主要ブラウザーで機能することですが、androidとiosの一部のバージョンでは、一貫性を保つためにjavascrip / jQueryコードを使用する必要があります。私はドキュメントの準備とリサイズ機能で以下を使用します:

$('#svgId').css({
    'width': $('#containerId').width() + 'px',
    'height': $('#containerId').height() + 'px'
});

それが役に立てば幸い!


5
preserveAspectRatioノートの+1。SVGを実際にdivに(スケールではなく)伸ばすために高低を探した後、これは正解でした。
adelphus

@Gazoris、この素晴らしい答えをありがとう。同じで質問があります。svgがネストされている場合はどうなりますか?たとえば、<svg> <svg id = "1"> </ svg> <svg id = "2"> </ svg> </ svg>条件付きでsvg 1と2を表示したいので、幅と高さを取る必要がありますコンテナの。<div id = "container" style = "width:200px; height:200px;"> </ div>お願いします。
Prasad Parab 2016

@Reza Baradaran:天才。
DanMad 2018年

6

私にとって最近うまくいったのは、タグとすべての子タグからすべてheight=""width=""属性を削除すること<svg>です。次に、親コンテナの高さまたは幅の割合を使用してスケーリングを使用できます。


5
実用的な例を挙げられますか?これで何もできません。
マイケル

2

@robertcは、右のそれを持っていますが、あなたはまた、通知に必要なsvg, #containerSVGは何のために指数関数的に拡大縮小されますが、100%(のために一度#containerとのために一度svg)。

つまり、両方の要素に50%h / wを適用した場合、実際には50%の50%、つまり.5 * .5であり、これは.25、つまり25%スケールに相当します。

@robertcが示すように使用すると、1つのセレクターが正常に機能します。

svg {
  width:50%;
  height:50%;
}

あなたの選択だからですsvg, #containerマッチは両方のsvg DOM要素#container DOM要素。代わりにを探していたと思いますがsvg #container、とにかくIDを使用している場合は、親の指定は必要ありません。
2014年

「#containerの場合は1回、svgの場合は1回」と私が言ったことは正確ではありませんか?
Justin Putney 14年

1
失礼ですが、あなたの答えは少し奇妙な言葉遣いで誤解を招きます。最初は潜在的な落とし穴について話しているように聞こえます。
2014年

1

あなたのiPhoneのためにあなたはあなたの頭のbaliseで使用することができます:

"width=device-width"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.