画像のアスペクト比を維持しながら、どのように画像をストレッチして<div>を埋めますか?


201

この画像をオーバーフローさせ<div>たり、画像を歪ませたりせずに、可能な限り最大サイズに拡大する必要があります。

画像のアスペクト比を予測できないため、使用するかどうかを知る方法はありません。

<img src="url" style="width: 100%;">

または

<img src="url" style="height: 100%;">

両方に使用することはできません(つまり、style = "width:100%; height:100%;")。これは、画像をに合わせて引き伸ばすためです<div>

<div>サイズは画面のパーセンテージで設定されますが、これも予測できません。


2
画像の高さまたは幅をdivの対応する寸法に合わせる必要がある場合は、javascriptを使用することしか考えられません。それはあなたが探求したいものですか?
2009

回答:


189

2016年更新:

最新のブラウザははるかによく動作します。画像の幅を100%に設定するだけです(デモ)。

.container img {
   width: 100%;
}

アスペクト比がわからないため、スクリプトを使用する必要があります。ここに私がjQuery(デモ)でそれをする方法があります:

CSS

.container {
    width: 40%;
    height: 40%;
    background: #444;
    margin: 0 auto;
}
.container img.wide {
    max-width: 100%;
    max-height: 100%;
    height: auto;
}
.container img.tall {
    max-height: 100%;
    max-width: 100%;
    width: auto;
}​

HTML

<div class="container">
 <img src="http://i48.tinypic.com/wrltuc.jpg" />
</div>
<br />
<br />
<div class="container">
 <img src="http://i47.tinypic.com/i1bek8.jpg" />
</div>

脚本

$(window).load(function(){
 $('.container').find('img').each(function(){
  var imgClass = (this.width/this.height > 1) ? 'wide' : 'tall';
  $(this).addClass(imgClass);
 })
})

ユーザーはサイズ変更前の画像を見ることができますか?誰かこれをテストしましたか?
RayLoveless、2011

解決策はほぼ正しく、CSSで高さと幅を反転させるだけです。画像が「背が高い」場合、幅は高さではなく100%になります(どちらかが大きくなり、オーバーフローします)。幅の広い写真の場合はその逆です。
mbritto

@mbritto:そうです、cssをmax-width / heightに変更する必要があり、デモ
Mottie

@Mottieは、画質を失うことなく、幅930 pxの画像を960 pxのコンテナーに合わせる方法があります
Vivek Dragon

15
なぜこれが受け入れられた答えなのか。問題は、コンテナに対して画像が小さすぎることです。つまり、画像を縦横比を変えずに、コンテナの幅または高さに合わせて拡大する方法を教えてください。また、デモでwidth:autoまたはheight:autoプロパティを削除しても、画像の表示には影響しません。実際のところ、画像に適用しているすべてのプロパティの中で、max-width: 100%まったく効果がなく、横向きの画像にのみ効果があります。しかし、最も重要なのは、あなたの答えは小さな画像を引き伸ばして大きなコンテナーを埋めるのに役立ちません。
マット2015

78

CSSand のみを使用してこれを行う簡単な方法がありますHTML

HTML:

<div class="fill"></div>

CSS:

.fill {
    overflow: hidden;
    background-size: cover;
    background-position: center;
    background-image: url('path/to/image.jpg');
}

これにより、画像が背景になり、div歪みなくサイズに合わせて拡大されます。


これは未定義の画像数で可能ですか?
TrtG 2016

background-size: cover;これが本当の魔法であり、CSS3ですが、最近のバージョンでは妥当なブラウザサポートがあります(参照:w3schools.com/cssref/css3_pr_background-size.asp
Jon Kloske

1
それは別のスタイルと内容に順番にHTMLで画像のURLを含む価値、すなわちかもしれない<div style="background-image: url('path/to/image.jpg');" class="fill"></div>
binaryfunt

background-size: cover アスペクト比を維持しないため、要素に比例しない画像の部分はトリミングされます。ここを
Alex_Zhong

@Alex_Zhong、あなたはアスペクト比を誤解しています。アスペクト比とは、画像がどの方向にも引き伸ばされないことを意味します(そのため、真円は幅も高さも楕円形にはなりません)。トリミングは、アスペクト比を維持するために必要な部分です(OPのユースケースと同様)。
Jeremy Moritz

70

完璧なソリューションではありませんが、このCSSが役立つ場合があります。ズームはこのコードを機能させるものであり、小さな画像に理想的に機能するには、理論的には係数が無限でなければなりません。ただし、ほとんどの場合、2、4、または8で正常に機能します。

#myImage {
    zoom: 2;  //increase if you have very small images

    display: block;
    margin: auto;

    height: auto;
    max-height: 100%;

    width: auto;
    max-width: 100%;
}

1
これがFirefoxで機能することを願っています。なぜzoomFirefoxからの愛がない!?
2015

1
Firefoxはまだzoom実装されていませんが、今後の参照用のバグリンクがあります:bugzilla.mozilla.org/show_bug.cgi
Adam Taylor

31

可能であれば、背景画像を使用して設定します background-size: coverます。これにより、背景が要素全体を覆います。

CSS

div {
  background-image: url(path/to/your/image.png);
  background-repeat: no-repeat;
  background-position: 50% 50%;
  background-size: cover;
}

インライン画像の使用に困っている場合は、いくつかのオプションがあります。まず、

オブジェクトフィット

このプロパティは、画像、ビデオ、およびその他の同様のオブジェクトに作用します background-size: cover

CSS

img {
  object-fit: cover;
}

悲しいことに、ブラウザーのサポートは、バージョン11までのIEではまったくサポートされていないため、それほど優れていません。次のオプションはjQueryを使用します

CSS + jQuery

HTML

<div>
  <img src="image.png" class="cover-image">
</div>

CSS

div {
  height: 8em;
  width: 15em;
}

カスタムjQueryプラグイン

(function ($) {
  $.fn.coverImage = function(contain) {
    this.each(function() {
      var $this = $(this),
        src = $this.get(0).src,
        $wrapper = $this.parent();

      if (contain) {
        $wrapper.css({
          'background': 'url(' + src + ') 50% 50%/contain no-repeat'
        });
      } else {
        $wrapper.css({
          'background': 'url(' + src + ') 50% 50%/cover no-repeat'
        });
      }

      $this.remove();
    });

    return this;
  };
})(jQuery);

このようなプラグインを使用します

jQuery('.cover-image').coverImage();

画像を取得し、画像のラッパー要素の背景画像として設定し、 imgし、ドキュメントからタグします。最後に、あなたは使うことができました

純粋なCSS

これをフォールバックとして使用できます。画像は、コンテナをカバーするように拡大されますが、縮小されません。

CSS

div {
  height: 8em;
  width: 15em;
  overflow: hidden;
}

div img {
  min-height: 100%;
  min-width: 100%;
  width: auto;
  height: auto;
  max-width: none;
  max-height: none;
  display: block;
  position: relative;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

これが誰か、幸せなコーディングに役立つことを願っています!


background-image&background-sizeを使用せずに画像が特定のコンテナー埋める純粋なCSSソリューションを探していましたが、ここのCSSコードは> = IE9および最新のブラウザーに最適です。CodePenデモはこちら
FLOQ Design

ピュアCSS、私は削除min-、変更するwidth: 100%; height: 100%;と仕事!素晴らしいソリューション!+1ありがとうございます!
Guilherme Nascimento

1
background-size: containまた、どの画像もクリップされないようにする場合にも役立ちます。
Ponkadoodle 2017

zoom:0.001純粋なCSSソリューションに追加してスケールダウンできます。
Ivor Zhou


12

2019を更新します。

これでobject-fit、次の値を受け入れるcssプロパティを使用できます。fill | contain | cover | none | scale-down

https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit

例として、画像を保持するコンテナがあるとします。

<div class="container">
    <img src="" class="container_img" />
</div>

.container {
    height: 50px;
    width: 50%;

.container_img {
    height: 100%;
    width: 100%;
    object-fit: cover;

7

これは、HTMLとCSSだけでは不可能であり、少なくとも非常にエキゾチックで複雑です。あなたがいくつかのJavaScriptを入れても構わないと思っているなら、jQueryを使った解決策があります:

$(function() {
    $(window).resize(function() {
        var $i = $('img#image_to_resize');
        var $c = $img.parent();
        var i_ar = $i.width() / $i.height(), c_ar = $c.width() / $c.height();            
        $i.width(i_ar > c_ar ? $c.width() : $c.height() * (i_ar));
    });
    $(window).resize();
});

これにより、サイズに関係なく、常に親要素内に収まるように画像のサイズが変更されます。そしてそれがにバインドされているように$(window).resize()イベントにユーザーがウィンドウのサイズを変更すると、画像が調整されます。

これはコンテナ内の画像を中央に配置しようとするものではありませんが、それはあなたが望んでいることではないと思います。


4
$ img.parent(); 本当に$ i.parent();
神保ジョニー

5

外側のcontainerdivの幅と高さを設定します。次に、imgの以下のスタイリングを使用します。

.container img{
    width:100%;
    height:auto;
    max-height:100%;
}

これは、imgのアスペクト比を維持するのに役立ちます


6
それはdivを埋めません。
Sven van den Boogaart 2014

5

画像のアスペクト比を維持しながら最大幅または最大高さを設定したい場合は(あまり大きくならないように)、次のようにします。

img{
   object-fit: contain;
   max-height: 70px;
}

4

私は模擬問題を探しているこの質問に出くわしました。レスポンシブデザインのウェブページを作成しています。ページに配置される要素の幅は、画面の幅のパーセントに設定されています。高さはvw値で設定されます。

PHPとデータベースバックエンドを使用して投稿を追加しているので、純粋なCSSは問題外でした。しかし、jQuery / javascriptソリューションは少し厄介だと思ったので、きちんとした(少なくとも自分自身だと思う)ソリューションを思いつきました。

HTML(またはphp)

div.imgfill {
  float: left;
  position: relative;
  background-repeat: no-repeat;
  background-position: 50%  50%;
  background-size: cover;
  width: 33.333%;
  height: 18vw;
  border: 1px solid black; /*frame of the image*/
  margin: -1px;
}
<div class="imgfill" style="background-image:url(source/image.jpg);">
  This might be some info
</div>
<div class="imgfill" style="background-image:url(source/image2.jpg);">
  This might be some info
</div>
<div class="imgfill" style="background-image:url(source/image3.jpg);">
  This might be some info
</div>

style = ""を使用することで、PHPでページを動的に更新することが可能になり、CSSスタイル設定とstyle = ""を組み合わせることで、完全に覆われた画像になり、動的なdivタグをカバーするようにスケーリングされます。



4

この画像をオーバーフローせずに可能な最大サイズに拡大するにはたり、画像を歪めたりする

適用...

img {
  object-fit: cover;
  height: -webkit-fill-available;
}

画像のスタイル。


3

この方法を使用すると、divと画像の比率を変化させる画像をdivに入力できます。

jQuery:

$(window).load(function(){
   $('body').find(.fillme).each(function(){
      var fillmeval = $(this).width()/$(this).height();
      var imgval = $this.children('img').width()/$this.children('img').height();
      var imgClass;
      if(imgval > fillmeval){
          imgClass = "stretchy";
      }else{
          imgClass = "stretchx";
      }
      $(this).children('img').addClass(imgClass);
   });
});

HTML:

<div class="fillme">
   <img src="../images/myimg.jpg" />
</div>

CSS:

.fillme{
  overflow:hidden;
}
.fillme img.stretchx{
  height:auto;
  width:100%;
}
.fillme img.stretchy{
  height:100%;
  width:auto;
}

3

これは私のためのトリックをしました

div img {
    width: 100%;
    min-height: 500px;
    width: 100vw;
    height: 100vh;
    object-fit: cover;
}

2

IMGタグを使用する場合、それは簡単です。

私はこれを作りました:

<style>
        #pic{
            height: 400px;
            width: 400px;
        }
        #pic img{
            height: 225px;               
            position: relative;
            margin: 0 auto;
        }
</style>

<div id="pic"><img src="images/menu.png"></div>

$(document).ready(function(){
            $('#pic img').attr({ 'style':'height:25%; display:none; left:100px; top:100px;' })
)}

#pic {background:url(img / menu.png)} Enyoneで動作させる方法が見つかりませんでしたか?ありがとう


変更を加え、私の問題に対する答えを見つけました!いいえ、それは誰かを助けるでしょう。background-image:url(images / menu.png); background-repeat:no-repeat; 位置:絶対; background-size:300px; 高さ:100%; 幅:100%; javascriptまたはjqueryを使用してbackground-sizeの値を変更できます(.attr({'style': 'background-size:150px auto; left:50px; top:50px;'}))
aleXela

2

同様の問題がありました。CSSだけで解決しました。

基本的にObject-fit: coverは、div内に画像を配置しながら、アスペクト比を維持するタスクを達成するのに役立ちます。

しかし問題は Object-fit: cover IEで機能しておらず、100%の幅と100%の高さをとっていて、アスペクト比が歪んでいました。つまり、クロムで見たような画像のズーム効果はありませんでした。

私が取ったアプローチはして容器内の画像を配置した 絶対、その後、中央で右のそれを置くの組み合わせを使用しました:

position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);

それが中央に来たら、私はイメージに与えます、

// For vertical blocks (i.e., where height is greater than width)
height: 100%;
width: auto;

// For Horizontal blocks (i.e., where width is greater than height)
height: auto;
width: 100%;

これにより、画像はObject-fit:coverの効果を得ます。


上記のロジックのデモを以下に示します。

https://jsfiddle.net/furqan_694/s3xLe1gp/

このロジックはすべてのブラウザで機能します。


1

HTML:

<style>
#foo, #bar{
    width: 50px; /* use any width or height */
    height: 50px;
    background-position: center center;
    background-repeat: no-repeat;
    background-size: cover;
}
</style>

<div id="foo" style="background-image: url('path/to/image1.png');">
<div id="bar" style="background-image: url('path/to/image2.png');">

JSFiddle

...画像を設定または変更する場合(例として#fooを使用):

jQuery:

$("#foo").css("background-image", "url('path/to/image.png')");

JavaScript:

document.getElementById("foo").style.backgroundImage = "url('path/to/image.png')";

1

ここにあるソリューションの多くにはいくつかの制限があります:IE(オブジェクトフィット)または古いブラウザで機能しないもの、他のソリューションは画像を拡大しない(縮小するだけ)、多くのソリューションはウィンドウのサイズ変更をサポートせず、多くは一般的ではない、修正解像度またはレイアウト(縦または横)が必要

javascriptとjqueryの使用が問題でない場合、@ Tatu Ulmanenのコードに基づいたこの解決策があります。いくつかの問題を修正し、画像が動的に読み込まれ、最初から利用できない場合に備えて、いくつかのコードを追加しました。基本的には、2つの異なるcssルールを作成し、必要に応じて適用するというものです。1つは制限が高さである場合、側面に黒いバーを表示する必要があり、もう1つは制限が幅である場合、cssルールである必要があります。上部/下部に黒いバーを表示します。

function applyResizeCSS(){
    var $i = $('img#imageToResize');
    var $c = $i.parent();
    var i_ar = Oriwidth / Oriheight, c_ar = $c.width() / $c.height();  
    if(i_ar > c_ar){
        $i.css( "width","100%");
        $i.css( "height","auto");          
    }else{
        $i.css( "height","100%");
        $i.css( "width","auto");
    }
}   
var Oriwidth,Oriheight;
$(function() {
    $(window).resize(function() {
        applyResizeCSS();
    });

    $("#slide").load(function(){
        Oriwidth  = this.width,
        Oriheight = this.height; 
        applyResizeCSS();
    }); 

    $(window).resize();
}); 

次のようなHTML要素の場合:

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