Wie kann ich die Breite und Höhe eines Bildes einstellen, ohne es zu dehnen?

89

Wenn ich habe:

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

dann

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

wird sich dehnen, um diesen Raum zu füllen. Ich möchte, dass das Bild gleich groß bleibt, aber so viel Platz im DOM einnimmt. Muss ich eine Kapselung hinzufügen <div>oder <span>? Ich hasse es, Markups für das Styling hinzuzufügen.

Paul Tarjan
quelle
Wenn Sie sich noch im Stapelüberlauf befinden, möchten Sie die Antwort aktualisieren?
Mikemaccana

Antworten:

117

Ja, Sie benötigen ein Kapselungs-Div:

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

mit so etwas wie:

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

Andere Lösungen (Auffüllen, Rand) sind langwieriger (da Sie den richtigen Wert basierend auf den Bildabmessungen berechnen müssen), lassen jedoch nicht effektiv zu, dass der Container kleiner als das Bild ist.

Das Obige kann auch viel einfacher für verschiedene Layouts angepasst werden. Wenn Sie beispielsweise das Bild unten rechts sehen möchten:

#logo { position: relative; height: 100px; width: 200px; }
#logo img { position: absolute; right: 0; bottom: 0; }
Cletus
quelle
5
Sie können das <div> -Tag durch <figure> ersetzen: Fügt Semantik hinzu und können bei Bedarf eine Beschriftung (<figcaption>) dafür angeben. developer.mozilla.org/en-US/docs/Web/HTML/Element/figure
Mateus Leon
Wenn es für die Verwendung als Branding vorgesehen ist, verwenden Sie in der Website-Präsentation <h1> (falls Index) oder <p> (falls anders) und wenden Sie die Attribute title und alt auf <img> an, damit Sie SEO-freundliches Markup hinzufügen können . Sie sind ebenfalls Elemente auf Blockebene, wie div, und können Wrapper für Ihre Zuschneidefunktionalität sein.
Mateus Leon
3
Ich hatte keine Ahnung, dass Cletus ein Webentwickler war. Erstaunlich
Piyin
62

2017 Antwort

Die CSS-Objektanpassung funktioniert in allen aktuellen Browsern. Dadurch kann das imgElement größer sein, ohne das Bild zu dehnen.

Sie können object-fit: cover;Ihrem CSS hinzufügen .

Dante
quelle
2
Sie sollten wahrscheinlich erwähnen, auf welchen Browsern es funktioniert.
Nathan Tuggy
2
Überprüfen Sie diesen Link auf Browserkompatibilität: caniuse.com/#search=object-fit
Alessia
28

Laden Sie das Bild als Hintergrund für ein Div.

Anstatt von:

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

tun

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

Alle Browser beschneiden den Teil des Bildes, der nicht passt.
Dies hat mehrere Vorteile gegenüber dem Umschließen eines Elements, dessen Überlauf verborgen ist:

  1. Kein zusätzlicher Aufschlag. Das div ersetzt einfach das img.
  2. Zentrieren oder stellen Sie das Bild einfach auf einen anderen Versatz ein. z.B.url(pic) center top;
  3. Wiederholen Sie das Bild, wenn es klein genug ist. (OK, keine Ahnung, warum du das willst)
  4. Legen Sie eine Hintergrundfarbe in derselben Anweisung fest, wenden Sie dasselbe Bild problemlos auf mehrere Elemente an und alles, was für Hintergrundbilder gilt.

Update: Diese Antwort stammt aus der Zeit vor der Objektanpassung. Sie sollten jetzt wahrscheinlich Objektanpassung / Objektposition verwenden.

Es ist weiterhin nützlich für ältere Browser, für zusätzliche Eigenschaften (z. B. Hintergrundwiederholung) und für Randfälle (z. B. Problemumgehung von Chrome-Fehlern mit Flexbox und Objektposition sowie FFs (frühere?) Probleme mit Raster + Autohöhe + Objekt-). fit. Wrapper Divs in Grid / Flexbox liefern oft ... unintuitive Ergebnisse.)

SamGoody
quelle
4
Diejenigen, die eine -1 gaben, sollten dies bitte zum Nutzen anderer Benutzer erklären. Persönlich habe ich dies mit hervorragenden Ergebnissen getan, sogar unter IE6 und Safari unter iOS.
SamGoody
Ich wollte nur hinzufügen - dies ist im Allgemeinen ein guter Ansatz. Die Leute geben sogar Hintergrundpositionskoordinaten für Bild-Sprite-Blätter als Optimierung an. Ein Unterschied ist jedoch, dass es nicht den Fehlerereignishandler hat, den <img> hat
badunk
Ich habe dem Div auch eine Klasse mit folgenden Inhalten hinzugefügt:background-repeat:no-repeat !important; float:left; width:100px; height:100px;
Nils
2
Einige Browser drucken standardmäßig keine Hintergrundbilder. Dies ist daher möglicherweise kein guter Ansatz, wenn Benutzer diese Seite drucken sollen.
Bennett McElwee
5
Dies ist semantisch nicht korrekt. Wenn dies nützlich ist, warum platziert der HTML5 mehr bildbezogene Tags, um das semantische Bild mit figcaption zu optimieren? Verwenden Sie das img-Tag, für das es entwickelt wurde, und ersetzen Sie nicht mehr alles durch <div> s.
Mateus Leon
23

CSS3-Objektanpassung

Ich bin mir nicht sicher, inwieweit es von Webkit, IE und Firefox implementiert wurde. Aber Opera funktioniert wie Magie

object-fitfunktioniert mit SVG-Inhalten, aber der gleiche Effekt kann auch erzielt werden, indem das preserveAspectRatio=""Attribut in der SVG selbst festgelegt wird.

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

Chris Mills Demo gibt es hier http://dev.opera.com/articles/view/css3-object-fit-object-position/

die Krabbe
quelle
2
1+ Das ist wirklich cool. Schade, dass es nur eingeschränkten Support gibt. Chrome 32 ist anscheinend der erste, der dies ohne Herstellerpräfixe unterstützt.
Josh Crozier
Das ist fantastisch, wirkt wie ein Zauber. Nur das Hinzufügen einer einzelnen Eigenschaft hat alles behoben. Ich brauchte nur für Chrome und es funktioniert. Und ja, ohne Herstellerpräfix. Vielen Dank.
warumAto8
9
#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;
}
Manoj Selvin
quelle
7

Machen Sie ein Div und geben Sie ihm eine Klasse. Dann legen Sie ein Bild hinein.

<div class="mydiv">

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

</div>

Stellen Sie die Größe Ihres Div ein und machen Sie es relativ.

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

Stylen Sie dann Ihr Bild

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

hoffentlich hilft das

Sabba Keynejad
quelle
3

Sie können wie folgt verwenden:

.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" />

PurTahan
quelle
1

Muss ich eine Kapselung <div> oder <span> hinzufügen?

Ich denke du tust es. Das einzige, was mir in den Sinn kommt, ist das Auffüllen, aber dafür müssten Sie die Abmessungen des Bildes vorher kennen.

Pekka
quelle
0

Sie können versuchen, die Polsterung anstelle der Höhe / Breite einzustellen.

Segne Yahu
quelle
0

Was ich mir vorstellen kann, ist, entweder die Breite oder die Höhe zu dehnen und die Größe im Verhältnisaspekt zu ändern. Es wird etwas Leerraum an den Seiten geben. So etwas wie ein Breitbildschirm zeigt eine Auflösung von 1024x768 an.

Mauris
quelle
0

Wenn die Verwendung von Flexbox eine gültige Option für Sie ist (Sie müssen keine alten Browser unterstützen), überprüfen Sie meine andere Antwort hier (die möglicherweise ein Duplikat dieser ist):

Grundsätzlich müssten Sie Ihr IMG-Tag in ein Div einbinden, und Ihr CSS würde folgendermaßen aussehen:

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

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

Dies ist eine ziemlich alte Frage, aber ich hatte genau das gleiche nervige Problem, bei dem alles für Chrome / Edge (mit Objektanpassungseigenschaft) einwandfrei funktionierte, aber dieselbe CSS-Eigenschaft in IE11 nicht funktionierte (da sie in IE11 nicht unterstützt wird) mit HTML5 "figure" Element, das alle meine Probleme gelöst hat.

Ich persönlich habe das äußere DIV-Tag nicht verwendet, da dies in meinem Fall überhaupt nicht geholfen hat. Deshalb habe ich das äußere DIV vermieden und einfach durch das Element 'figure' ersetzt.

Der folgende Code zwingt das Bild, es zu verkleinern / zu verkleinern (ohne das ursprüngliche Seitenverhältnis zu ändern).

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

und CSS-Klassen:

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

.figure-class {
    width: 189px;
    height: 189px;
}
nakul2013
quelle