境界ボックスに合わせて画像を拡大縮小する


117

画像を境界ボックスにスケーリングする(縦横比を維持する)CSSのみのソリューションはありますか?これは、画像がコンテナよりも大きい場合に機能します。

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

例:

しかし、ディメンションがコンテナの100%になるまで画像を拡大したいと思います。


高さ:100%と幅:100%が好きですか?到達したい希望の次元はありますか?そうでない場合は、画像を引き伸ばして、強制的にそれらの寸法に到達させることもできます。
mikevoermans

@mikevoermans最初の2つの例を見てください。一方の寸法が100%になり、もう一方の寸法が100%以下になるまで画像をストレッチします
Thomas Guillory

@jacktheripperもちろんアスペクト比を維持しています...
Thomas Guillory

@gryzzly例はそれ自体が物語っています!彼らが例に目を向けていれば、それは明白でした。
トーマス・ギロリー

@Artimuz私は完全に同意しません。あなたの質問に対する3つの回答(私のものを含む)は、それが明白ではなかったことを示唆しています。
カーン

回答:


94

注:これは承認された回答ですが、以下の回答はより正確であり、現在、背景画像を使用するオプションがある場合は、すべてのブラウザーでサポートされています。

いいえ、CSSだけで双方向にこれを行う方法はありません。追加できます

.fillwidth {
    min-width: 100%;
    height: auto;
}

要素を常に100%の幅にして、高さをアスペクト比またはその逆に自動的にスケーリングします。

.fillheight {
    min-height: 100%; 
    width: auto;
}

常に最大の高さと相対幅にスケーリングします。両方を行うには、アスペクト比がコンテナよりも高いか低いかを判断する必要があり、CSSはこれを実行できません。

その理由は、CSSがページの外観を認識していないためです。事前にルールを設定しますが、その後になって初めて要素がレンダリングされ、処理しているサイズと比率が正確にわかります。これを検出する唯一の方法はJavaScriptを使用することです。


JSソリューションを探しているわけではありませんが、誰かがそれを必要とする可能性がある場合はとにかく追加します。JavaScriptでこれを処理する最も簡単な方法は、比率の違いに基づいてクラスを追加することです。ボックスの幅と高さの比率が画像の幅より大きい場合は、クラス「fillwidth」を追加します。それ以外の場合は、クラス「fillheight」を追加します。


7
実際には解決策があります:CSS3 background-sizeを含むように設定します。私の答えを見てください。
トーマス・ギロリー

あなたは完全に正しいです。1年半経ちましたが、投稿を編集しました。
Stephan Muller

4
これが質問の正解だと思います。これがimgタグのCSSです。意味的にはimgタグはコンテンツであり、divの背景としての画像はコンテンツではないため、これは重要です。状況によってはこれが現実的ではありませんが(イメージとコンテナーの比率がわからない場合)、それ以外の場合は適切です。ありがとう。
duncanwilcox 2014年

173

CSS3のおかげで解決策があります!

解決策は、画像をとして配置しbackground-image、次にをに設定するbackground-sizeことcontainです。

HTML

<div class='bounding-box'>
</div>

CSS

.bounding-box {
  background-image: url(...);
  background-repeat: no-repeat;
  background-size: contain;
}

ここでテストしてください:http : //www.w3schools.com/cssref/playit.asp?filename=playcss_background-size&preval=contain

最新のブラウザーとの完全な互換性:http : //caniuse.com/background-img-opts

divを中央に揃えるには、次のバリエーションを使用できます。

.bounding-box {
  background-image: url(...);
  background-size: contain;
  position: absolute;
  background-position: center;
  background-repeat: no-repeat;
  height: 100%;
  width: 100%;
}

1
いい答えですが、私の答えは正しくありませんが(具体的にはimgについて尋ねていました)、これは優れたソリューションであり、私はそれを考えるべきでした。唯一の問題は、IE 8がまだ広く使用されているので、まだこれに依存したくないのですが、それでも問題はありません。
ステファンミュラー

6
レターボックス化が必要ない場合は、「cover」に設定します。background-size:contains;
arxpoetica

3
HTML:を使用して画像のURLを挿入できることに注意してください<div class=image style="background-image: url('/images/foo.jpg');"></div>。他のすべてのスタイルはCSSで適用する必要があります。
Andrey Mikhaylov-lolmaus 2013

14
これはひどいアプローチだと思います。これをbackground-imageに変更することで、HTML内の画像の意味上の意味を取り除きます。
アニムソン

14
@animuson:私は印刷されたレポートのためのHTML / CSSを使用していて、意味論についてのいんちきを与えることができなかったとして:)それはまだ私を助けた
クリスチャンWattengård

37

これが私が発見したハッキーなソリューションです:

#image {
    max-width: 10%;
    max-height: 10%;
    transform: scale(10);
}

これにより画像が10倍に拡大されますが、最終的なサイズの10%に制限されるため、コンテナーにバインドされます。

background-imageソリューションとは異なり、これは<video>要素でも機能します。

インタラクティブな例:


1
このソリューションが大好きです。それは実際に質問に答えるだけでなく(私は知っています、なんて考え)、Javascriptに頼らなくても、すべての最新のブラウザーで美しく機能します!
ndm13 14

2
私はそのフィドルを見たいです。imgを400x400コンテナに配置する私のテストでは、imgが隅で切り取られているだけです
cyberwombat 2015

3
素敵な答え!@Yashua transform-origin: top leftトリミングを停止するには、追加する必要があります。/ゾンビ
XwipeoutX 2015年

鮮やかさ。私の唯一の懸念は、不十分にコード化されたブラウザーで画像品質が失われる可能性ですが、理論的には問題なく動作するはずです!
Codemonkey

興味深いですが、Chromeでは動作しません。画像の列が切り取られます。
MattK 2016

23

今日は、object-fit:containsとだけ言ってください。IE以外はすべてサポートです:http : //caniuse.com/#feat=object-fit


3
IEはこれだけ(2016年9月12日午前10時56分午前)を書いている時点で、今から約16%の市場シェアを持っており、これは私のために最善の答えがあるので、漸減を続けて:D

8
入力ミスやリンク切れ以外の問題を修正するために他の人の回答を編集しないでください。私はSO解答で「がらくたブラウザーのためのポリフィルがあります」のような子供っぽいことを言うつもりはありません。私がそう言ったように見えるように編集された私の解答には感謝しません。あなたがあなたの言葉を使いたいなら、あなた自身の答えにそれらを入れてください。
Glenn Maynard

IEではなくEdgeが問題だと思います。caniuseによると、それobject-fitはまだ開発中です。
BairDev 2017年

これは2017年以降の上位投票の回答の1つになるはずです...上記のcaniuseリンクによると、世界中のすべてのユーザーの90%がこれをサポートするブラウザーを使用しています
fgblomqvist

私はちょうど使用しても使用しなくても動作する回答を投稿しましたobject-fitstackoverflow.com/a/46456673/474031
gabrielmaldi 2017

8

html:

    <div class="container">
      <img class="flowerImg" src="flower.jpg">
    </div>

css:

.container{
  width: 100px;
  height: 100px;
}


.flowerImg{
  width: 100px;
  height: 100px;
  object-fit: cover;
  /*object-fit: contain;
  object-fit: scale-down;
  object-position: -10% 0;
  object-fit: none;
  object-fit: fill;*/
}

5

これは、縦長の画像と横長の画像の両方に対して、純粋なCSSと完全なブラウザサポートで同時に実現できます。

以下は、Chrome、Firefox、Safariで動作するスニペットです(両方を使用するobject-fit: scale-down場合と使用しない場合)。

figure {
  margin: 0;
}

.container {
  display: table-cell;
  vertical-align: middle;
  width: 80px;
  height: 80px;
  border: 1px solid #aaa;
}

.container_image {
  display: block;
  max-width: 100%;
  max-height: 100%;
  margin-left: auto;
  margin-right: auto;
}

.container2_image2 {
  width: 80px;
  height: 80px;
  object-fit: scale-down;
  border: 1px solid #aaa;
}
Without `object-fit: scale-down`:

<br>
<br>

<figure class="container">
  <img class="container_image" src="https://i.imgur.com/EQgexUd.jpg">
</figure>

<br>

<figure class="container">
  <img class="container_image" src="https://i.imgur.com/ptO8pGi.jpg">
</figure>

<br> Using `object-fit: scale-down`:

<br>
<br>

<figure>
  <img class="container2_image2" src="https://i.imgur.com/EQgexUd.jpg">
</figure>

<br>

<figure>
  <img class="container2_image2" src="https://i.imgur.com/ptO8pGi.jpg">
</figure>


2

背景画像がなく、コンテナーも必要としない別のソリューション(境界ボックスの最大サイズがわかっている必要があります):

img{
  max-height: 100px;
  max-width: 100px;
  width: auto;    /* These two are added only for clarity, */
  height: auto;   /* as the default is auto anyway */
}


コンテナーの使用が必要な場合は、max-widthおよびmax-heightを100%に設定できます。

img {
    max-height: 100%;
    max-width: 100%;
    width: auto; /* These two are added only for clarity, */
    height: auto; /* as the default is auto anyway */
}

div.container {
    width: 100px;
    height: 100px;
}

これのためにあなたは次のようなものを持つでしょう:

<table>
    <tr>
        <td>Lorem</td>
        <td>Ipsum<br />dolor</td>
        <td>
            <div class="container"><img src="image5.png" /></div>
        </td>
    </tr>
</table>

1

この例では、ウィンドウ全体に合わせて画像を均等に引き伸ばします。上記の正しいコードの即興は追加することです$( window ).resize(function(){});

function stretchImg(){
    $('div').each(function() {
      ($(this).height() > $(this).find('img').height()) 
        ? $(this).find('img').removeClass('fillwidth').addClass('fillheight')
        : '';
      ($(this).width() > $(this).find('img').width()) 
        ? $(this).find('img').removeClass('fillheight').addClass('fillwidth')
        : '';
    });
}
stretchImg();

$( window ).resize(function() {
    strechImg();
});

if条件は2つあります。最初のものは、画像の高さがdivよりも小さいかどうかをチェックし続け、適用します.fillheightかどうかをチェックし続け、クラスをが、次のものは幅をチェックして.fillwidthクラスを適用します。どちらの場合も、他のクラスは次を使用して削除されます.removeClass()

ここにCSSがあります

.fillwidth { 
   width: 100%;
   max-width: none;
   height: auto; 
}
.fillheight { 
   height: 100vh;
   max-width: none;
   width: auto; 
}

あなたは置き換えることができます100vhによって100%あなたはdivの中に画像を引き伸ばしたい場合。この例では、ウィンドウ全体に合わせて画像を均等に引き伸ばします。


OPは、CSSのみのアプローチを具体的に求めました。
コルトマコーマック

0

下方にではなく、上方にスケーリングすることを考えていますか?

div {
    border: solid 1px green;
    width: 60px;
    height: 70px;
}

div img {
    width: 100%;
    height: 100%;
    min-height: 500px;
    min-width: 500px;
    outline: solid 1px red;
}

ただし、アスペクト比はロックされません。


5
誰かの回答に反対票を投じる前に、あなたの期待についてもう少し明確にしてください。特に、編集で質問を片付ける前に、彼らがあなたの質問に答えたとき。
カーン

2
また、より礼儀正しくなるようにしてください。あなたがそのように話すなら、誰もあなたを助けるつもりはありません。
ミシャレイズリン

@Artimuz見当違いの場合は申し訳ありませんが、アスペクト比を維持することを希望したかどうかは不明なため、具体的にコメントしました。また、サンプルからコードのスニペットを貼り付けたことにも気づくでしょう。私は高さを保つことを信じています:自動; 幅を指定すると、それが行われます。
ericosg

0

ボックスを使用して画像を中央に配置しました。アスペクト比を維持し、完全にボックス内に収まるように画像を拡大縮小します。画像がボックスよりも小さい場合は、中央に表示されます。以下のコードは、幅40px、高さ40pxのボックスを使用しています。(別のより複雑なコードから削除して少し簡略化したため、どれだけうまく機能するかはよくわかりません)

CSS:

.SmallThumbnailContainer
{
    display: inline-block; position: relative;
    float: left;    
    width: 40px;
    height: 40px;
    border: 1px solid #ccc;
    margin: 0px; padding: 0px;
}
.SmallThumbnailContainer { width: 40px; margin: 0px 10px 0px 0px; } 
.SmallThumbnailContainer tr { height: 40px; text-align: center; }
.SmallThumbnailContainer tr td { vertical-align: middle; position: relative; width: 40px;  }
.SmallThumbnailContainer tr td img { overflow: hidden; max-height: 40px; max-width: 40px; vertical-align: middle; margin: -1px -1px 1px -1px; }

HTML:

<table class="SmallThumbnailContainer" cellpadding="0" cellspacing="0">
    <tr><td>
        <img src="thumbnail.jpg" alt="alternative text"/>
    </td></tr>
    </table>

0

これを行う最もクリーンでシンプルな方法:

最初にいくつかのCSS:

div.image-wrapper {
    height: 230px; /* Suggestive number; pick your own height as desired */
    position: relative;
    overflow: hidden; /* This will do the magic */
    width: 300px; /* Pick an appropriate width as desired, unless you already use a grid, in that case use 100% */
}
img {
    width: 100%;
    position: absolute;
    left: 0;
    top: 0;
    height: auto;
}

HTML:

<div class="image-wrapper">
  <img src="yourSource.jpg">
</div>

これでうまくいくはずです!


0

これは私を助けました:

.img-class {
  width: <img width>;
  height: <img height>;
  content: url('/path/to/img.png');
}

次に、要素で(JavaScriptまたはメディアクエリを使用して応答性を追加できます):

<div class='img-class' style='transform: scale(X);'></div>

お役に立てれば!


-3
.boundingbox {
    width: 400px;
    height: 500px;
    border: 2px solid #F63;
}
img{
    width:400px;
    max-height: 500px;
    height:auto;
}

私は反対票を持っているので、私のソリューションをさらに説明するために私の回答を編集しています。

上記のcssで示されているようにスタイルを設定すると、次のhtml divは常に幅に合わせて画像を表示し、高さのアスペクト比を幅に調整します。したがって、質問で尋ねられたように、画像は境界ボックスに合わせて拡大縮小されます

<div class="boundingbox"><img src="image.jpg"/></div>

この回答は、ボックスが幅よりも高い場合にのみ機能します。
XwipeoutX 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.