IE9/10/11には既知の問題があり、<svg>
要素が幅と高さを指定するSVGファイルがあり、width
とheight
を使用してSVG画像をスケーリングする場合<img>
タグの属性、IEは画像を適切にスケーリングしません。
この問題に遭遇しました。一連のSVGフラグアイコンがあります。 USフラグアイコンの場合、SVGオブジェクトは次のように記述されます。
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="480" width="640">
<!-- elements to draw flag .. -->
</svg>
SVGを<img>
タグを使用してHTMLドキュメントに挿入し、20x15に縮小します。
Chrome39では、SVGは次のように適切にレンダリングされます。
しかし、IE10では、次のようにレンダリングされます。
ですから、ここで起こっているように見えるのは、IE10が<img>
要素を20x15にサイズ変更しても、SVGを縮小しないためです-フラグアイコンの左上隅だけが表示されます。普通の青い箱として。
さて...これは 文書化されたソリューション の既知の問題のようです。 1つの解決策は、SVGファイル内のwidth
およびheight
属性をすべて削除することです。実際の設計を台無しにしたくないので、これは少し危険なようです。また、SVGファイルがたくさんある場合は、少し面倒です-ファイルを処理するためにより多くのスクリプトが必要です。
より良い解決策は、CSSを使用してIE10のSVG要素を明確にターゲットにすることです。これは明らかにベンダー固有のメディアクエリを使用して可能です。
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
img[src*=".svg"] {
width: 100%;
}
}
わかりましたが、この解決策がわかりません。上記を試してみると、IE10は親コンテナー全体を埋めるようにSVGのサイズを単純に拡張しますが、これは私が望むものではありません。わかりましたので、SVGの幅を100%に設定してから親コンテナのサイズを制限することで、IEでSVGを強制的にスケーリングできます。そこで、幅と高さが20x15のDIVで<img>
をラップしました。しかし...その結果、以前と同じ問題が発生しました。コンテナDIVは20x15に固定されていますが、SVGは縮小しません。したがって、最終的には、フラグの左上隅が以前のようになります。
...そのため、このソリューションについて何かを理解していないのでしょう。 IE10/11でフラグアイコンを20x15に縮小するにはどうすればよいですか?
これは、画像にviewBox
要素のsvg
属性がない場合に発生します。
0 0 640 480
に設定する必要があります。ゼロはXとYのオフセットで、640と480は幅と高さに対応します。画像の境界を表す長方形を定義します。
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="480" width="640" viewBox="0 0 640 480">
SVGタグ行から高さと幅を取り出します。
IE9、IE10、およびIE11は、viewBox、widthおよびheight属性が指定されている場合、imgタグで追加されたSVGファイルを適切にスケーリングしません。
この問題は、width
およびheight
属性のみを削除し、CSSのみで操作することで解決できます。
img[src*=".svg"] {
width: 100%;
}
注:IE11にSVGをインラインで配置する場合、CSSを使用してSVGタグの幅を100%に設定するとともに、SVGタグにwidth属性とheight属性が必要です。正しくスケーリングします。
これは、同じ問題を修正するために書かなければならなかったノードスクリプトです(多数のSVGがあるフォルダーの場合)。
'use strict'
const fs = require('fs')
fs.readdir(`./`, (err, flist) => {
if (typeof flist != 'undefined') {
flist.forEach((file, i) => {
proceed(file)
})
}
})
function proceed(file){
fs.readFile(`./${file}`, 'utf8', (err,svg) => {
let out = svg.replace('<svg', '<svg viewBox="0 0 640 480" ')
if (!svg.includes('viewBox')){
fs.writeFile(file, out, err => {
if(err) {
console.log(err);
} else {
console.log("Saved: " + file);
}
})
}
})
}