画像を引き伸ばさずに画像の幅と高さを設定するにはどうすればよいですか?


90

私が持っている場合:

#logo {
    width: 400px;
    height: 200px;
}

その後

<img id="logo" src="logo.jpg"/>

そのスペースを埋めるために伸びます。画像のサイズを同じに保ちたいのですが、DOM内でそれだけのスペースを占めるようにします。カプセル化<div>またはを追加する必要があり<span>ますか?スタイリングにマークアップを追加するのは嫌いです。


まだStackOverflowを使用している場合は、回答の更新を検討しますか?
mikemaccana

回答:


118

はい、カプセル化するdivが必要です。

<div id="logo"><img src="logo.jpg"></div>

次のようなもので:

#logo { height: 100px; width: 200px; overflow: hidden; }

他の解決策(パディング、マージン)は(画像のサイズに基づいて適切な値を計算する必要があるという点で)面倒ですが、コンテナーを画像よりも効果的に小さくすることもできません。

また、上記はさまざまなレイアウトにはるかに簡単に適合させることができます。たとえば、右下の画像が必要な場合:

#logo { position: relative; height: 100px; width: 200px; }
#logo img { position: absolute; right: 0; bottom: 0; }

5
<div>タグを<figure>に置き換えることができます。セマンティックを追加し、必要に応じてキャプション(<figcaption>)を付けることができます。developer.mozilla.org/en-US/docs/Web/HTML/Element/figure
Mateus Leon 2015

また、ブランディング用の場合は、ウェブサイトのプレゼンテーションで<h1>(インデックスの場合)または<p>(その他の場合)を使用し、タイトルとalt属性を<img>に適用して、SEO対応のマークアップを追加できるようにします。 。これらはdivのようにブロックレベルの要素でもあり、切り抜き機能のラッパーにすることができます。
マテウスレオン2015

3
CletusがWeb開発者だとは思いもしませんでした。すごい
拼音2017

63

2017年の回答

CSSオブジェクトフィットは、現在のすべてのブラウザで機能します。これにより、img画像を引き伸ばすことなく要素を大きくすることができます。

object-fit: cover;CSSに追加できます。


2
あなたはおそらくそれがどのブラウザで動作するかについて言及する必要があります。
ネイサンタギー2017

2
ブラウザの互換性については、次のリンクを確認してください:caniuse.com/#search=object-fit
Alessia

28

divの背景として画像を読み込みます。

の代わりに:

<img id='logo' src='picture.jpg'>

行う

<div id='logo' style='background:url(picture.jpg)'></div>

すべてのブラウザは、画像の収まらない部分をトリミングします。
これには、オーバーフローが隠されている要素をラップするよりもいくつかの利点があります。

  1. 追加のマークアップはありません。divは単にimgを置き換えます。
  2. 画像を簡単に中央揃えにするか、別のオフセットに設定します。例えば。url(pic) center top;
  3. 十分に小さいときに画像を繰り返します。(OK、なぜあなたがそれを望むのかわからない)
  4. 同じステートメントでbgの色を設定し、同じ画像を複数の要素に簡単に適用し、bg画像に適用されるすべてのものを適用します。

更新:この回答は、オブジェクトフィット前のものです。これで、おそらくobject-fit / object-positionを使用する必要があります。

古いブラウザ、追加のプロパティ(background-repeatなど)、エッジケース(たとえば、flexboxとobject-positionでのChromeのバグの回避、grid + autoheight + object-でのFF(以前の?)の問題)でも引き続き役立ちます。フィット。グリッド/フレックスボックスのラッパーdivは、多くの場合...直感的でない結果をもたらします。)


4
-1を付けた方は、他のユーザーのために説明してください。個人的には、iOSのIE6やSafariでも、これを行って優れた結果が得られています。
SamGoody 2012

追加したかっただけです-これは一般的に良いアプローチです。人々は、最適化として画像スプライトシートの背景位置座標を指定することさえあります。ただし、1つの違いは、<img>にあるエラーイベントハンドラーがないことです
badunk 2013年

私はまた、これらのコンテンツをdiv要素にクラスを追加しました:background-repeat:no-repeat !important; float:left; width:100px; height:100px;
ニルス

2
一部のブラウザはデフォルトで背景画像を印刷しないため、ユーザーにそのページを印刷させたい場合、これは適切なアプローチではない可能性があります。
ベネットマケルウィー2015年

5
これは意味的に正しくありません。これが役立つ場合、figcaption、pictureを使用してセマンティクスを最適化するために、HTML5がより多くの画像関連タグを配置するのはなぜですか?設計どおりにimgタグを使用し、すべてを<div>に置き換えるのをやめます。
マテウスレオン2015

24

CSS3オブジェクトフィット

Webkit、IE、Firefoxでどこまで実装されているかわかりません。しかし、Operaは魔法のように機能します

object-fitSVGコンテンツで機能しpreserveAspectRatio=""ますが、SVG自体に属性を設定することでも同じ効果を得ることができます。

img {
  height: 100px;
  width: 100px;
  -o-object-fit: contain;
}

クリスミルズのデモはここにありますhttp://dev.opera.com/articles/view/css3-object-fit-object-position/


2
1+これは本当にクールです。残念ながら、サポート制限されています。ベンダープレフィックスなしでサポートするのはChrome32が最初のようです
Josh Crozier 2014

これは素晴らしく、魅力のように機能します。1つのプロパティを追加するだけで、すべてが修正されました。Chromeが必要でしたが、動作します。はい、ベンダープレフィックスなし。ありがとう。
whyAto8 2014

10
#logo {
    width: 400px;
    height: 200px;

    /*Scale down will take the necessary specified space that is 400px x 200px without stretching the image*/
    object-fit:scale-down;
}

7

divを作成し、クラスを与えます。次に、その中にimgをドロップします。

<div class="mydiv">

<img src="location/of/your/image" ></img>

</div>

divのサイズを設定し、相対的なものにします。

    .mydiv {
        position: relative;
        height:300px;
        width: 100%;
        overflow: hidden;
    }

次に、画像のスタイルを設定します

img {
    width: 100%;
    height: auto;
    overflow: hidden;
}

お役に立てば幸いです


3

以下のように使用できます:

.width100 {
  max-width: 100px;
  height: 100px;
  width: auto;
  border: solid red;
}
<img src="https://www.gravatar.com/avatar/dc48e9b92e4210d7a3131b3ef46eb8b1?s=512&d=identicon&r=PG" class="width100" />


1

カプセル化する<div>または<span>を追加する必要がありますか?

私はあなたがそうだと思います。頭に浮かぶのはパディングだけですが、そのためには事前に画像のサイズを知っておく必要があります。



0

私が考えることができるのは、幅または高さのいずれかを伸ばして、比率アスペクトでサイズを変更することです。側面に空白があります。ワイドスクリーンが1024x768の解像度を表示する方法のようなもの。


0

フレックスボックスの使用が有効なオプションである場合(古いブラウザをサポートする必要はありません)、ここで他の回答を確認してください(これはおそらくこれと重複しています):

基本的に、imgタグをdivでラップする必要があり、cssは次のようになります。

.img__container {
    display: flex;
    padding: 15px 12px;
    box-sizing: border-box;
    width: 400px; height: 200px;

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

-1

これはかなり古い質問ですが、Chrome / Edge(object-fitプロパティを使用)ではすべてが正常に機能するというまったく同じ厄介な問題がありましたが、IE11では同じcssプロパティが機能しませんでした(IE11ではサポートされていないため)。私のすべての問題を解決したHTML5「figure」要素を使用しました。

私の場合、外側のDIVタグはまったく役に立たなかったため、個人的には使用しませんでした。そのため、外側のDIVを避け、単に「figure」要素に置き換えました。

次のコードは、画像を(元のアスペクト比を変更せずに)適切に縮小/縮小するように強制します。

<figure class="figure-class">
  <img class="image-class" src="{{photoURL}}" />
</figure>

およびcssクラス:

.image-class {
    border: 6px solid #E8E8E8;
    max-width: 189px;
    max-height: 189px;
}

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