web-dev-qa-db-ja.com

'div'コンテナに合わせて画像を自動サイズ変更する方法

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


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

1268
001

Imageタグに明示的な幅や高さを適用しないでください。代わりにそれを与えなさい:

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>
1634
Kevin

object-fit

これを行うには別の方法があります。

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

仕事をします。 CSS 3です。

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

313
Shih-Min Lee

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

画像を比例してサイズ変更するには、 または 高さまたは幅のどちらかを "100%"に設定する必要がありますが、両方は設定する必要はありません。 両方を "100%"に設定すると、画像は引き伸ばされます。

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

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

あなたの画像がSVGであるならば、それは可変サイズのベクトル画像フォーマットである、あなたはコンテナに合うように拡大を自動的に起こさせることができる。

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

height
width
viewbox

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

96
Neil

これは、供給された画像が小さすぎても大きすぎて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);
    }
68
Humble Rumble

それを簡単に!

コンテナーに fixed heightを指定し、その中のimgタグにwidthmax-heightを設定します。

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

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

40
Mehdi Maghrooni

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

これは純粋なCSSで書かれており、JavaScriptコードは含まれていません。それはあらゆるサイズおよびあらゆる向きの画像を扱うことができます。

そのような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;
}
21
dmitry

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

background-size: cover;

"背景領域が背景画像で完全に覆われるように背景画像をできる限り大きくする。背景画像の一部が背景配置領域内に表示されない場合がある" - - W3Schools

19
Chuck Dries

私はちょうどあなたが多くのオプションであなたが必要とすることをする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();
});
9
Nicolas BADIA

この解決策は画像を引き伸ばしてコンテナ全体を埋めるのではなく、画像の一部をカットします。

HTML:

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

CSS:

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

img {
    min-width: 100%;
    min-height: 100%;
}
9
Miia Klingstedt

以下は私にとって完璧に動作します。

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

私は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>

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

6
actimel

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

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

以下のコードは以前の答えから修正されたもので、私がstorm.jpgという画像を使ってテストしたものです。

これは、画像を表示する簡単なページの完全なHTMLコードです。これは完璧に動作し、私はwww.resizemybrowser.comでテストしました。 CSSコードをあなたのHTMLコードの一番上、あなたのheadセクションの下に置きます。あなたが絵を見たいところに絵のコードを入れなさい。

<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
dan

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

#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でテスト済みです。

センタリングに関する詳細は here です。

4
bancer
<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>
4
easd

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

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

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

適切になったら、適切なクラスに詳細を追加できます。

4
AZD

編集: / Internet Explorer 11では、以前のテーブルベースの画像の配置に問題がありました(max-heightdisplay: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>

デモ

/* Main style */

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

.picture-frame.px32
{
    width: 32px;
    height: 32px;
    line-height: 32px;
}

.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 */
}

/* Extras */

.picture-frame
{
    padding: 5px;
}

.frame
{
    border:1px solid black;
}
<p>32px</p>
<a href="#" class="picture-frame px32 frame">
    <img src="http://i.imgur.com/lesa2wS.png"/>
</a>
<a href="#" class="picture-frame px32 frame">
    <img src="http://i.imgur.com/kFMJxdZ.png"/>
</a>
<a href="#" class="picture-frame px32 frame">
    <img src="http://i.imgur.com/BDabZj0.png"/>
</a>
<p>125px</p>
<a href="#" class="picture-frame px125 frame">
    <img src="http://i.imgur.com/lesa2wS.png"/>
</a>
<a href="#" class="picture-frame px125 frame">
    <img src="http://i.imgur.com/kFMJxdZ.png"/>
</a>
<a href="#" class="picture-frame px125 frame">
    <img src="http://i.imgur.com/BDabZj0.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) };
});
4
jahu

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の場合、最大幅= 400/4 = 100、最大高さ= 200/4 = 50となります。
  3. 別の解決策は、最大幅と最大高を25%に設定することです。もっと簡単です。
4
user217447

私のために働くように思われる簡単な解決策(4段階の修正!!)は以下の通りです。例では全体のサイズを決定するために幅を使用していますが、代わりに高さを使用するように反転することもできます。

  1. 画像コンテナにCSSスタイルを適用します(たとえば、<img>)。
  2. Widthプロパティを必要な寸法に設定します
    • 寸法については、相対サイズには%を使用するか、(画像コンテナまたはディスプレイに基づいて)オートスケーリングを使用します。
    • 静的または集合次元にはpx(またはother)を使用
  3. 幅に基づいて自動的に調整するようにheightプロパティを設定します。
  4. 楽しい!

例えば、

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

受け入れられたものを含むすべての提供された答えは、divラッパーが固定サイズであるという仮定の下で、 only で動作します。それで、これはそれをどのように行うかです。 なんでも 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の値は、DIVおよびIMGの両方のセレクターの same でなければなりません。

2

ここで答えた として、あなたのブラウザではうまくいかないのであればmax-height: 100%の代わりにvhユニットを使うこともできます(Chromeのように):

img {
    max-height: 75vh;
}
2
gaborous

Bootstrapを使用している場合は、imgタグにimg-responsiveクラスを追加するだけです。

<img class="img-responsive" src="img_chania.jpg" alt="Chania">

ブートストラップイメージ

1
HoangYell

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

<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%;
}
1
Serkan KONAKCI

簡単な解決策はflexboxを使うことです。コンテナのCSSを次のように定義します。

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

含まれている画像の幅を100%に調整すると、寸法が維持された状態で、コンテナの中にNiceの中央画像が表示されます。

1
Mateo Marin

私は多くの人がobject-fitという提案をしているようですが、これは良い選択肢です。しかし、古いブラウザでもで作業したい場合は、別の方法があります。

ここに私の答えをチェックしてください: IEとEdge-object-fit:cover;

それはとても簡単です。次の組み合わせを使用して、absolute、次に中央に配置を使用してイメージをコンテナ内に配置しました。

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/

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

解決策は少し数学で簡単です...

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

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

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