「div」コンテナに合わせて画像のサイズを自動変更するにはどうすればよいですか?


1513

幅の高さの比率を維持しながら、小さな画像を小さな幅のdivコンテナーに収まるように、大きな画像をどのように自動サイズ変更しますか?


例:stackoverflow.com-画像がエディターパネルに挿入され、画像が大きすぎてページに収まらない場合、画像は自動的にサイズ変更されます。


コンテナーに合うように画像のサイズ変更を行うためのいくつかの興味深いライブラリ:* plugins.jquery.com/project/myimgscale * code.google.com/p/jquery-imagefit-plugin
Frosty Z

@Kevinの回答は別として... ImageBossなどのサービスを使用して、必要なサイズでオンデマンドで画像を作成することもできます。コンテナーに画像を合わせるのは素晴らしいことですが、画像をレスポンシブに提供するのは非常に難しい作業です。
Igor Escobar


@jolumg不正解です。一部のソリューションでは多くの重複が存在しますが、互換性のない多くのソリューションもあります。これは、画像を拡大する方法を求めているのに対し、これは画像を縮小することを求めているためです。
TylerH

1
001-これは、私が見る前に閉じられたという質問に対する回答です。親コンポーネントから子コンポーネントを呼び出す方法。私は、コンポーネント、インターフェイスを使用して通信させる方法を説明するブログ記事を書いた:datajugglerblazor.blogspot.com/2020/01/...
データジャグラー

回答:


1876

画像タグに明示的な幅または高さを適用しないでください。代わりに、それを与えます:

max-width:100%;
max-height:100%;

また、height: auto;幅のみを指定したい場合。

例:http : //jsfiddle.net/xwrvxser/1/

img {
    max-width: 100%;
    max-height: 100%;
}

.portrait {
    height: 80px;
    width: 30px;
}

.landscape {
    height: 30px;
    width: 80px;
}

.square {
    height: 75px;
    width: 75px;
}
Portrait Div
<div class="portrait">
    <img src="http://i.stack.imgur.com/xkF9Q.jpg">
</div>

Landscape Div
<div class="landscape">
    <img src="http://i.stack.imgur.com/xkF9Q.jpg">
</div>

Square Div
<div class="square">
    <img src="http://i.stack.imgur.com/xkF9Q.jpg">
</div>


40
これは高さと幅の両方をスケーリングしません。
Neil

75
高さ:自動; 幅のみを指定する場合
Roi

82
画像が小さすぎる場合はどうなりますか?
Scott Rippey 2013年

18
@Scott Rippey-画像がコンテナーよりも小さい場合、使用されるルールはmax-widthおよびmax-heightであるため、変更されません。
Surreal Dreams

15
囲み<a>タグを使用すると、画像のサイズが変更されませんでした。ルールをAタグに適用すると、この問題は解決しました。
SPRBRN 2014年

433

オブジェクトフィット

これを行う別の方法があることがわかりました。

<img style='height: 100%; width: 100%; object-fit: contain'/>

仕事をします。それはCSS 3のものです。

フィドル:http : //jsfiddle.net/mbHB4/7364/


39
これにより、画像が拡大されてコンテナ内の大きな寸法に完全に収まるため、小さな寸法で完全にカバーできない場合があります。代わりに、より大きな次元をトリミングするには、次を使用しますobject-fit: cover
Gabriel Grant

4
私のために働いた-@KevinDの解決策と比較して-これはエッジケースの比率を変えていません。乾杯!
Barnabas Kecskes 2015年

9
完全にサポートされると素晴らしいでしょう。Atm、残念ながらIEもEdgeもサポートしていません。
スペクトル

2
max-widthとmax-heightを設定したい場合は、それを行うことができます。完璧に動作します。
Sandip Subedi 2017年

3
IE11とエッジ14/15では使用できないようです-> caniuse.com/#search=object-fit
mcorbe

106

現在、これを確定的な方法で正しく行う方法はありません。JPEGやPNGファイルなどの固定サイズのイメージでは。

画像を均等にサイズ変更するには、高さまたは幅のいずれかを「100%」に設定する必要がありますが、両方に設定する必要はありません。両方を「100%」に設定すると、画像が引き伸ばされます。

高さと幅のどちらを選択するかは、画像とコンテナのサイズによって異なります。

  1. 画像とコンテナの両方が「縦長の形状」または「横長の形状」(幅よりも高い、または高さよりも幅が広い)の場合、高さと幅のどちらが「%100」であるかは関係ありません。 。
  2. 画像が縦向きで、コンテナが横向きの場合はheight="100%"、画像に設定する必要があります。
  3. 画像が横向きで、コンテナが縦向きの場合はwidth="100%"、画像に設定する必要があります。

画像が可変サイズのベクター画像形式であるSVGの場合、コンテナに合わせて自動的に拡張することができます。

SVGファイルの<svg>タグにこれらのプロパティが設定されていないことを確認する必要があります。

height
width
viewbox

そこにあるほとんどのベクター描画プログラムはSVGファイルをエクスポートするときにこれらのプロパティを設定するため、エクスポートするたびにファイルを手動で編集するか、それを行うスクリプトを作成する必要があります。


2
それは私だけですか、この投稿にいくつかの間違いがありますか?「「縦長の形」または「横長の形」の両方(それぞれ縦長よりも横長、高さよりも高い)」...「対応関係」を切り替えないでください。また、箇条書きの2.と3.では、どちらも「画像にwidth = "100%"を設定する必要がある」と述べています。コピーして貼り付け、そのうちの1つを「幅」ではなく「高さ」に変更するのを忘れたようです。
バトルButkus

修正しました。2と3は、どちらかが間違っているか、どちらが正しいかではなく、両方が間違っているか、両方が正しい可能性があります。正解が何なのか思い出せません。;)
Neil

2
「現在、JPEGやPNGファイルなどの固定サイズの画像では、これを確定的な方法で正しく行う方法はありません。」?これは正しくないようです。- Thorn007の答えは、このようなAの方法を提供し、私はそれを自分自身を使用しました@ stackoverflow.com/questions/12259736/...
ダンDascalescu

@DanDascalescu Thorn007の答えは、コンテナーよりも小さい場合、画像を拡張しません。今日の最良の解決策は、背景画像とセットを備えた要素を使用することbackground-size: containです。
Kevin Borders

「画像のサイズを均等に変更するには、高さまたは幅のいずれかを「100%」に設定する必要がありますが、両方に設定する必要はありません。」<これはまさに私を助けたものです。ありがとう
Alexander Santos

77

提供されている画像が小さすぎたり大きすぎたりしてdivに収まらない場合でも、div内でimgを垂直方向と水平方向の両方に配置して、ストレッチを行わないソリューションを次に示します。

HTMLコンテンツ:

<div id="myDiv">
  <img alt="Client Logo" title="Client Logo" src="Imagelocation" />
</div>

CSSコンテンツ:

#myDiv
{
  height: 104px;
  width: 140px;
}
#myDiv img
{
  max-width: 100%;
  max-height: 100%;
  margin: auto;
  display: block;
}

jQueryの部分:

var logoHeight = $('#myDiv img').height();
    if (logoHeight < 104) {
        var margintop = (104 - logoHeight) / 2;
        $('#myDiv img').css('margin-top', margintop);
    }

1
CSSは思い通りに機能し、jQueryビットをスキップしました
bkwdesign

48

それを簡単に!

コンテナを固定して heightから、コンテナimg内のタグにとを設定widthmax-heightます。

<div style="height: 250px">
     <img src="..." alt=" " style="width: 100%;max-height: 100%" />
</div>

違いはwidth、ではなくを100%に設定することですmax-width


2
これにより、画像が非常に高く、ビューポートが短い場合、Google Chromeで画像の比率が変化します。
ミッコランタライネン2014年

29

美しいハック。

画像をレスポンシブにする方法は2つあります。

  1. 画像が背景画像の場合。
#container{
    width: 300px;
    height: 300px;
    background-image: url(http://images.fonearena.com/blog/wp-content/uploads/2013/11/Lenovo-p780-camera-sample-10.jpg);
    background-size: cover;
    background-repeat: no-repeat;
    background-position: center;
}

<div id="container"><div>

ここで実行してください


しかし、一つには、使用する必要がありimg、それがより優れているとして画像を置くためにタグをbackground-imageの面でSEOあなたが書くことができるよう、キーワードaltimgタグ。だからここにあなたは画像をレスポンシブにすることができます。

  1. 画像がimgタグ内にある場合。
#container{
    max-width: 400px;
    overflow: hidden;
}
img{
    width: 100%;
    object-fit: contain;
}

<div id="container">
   <img src="http://images.fonearena.com/blog/wp-content/uploads/2013/11/Lenovo-p780-camera-sample-10.jpg" alt="your_keyword"/>
<div>

ここで実行してください


23

画像をdivの背景として設定し、CSSのbackground-sizeプロパティを使用できます

background-size: cover;

これは、あろう「背景領域が完全に背景画像によって覆われることが可能なように大型のように、背景画像を拡大縮小、背景画像の一部が背景配置領域内ビューでないかもしれません。」 - W3Schoolsの


OPは「divコンテナーに適合させる」とは、画像がどちらの次元でもコンテナー要素を超えてはならないことを意味すると信じています。@JonatasWalkerのソリューションでは、画像がトリミングされます。また、状況によっては、バックグラウンドソリューションが意味的に正しくない場合があります。たとえば、alt値やそのようなものが必要になる場合があります(ただし、補助技術では見えないダミー画像を追加することもできます)、またはクリック可能にする必要がある場合があります。
バラージュ

@Balázsああ、この場合は正しい設定になりますbackground-size: contain
。JavaScript

@ChuckDries私はあなたが何を意味するのか本当にわかりません、受け入れられた答えは問題を解決します。
バラージュ

22

私の解決策をチェックしてください:http : //codepen.io/petethepig/pen/dvFsA

JavaScriptコードなしで純粋なCSSで記述されています。任意のサイズと方向の画像を処理できます。

そのようなHTMLを考えると:

<div class="image">
  <div class="trick"></div>
  <img src="http://placekitten.com/415/200"/>
</div>

CSSコードは次のようになります。

.image {
  font-size: 0;
  text-align: center;
  width: 200px;  /* Container's dimensions */
  height: 150px;
}
img {
  display: inline-block;
  vertical-align: middle;
  max-height: 100%;
  max-width: 100%;
}
.trick {
  display: inline-block;
  vertical-align: middle;
  height: 150px;
}

2
これは小さすぎる画像を処理しません。
Josh C

1
@JoshCどういう意味ですか?この1はうまく機能:codepen.io/petethepig/pen/maeFo
ドミトリー

2
小さすぎる画像には404。
Josh C、

このメソッドは可変幅コンテナでも機能することを指摘しておきたい。素晴らしい仕事ドミトリー!
Camilo Martin

わずかな変更で完璧です:codepen.io/anon/pen/BoQmBwありがとうDmitry
Alqin

10

私はちょうどあなたが多くのオプションであなたが必要とするものを正確に実行するjQueryプラグインを公開しました:

https://github.com/GestiXi/image-scale

使用法:

HTML

<div class="image-container">
    <img class="scale" data-scale="best-fit-down" data-align="center" src="img/example.jpg">
</div>

JavaScript

$(function() {
    $("img.scale").imageScale();
});

10

このソリューションは、画像を引き伸ばすことなく、コンテナー全体を塗りつぶしますが、画像の一部を切り取ります。

HTML:

 <div><img src="/images/image.png"></div>

CSS:

div {
    width: 100%;
    height: 10em;
    overflow: hidden;

img {
    min-width: 100%;
    min-height: 100%;
}

9

多くの人がオブジェクトフィットを推奨していると思います。これは良い選択肢です。しかし、それを古いブラウザでも機能させたい場合は、簡単に実行する別の方法があります。

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

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/

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


8

以下は私にとって完璧に機能します:

img{
   height: 99999px;
   object-fit:contain;
   max-height: 100%;
   max-width: 100%;    
   display: block;
   margin: auto auto;
}

7

JavaScriptを必要としない、はるかに優れたソリューションがあります。それは完全に応答性があり、私はそれを頻繁に使用します。多くの場合、アスペクト比の画像を、指定したアスペクト比のコンテナ要素に合わせる必要があります。そして、これを完全に応答性の高いものにすることは必須です。

/* For this demo only */
.container {
  max-width: 300px;
  margin: 0 auto;
}
.img-frame {
  box-shadow: 3px 3px 6px rgba(0, 0, 0, .15);
  background: #ee0;
  margin: 20px auto;
}

/* This is for responsive container with specified aspect ratio */
.aspect-ratio {
  position: relative;
}
.aspect-ratio-1-1 {
  padding-bottom: 100%;
}
.aspect-ratio-4-3 {
  padding-bottom: 75%;
}
.aspect-ratio-16-9 {
  padding-bottom: 56.25%;
}

/* This is the key part - position and fit the image to the container */
.fit-img {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
  max-width: 80%;
  max-height: 90%
}
.fit-img-bottom {
  top: auto;
}
.fit-img-tight {
  max-width: 100%;
  max-height: 100%
}
<div class="container">

  <div class="aspect-ratio aspect-ratio-1-1 img-frame">
    <img src="//placehold.it/400x300" class="fit-img" alt="sample">
  </div>

  <div class="aspect-ratio aspect-ratio-4-3 img-frame">
    <img src="//placehold.it/400x300" class="fit-img fit-img-tight" alt="sample">
  </div>

  <div class="aspect-ratio aspect-ratio-16-9 img-frame">
    <img src="//placehold.it/400x400" class="fit-img" alt="sample">
  </div>

  
  <div class="aspect-ratio aspect-ratio-16-9 img-frame">
    <img src="//placehold.it/300x400" class="fit-img fit-img-bottom" alt="sample">
  </div>
  
</div>

最大幅と最大高さを個別に設定できます。画像は最小のものを尊重します(画像の値とアスペクト比によって異なります)。また、画像を好きなように配置するように設定することもできます(たとえば、無限の白い背景の製品画像の場合は、簡単に中央下部に配置できます)。


5

画像に必要な高さと幅を、<img>タグを含むdivに渡します。適切なスタイルタグで高さ/幅を指定することを忘れないでください。

<img>タグで、max-heightand max-widthを100%として指定します。

<div style="height:750px; width:700px;">
    <img alt="That Image" style="max-height:100%; max-width:100%;" src="">
</div>

正しく理解したら、適切なクラスに詳細を追加できます。


5

以下のコードは以前の回答から適応され、と呼ばれるイメージを使用して私がテストしましたstorm.jpg

これは、画像を表示する単純なページの完全なHTMLコードです。これは完璧に機能し、www.resizemybrowser.comで私がテストしました。CSSコードをHTMLコードの上部、ヘッドセクションの下に配置します。好きな場所に画像コードを配置します。

<html>
    <head>
        <style type="text/css">
            #myDiv
            {
                  height: auto;
                  width: auto;
            }
            #myDiv img
            {
                max-width: 100%;
                max-height: 100%;
                margin: auto;
                display: block;
            }
        </style>
    </head>

    <body>
        <div id="myDiv">
            <img src="images/storm.jpg">
        </div>
    </body>
</html>

5
<style type="text/css">
    #container{
        text-align: center;
        width: 100%;
        height: 200px; /* Set height */
        margin: 0px;
        padding: 0px;
        background-image: url('../assets/images/img.jpg');
        background-size: content; /* Scaling down large image to a div */
        background-repeat: no-repeat;
        background-position: center;
    }
</style>

<div id="container>
    <!-- Inside container -->
</div>

2
あなたのコードの説明を追加できればいいでしょう(私はあなたがそこにいくつかのコメントを持っていることを知っていますが、なぜ/これが質問にどのように答えるかについてのほんの少しの言葉がそれをはるかによく見せるでしょう)。
display-name-is-missing

5

配置する場所の高さをブラウザに伝える必要があります。

.example {
    height: 220px; /* DEFINE HEIGHT */
    background: url('../img/example.png');
    background-size: 100% 100%;
    background-repeat: no-repeat;
}

5

編集: Internet Explorer 11では、以前のテーブルベースの画像の配置に問題がありました(要素でmax-heightは機能しませんdisplay:table)。Internet Explorer 7とInternet Explorer 11の両方で正常に機能するだけでなく、必要なコードも少ないインラインベースのポジショニングに置き換えました。


これが私の主題です。コンテナーが指定されたサイズの場合にのみ機能します(具体的なサイズのないコンテナーmax-widthmax-heightはうまくいかないようです)が、再利用できるようにCSSコンテンツを記述しました(picture-frameクラスを追加)そしてpx125、既存のコンテナにサイズクラス)。

CSS:

.picture-frame
{
    vertical-align: top;
    display: inline-block;
    text-align: center;
}

.picture-frame.px125
{
    width: 125px;
    height: 125px;
    line-height: 125px;
}

.picture-frame img
{
    margin-top: -4px; /* Inline images have a slight offset for some reason when positioned using vertical-align */
    max-width: 100%;
    max-height: 100%;
    display: inline-block;
    vertical-align: middle;
    border: 0; /* Remove border on images enclosed in anchors in Internet Explorer */
}

そしてHTMLでは:

<a href="#" class="picture-frame px125">
    <img src="http://i.imgur.com/lesa2wS.png"/>
</a>

デモ


編集:JavaScriptを使用してさらに改善できる可能性があります(画像のアップスケーリング):

function fixImage(img)
{
    var $this = $(img);
    var parent = $this.closest('.picture-frame');
    if ($this.width() == parent.width() || $this.height() == parent.height())
        return;

    if ($this.width() > $this.height())
        $this.css('width', parent.width() + 'px');
    else
        $this.css('height', parent.height() + 'px');
}

$('.picture-frame img:visible').each(function
{
    if (this.complete)
        fixImage(this);
    else
        this.onload = function(){ fixImage(this) };
});

この方法には欠点があります。画像の読み込みに失敗すると、代替テキストが親コンテナとともに表示されますline-height。代替テキストに複数の行がある場合、それは本当に見栄えが悪くなります...
jahu

5

次のコードを使用してこの問題を修正しました。

<div class="container"><img src="image_url" /></div>
.container {
    height: 75px;
    width: 75px;
}

.container img {
    object-fit: cover;
    object-position: top;
    display: block;
    height: 100%;
    width: 100%;
}

4

ここに答え、あなたも使用できるvh代わりの単位max-height: 100%、それは(クロムなど)、ブラウザ上で動作しない場合は:

img {
    max-height: 75vh;
}

1
もしかしてvh?Chromeでは何が機能しないのですか?
misterManSam 2016年

@misterManSamはい、どうもありがとう、私がこの回答を投稿したとき、昨日はあまりにも疲れていました。max-height: xx%(パーセンテージ単位)は、などの一部の要素があるChromeでは機能しませんimgが、vh単位は機能します。しかし、割合はで動作するheightwidthmax-width、など
gaborous

4

次のように、ハイパーリンク内の画像を水平方向と垂直方向の両方に比例して中央揃えし、拡大縮小しました。

#link {
    border: 1px solid blue;
    display: table-cell;
    height: 100px;
    vertical-align: middle;
    width: 100px;
}
#link img {
    border: 1px solid red;
    display: block;
    margin-left: auto;
    margin-right: auto;
    max-height: 60px;
    max-width: 60px;
}

Internet Explorer、Firefox、Safariでテストされています。

センタリングの詳細については、こちらをご覧ください


4

Thorn007からの承認された回答は、画像が小さすぎる場合機能しません。

これを解決するために、スケールファクターを追加しました。これにより、画像が大きくなり、divコンテナーがいっぱいになります。

例:

<div style="width:400px; height:200px;">
  <img src="pix.jpg" style="max-width:100px; height:50px; transform:scale(4); transform-origin:left top;" />
</div>

ノート:

  1. WebKitの場合-webkit-transform:scale(4); -webkit-transform-origin:left top;は、スタイルを追加する必要があります。
  2. スケール係数が4の場合、max-width = 400/4 = 100およびmax-height = 200/4 = 50になります。
  3. 代替ソリューションは、最大幅と最大高さを25%に設定することです。さらにシンプルです。

1
市場全体をサポートしようとしている場合、これは非常に信頼できるソリューションではありません。CSS3をサポートしないブラウザーで何らかのフォールバックが発生しない限り、CSS3は避けます。
dudewad 2014年


3

私にとってはうまくいくと思われる簡単な解決策(4ステップの修正!!)を以下に示します。この例では、幅を使用して全体のサイズを決定していますが、幅を反転して高さを使用することもできます。

  1. 画像コンテナー(<img>など)にCSSスタイルを適用する
  2. widthプロパティを必要な寸法に設定します
    • 寸法については%、相対サイズ、または自動スケーリング(画像コンテナまたはディスプレイに基づく)に使用します
    • px静的またはセットディメンションに(またはその他の)を使用する
  3. 幅に基づいて自動的に調整するように高さプロパティを設定します
  4. 楽しい!

例えば、

<img style="width:100%; height:auto;"
    src="https://googledrive.com/host/0BwDx0R31u6sYY1hPWnZrencxb1k/thanksgiving.png"
/>

3

受け入れられたものを含め、提供されたすべての回答は、ラッパーが固定サイズであるという前提の下でのみ機能divます。だから、これはそれを行う方法ですどんなのサイズdivのラッパーであり、あなたが応答ページを開発する場合、これは非常に便利です。

これらの宣言をDIVセレクター内に記述します。

width: 8.33% /* Or whatever percentage you want your div to take */
max-height: anyValueYouWant /* (In px or %) */

次に、これらの宣言をIMGセレクター内に配置します。

width: "100%" /* Obligatory */
max-height: anyValueYouWant /* (In px or %) */

非常に重要:

の値は、セレクタとセレクタの両方で同じmaxHeightなければなりません。DIVIMG


1
正しいCSS宣言は、キャメルの場合のmaxHeightではなく、「max-height」です。
Mark Townsend

3

簡単な解決策は、フレックスボックスを使用することです。コンテナのCSSを次のように定義します。

.container{
    display: flex;
    justify-content: center;
    align-items: center;
    align-content: center;
    overflow: hidden;
    /* Any custom height */
}

含まれる画像の幅を100%に調整すると、寸法が保持された状態でコンテナー内の中央に配置された画像が表示されます。


1

少しの計算で解決策は簡単です...

画像をdivに入れてから、画像を指定するHTMLファイルに入れます。画像のピクセル値を使用して幅と高さの値をパーセンテージで設定し、幅と高さの正確な比率を計算します。

たとえば、幅が200ピクセル、高さが160ピクセルの画像があるとします。幅の値が大きいので、幅の値は100%になります。高さの値を計算するには、高さを幅で割るだけで、80%のパーセンテージ値が得られます。コードでは次のようになります...

<div class="image_holder_div">
    <img src="some_pic.png" width="100%" height="80%">
</div>

1

これを行う最も簡単な方法は、以下を使用することobject-fitです。

<div class="container">
  <img src="path/to/image.jpg">
</div>

.container{
   height: 300px;
}

.container img{
  height: 100%;
  width: 100%;
  object-fit: cover;
}

ブートストラップを使用している場合は、img-responsiveクラスを追加して次のように変更します

.container img{
    object-fit: cover;
}


-1

または、単に次のように使用できます。

background-position:center;
background-size:cover;

これで、イメージはdivのすべてのスペースを取ります。


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