flexbox内の画像にmax-widthを指定した時に、実際の画像サイズが指定サイズより大きいとIEではみ出してしまうことがあったので対応方法をメモ。
サンプルコード
まずは上手くいかなかった例です。
<div class="wrapper"> <div class="item"> <img src="https://via.placeholder.com/800x600" alt=""> </div> <div class="item"> <img src="https://via.placeholder.com/800x400" alt=""> </div> </div>
.item内の画像はCMSからの出力で、場合によってサイズが変動する想定です。
.wrapperに対してflexboxを設定、その子要素の.itemにはmax-widthを指定して、内部の画像に合わせてサイズが変わるようにします。
img { max-width: 100%; height: auto; } .wrapper { display: flex; justify-content: center; align-items: center; max-width: 820px; margin: auto; } .item { max-width: 400px; } .item:not(:first-child) { margin-left: 20px; }
これで基本的には意図した表示にできたのですが、IEのみ画像がはみ出してしまいました。
IEでうまくいかなかった場合のデモページ
flexbox内の画像に指定するmax-widthがIEで効かないようなので、widthで固定値を指定すれば解消されました。
img { max-width: 100%; height: auto; } .wrapper { display: flex; justify-content: center; align-items: center; max-width: 820px; margin: auto; } .item { max-width: 400px; } .item:not(:first-child) { margin-left: 20px; } .item img { width: 400px; }
画像幅に固定値を指定するデモページ
画像幅が決まっている場合はこの対応で問題ないですが、今回は画像サイズが可変のため、画像サイズによっては意図しない表示になってしまいます。
色々と試してみましたが、CSSでの調整は難しそうだったので、最終的にはJavaScriptで必要に応じて画像に幅を指定するようにしました。
window.onload = function() { flexbox_img_adjust(); }; window.onresize = function() { flexbox_img_adjust(); }; // flexbox内の画像サイズの調整 function flexbox_img_adjust() { var items = document.querySelectorAll('.item'); for (var i = 0; i < items.length; i++) { var img = items[i].querySelector('img'); // .itemの最大幅を親要素から計算で算出 var itemWidth = (items[i].parentNode.clientWidth - 20) / 2; // (親要素の幅 - 要素間のマージン) / 要素数 // 画像の元サイズを取得 var imgWidth = img.naturalWidth; // .itemの最大幅とimgの実際の幅を比較 console.log(imgWidth, itemWidth); if(imgWidth > itemWidth) { // 画像の方が大きい場合はwidthを設定してはみ出ないようにする img.width = itemWidth; } } }
14行目の.itemの幅の計算は場合によって調整が必要になります。
これでIEでも意図した表示にすることができました。
JavaScriptで画像サイズを設定するデモページ
(表示確認用にHTMLのパターンを追加しています。)
コメントが承認されるまで時間がかかります。