2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[IE、Edge対応]imgをbackgroud-sizeのようにトリミング、拡大縮小できるobject-fitにできないこと

Last updated at Posted at 2019-10-19

できないこととタイトルには書きましたが、正確には少し調整すればできます。

img要素をbackgroud-sizeのように表示させられるobject-fitについて。
IEやEdgeでは対応していないため、object-fit-images というJSで補ってあげる必要があります。

object-fitの詳しい実装方法はWebクリエイターボックスの以下の記事を参考にしてください。
1行追加でOK!CSSだけで画像をトリミングできる「object-fit」プロパティー

IE、Edgeでできないこと

画像をJSなどでDOM生成する場合などは実装することができません。
例えばモーダルのギャラリーなどがありますが、
img要素をフロント側で生成する場合はIEやEdgeでは動作しません。

object-fit-imagesはbackgroud-sizeで代替している

object-fit-imagesはIE、Edgeではbackgroud-sizeで代替する仕組みで、
DOMが読み込まれた後にobject-fit-imagesの関数が実行され、
srcを取得してbackgroud-imageに置き換えている。

そのためJSなどでimgを生成もしくはsrcを変更している仕組みではobject-fit-imagesは使えません。
もしobject-fitのような動きにしたいなら最初からbackgroud-sizeで指定するのも良いかもしれません。

html
<div class="imgWrap" style="backgroud-image: url('[JSで生成]');">
  <img class="img" src="ダミー" alt=""> ← 高さや幅を保持する用
</div>
css
.imgWrap {
  background-size: contain;
  background-position: 50% 0; ←拡大縮小の基準値
  background-repeat: no-repeat;
}

画像を生成した際にobject-fit-imagesの関数を都度読込すれば良いのかもと思ったので、やってみてできるかできないかは、また追記します。

追記(2019.10.19)

生成した後にobject-fit-imagesの関数を実行すれば問題なく動作しました。
(細かい記述は省いてます)
こちらのほうが記述としては簡単。

javascript
const _createElement = () => {
  画像生成の記述は省略
  //画像生成した後に↓ クラス名は生成したと分かる名前に
  objectFitImages('img.create-object-fit-img');
};

まとめ

  • object-fit-imagesはIE、Edge用のポリフィル
  • object-fit-imagesはbackgroud-sizeで代替している
  • imgをフロント側で生成、変更している場合はimg要素生成後にobjectFitImages()を都度実行する
  • object-fitを使わない場合はbackgroud-sizeで対応する(レスポンシブがめんどくさい)

以上。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?