div内に画像(img)を収め、縦横比を維持するにはどうすればよいですか?


136

私は48x48のdivを持っていて、その中にimg要素があります。部分を失うことなくそれをdivに合わせたいのですが、その間に比率が維持されますが、htmlとcssを使用して達成できますか?

回答:


70

CSSを書き込んでいるときに画像のサイズがわからない場合は、トリミングを防ぐためにJavaScriptが必要になります。

HTML&JavaScript

<div id="container">
    <img src="something.jpg" alt="" />
</div>

<script type="text/javascript">
(function() {

var img = document.getElementById('container').firstChild;
img.onload = function() {
    if(img.height > img.width) {
        img.height = '100%';
        img.width = 'auto';
    }
};

}());
</script>

CSS

#container {
   width: 48px;
   height: 48px;
}

#container img {
   width: 100%;
}

JavaScriptライブラリーを使用している場合は、それを利用することができます。


2
マイケルの答えははるかに単純で、JavaScriptを使用しません。ブラウザの互換性についてはわかりません。
weberc2

3
いいえ、画像がdivよりも大きい限り、マイケルの答えは機能します。画像サイズに関してdivを埋めるようにしたい場合(および、事前に画像サイズがわからない場合は、そうする方法)です。
レミー・デイヴィッド2012

2
max-height:100%を使用できませんか?最大幅:100%; 最小幅:100%; min-height:100%で同じ結果が得られますか?正直な質問。
Daniel Casserly

いいえ、そうすることで、幅と高さを100%に強制し、画像のアスペクト比を変更します。
gztomas 2013

onloadは、画像がブラウザーにキャッシュされるときに呼び出されないため、画像が初めて読み込まれるときにのみ機能します。
Redtopia 2014

314

max-height:100%; max-width:100%;div内の画像に使用します。


4
@ZoveGames非JS対応ブラウザー?2010年のYahoo統計は平均1.3%を示しています。私はそれを仮定することは安全だと思います。今日はおそらくより低く、b。programmers.stackexchange.com/questions/26179/...
EasyCo

5
それは私にはうまくいきません...それは画像をそれ自身のサイズの100%にします(例えば:実際に300px幅の画像の場合、300px幅)。
トマーシュZato -復活モニカ

1
これが引き起こすいくつかのひどいChrome-on-Windows特有のバグがあります。潜在的に、私が持っている特定のsmoothscrollプラグインとのいくつかの悪い相互作用。マウスがoverflow:scroll大きな画像のdivの上にあるにもかかわらず、最終的には本体をスクロールしようとします。奇妙な。さらに奇妙なことに、マックスのソリューションは実際にそれを修正します。本当にCSSにうんざりしています。以前はパワフルでクールでした。今回の実装では、バグのある不整合の後にバグのある不整合が生じるだけです。
Steven Lu

21
画像を縮小する場合にのみ機能します。小さな画像を大きなコンテナに収めたい場合は、これは機能しません
Yossi Shasho

2
画像の元のアスペクト比は保持されません。
Ĭsααcトンիεβöss

78

残念ながら、max-width + max-heightは私のタスクを完全にはカバーしていません...したがって、別の解決策を見つけました:

スケーリング中に画像の比率を保存するには、object-fit CSS3プロパティを使用することもできます。

役立つ記事:CSS3で画像のアスペクト比を制御する

img {
    width: 100%; /* or any custom size */
    height: 100%; 
    object-fit: contain;
}

悪いニュース:IEはサポートされていません(使用できますか


6
これは答えとしてマークする必要があります。「オブジェクトフィット」は完全に機能しました。
Ĭsααcトンիεβöss

奇妙なことに、これのサポートは8.0ではなくiOS 8.1で導入されたようです。
レイ

2
object-fit: cover; 私のために働いた。ここで:stackoverflow.com/questions/9071830/...
デケ

1
あなたは画像がトップになりたい場合は、左ではなく、中心に、あなたはまた、使用目的位置0 0に必要
クリス・レイ

これは、画像の縦横比を維持しながら、画面いっぱいに反応する画像の背景を作成するために私が働いた唯一の答えです。
Ray Li

39

CSSのみを使用:

div > img {
  width: auto;
  height : auto;
  max-height: 100%;
  max-width: 100%;
}

スケールアップしない
JFFIGK

17

HTML

<div>
    <img src="something.jpg" alt="" />
</div>

CSS

div {
   width: 48px;
   height: 48px;
}

div img {
   display: block;
   width: 100%;
}

これにより、画像が親に合わせて拡大され、そのサイズはdivCSSで設定されます。


2
追加しないでくださいheight: 100%、それは画像の比率を歪めます-OPは比率を維持したいと考えています。
カサブランカ

OPの意味がわかりませんが、比率を正しく維持できません。
Trufa

比率を維持するにはどうすればよいですか?高さを削除した場合:100%画像がトリミングされます。
Bin Chen

7

私はこれを機能させるために多くの問題を抱えていました、私が見つけたすべての解決策は機能していないようでした。

私はdiv表示をフレックスに設定する必要があることに気付いたので、基本的にこれは私のCSSです:

div{
display: flex;
}

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

Chromeバージョン61のこのソリューションで画像が歪む
Yevgeniy Afanasyev 2017年

たぶんあなたのdivにmax-height / heightまたはwidthが設定されており、それが画像のゆがみを引き起こしています。
Bartho Bernsmann 2017年

まさに私のポイントです。<div class = "w">で幅と高さを設定しているため、画像がゆがんでいます
Bartho Bernsmann 2017年

あなたの例のために..私はあなたがあなたの画像CSSのようなものを探していると信じています:height:auto; 幅:100%;
Bartho Bernsmann 2017年

タスクは、画像をdivに合わせることでした。これは、divには寸法があり、画像にはアスペクト比のみがあることを意味します。高さをある値に設定する必要があります。そうしないと、質問の条件が画像と同様に歪んでしまいます。JSフィドルを見て、それを機能させるために必要なことを変更してください。ありがとう。
Yevgeniy Afanasyev 2017年


3

私にとっては、次のCSSが機能しました(Chrome、Firefox、Safariでテスト済み)。

一緒に動作するものは複数あります。

  • max-height: 100%;max-width: 100%;およびheight: auto;width: auto;アスペクト比を維持しながら、最初に100%に到達する次元にimgスケールを設定します
  • position: relative;コンテナ内とposition: absolute;子で一緒に持つtop: 50%;left: 50%;中央上部には、コンテナ内のimgの角を左に
  • transform: translate(-50%, -50%); imgをサイズの半分だけ左上に移動し、コンテナ内でimgを中央に配置します

CSS:

.container {
    height: 48px;
    width: 48px;

    position: relative;
}

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

    position: absolute;
    top: 50%;
    left: 50%;

    transform: translate(-50%, -50%);
}

1

写真を背景画像として設定すると、サイズと配置をより詳細に制御できるようになり、imgタグを別の目的に使用できます...

以下では、divを写真と同じアスペクト比にする場合、placeholder.pngはphoto.jpgと同じアスペクト比の小さな透明な画像です。写真が正方形の場合は1px x 1pxのプレースホルダー、写真がビデオのサムネイルの場合は16x9のプレースホルダーなどです。

質問に固有なのは、1x1プレースホルダーを使用してdivの二乗比background-sizeを維持し、背景画像を使用して写真のアスペクト比を維持することです。

background-position: center center;写真をdivの中央に配置するために使用しました。(写真を垂直方向の中央または下部に揃えると、imgタグ内の写真が見苦しくなります。)

div {
    background: url(photo.jpg) center center no-repeat;
    background-size: contain;
    width: 48px; // or a % in responsive layout
}
img {
    width: 100%;
}

<div><img src="placeholder.png"/></div>

余分なhttpリクエストを回避するには、プレースホルダー画像をdata:URL変換します

<img src="data:image/png;base64,..."/>

0

新しいバージョン、つまりBootstrap v4にはクラス「img-fluid」を使用できます。

また、Bootstrap v3のような古いバージョンでは、クラス「img-sensitive」を使用できます。

使い方:-

imgタグと:-

クラス = "img-fluid"

src = "..."


0

ここにすべてのJavaScriptアプローチがあります。正しく収まるまで画像を段階的に縮小します。失敗するたびにどれだけ縮小するかを選択します。この例では、失敗するたびに10%縮小します。

let fit = function (el, w, h, percentage, step)
{
    let newH = h;
    let newW = w;

    // fail safe
    if (percentage < 0 || step < 0) return { h: h, w: w };
    if (h > w)
    {
        newH = el.height() * percentage;
        newW = (w / h) * newH;
        if (newW > el.width())
        {
            return fit(el, w, h, percentage - step, step);
        }
    }
    else
    {
        newW = el.width() * percentage;
        newH = (h / w) * newW;
        if (newH > el.height())
        {
            return fit(el, w, h, percentage - step, step);
        }
    }

    return { h: newH, w: newW };
};

img.bind('load', function ()
{
    let h = img.height();
    let w = img.width();
    let newFit = fit($('<img-wrapper-selector>'), w, h, 1, 0.1);

    img.width(newFit.w);
    img.height(newFit.h);
});

直接コピーして貼り付けてください。


0

私のために働いたのは:

<div style='display: inline-flex; width: 80px; height: 80px;'>
<img style='max-width: 100%; max-height: 100%' src='image file'>
</div>

画像がdivの外に出ないようにするためにinline-flexが必要でした。

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