Wie passe ich ein Bild (img) in ein div ein und behalte das Seitenverhältnis bei?

136

Ich habe ein 48x48 Div und darin befindet sich ein IMG-Element. Ich möchte es in das Div einpassen, ohne einen Teil zu verlieren. In der Zwischenzeit wird das Verhältnis beibehalten. Ist es mit HTML und CSS erreichbar?

Bin Chen
quelle

Antworten:

70

Sie benötigen JavaScript, um das Zuschneiden zu verhindern, wenn Sie die Dimension des Bildes zum Zeitpunkt des Schreibens des CSS nicht kennen.

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%;
}

Wenn Sie eine JavaScript-Bibliothek verwenden, möchten Sie diese möglicherweise nutzen.

Thomas
quelle
2
Michaels Antwort ist viel einfacher und es wird kein Javascript verwendet. Ich weiß jedoch nichts über die Browserkompatibilität.
weberc2
3
Nein, Michaels Antwort funktioniert, solange das Bild größer als das Div ist. Wenn Sie möchten, dass das Bild das Div in Bezug auf die Bildgröße ausfüllt (und wenn Sie die Bildgröße nicht im Voraus kennen, tun Sie dies), ist dies der richtige Weg.
Rémy DAVID
2
Könnten Sie nicht max-height verwenden: 100%; maximale Breite: 100%; Mindestbreite: 100%; min-height: 100% und dann das gleiche Ergebnis erzielen? Ehrliche Frage.
Daniel Casserly
Nein, auf diese Weise erzwingen Sie eine Breite und Höhe von 100%, sodass Sie das Bildseitenverhältnis ändern.
Gztomas
onload wird nicht aufgerufen, wenn das Bild im Browser zwischengespeichert wird. Dies funktioniert also nur, wenn das Bild zum ersten Mal geladen wird.
Redtopia
314

Verwenden Sie max-height:100%; max-width:100%;für das Bild innerhalb der div.

Michael
quelle
4
@ZoveGames Nicht JS-fähige Browser? Die Yahoo-Statistiken von 2010 zeigen einen Durchschnitt von 1,3%. Ich denke, es ist sicher anzunehmen, dass a. es ist heute wahrscheinlich niedriger und b. programmers.stackexchange.com/questions/26179/…
EasyCo
5
Es funktioniert nicht für mich ... Es macht das Bild 100% seiner eigenen Größe (zB: 300px breit für ein Bild, das tatsächlich 300px breit ist).
Tomáš Zato - Wiedereinsetzung Monica
1
Es gibt einige schreckliche Chrome-unter-Windows-spezifische Fehler, die dies verursacht. Möglicherweise eine schlechte Interaktion mit bestimmten Smoothscroll-Plugins, die ich habe. Am Ende wird versucht, den Körper zu scrollen, obwohl sich die Maus über einem overflow:scrollDiv mit einem großen Bild befindet. Neugierig. Noch seltsamer: Max 'Lösung behebt das Problem tatsächlich. Ich habe CSS wirklich satt. Früher war es kraftvoll und cool. Jetzt erzeugen Implementierungen nur fehlerhafte Inkonsistenzen nach fehlerhaften Inkonsistenzen.
Steven Lu
21
funktioniert nur beim Verkleinern eines Bildes. Wenn Sie ein kleines Bild in einen größeren Behälter passen möchten, funktioniert dies nicht
Yossi Shasho
2
Das ursprüngliche Seitenverhältnis des Bildes bleibt nicht erhalten.
αsααc t ի ε βöss
78

Leider decken max-width + max-height meine Aufgabe nicht vollständig ab ... Also habe ich eine andere Lösung gefunden:

Um das Bildverhältnis während der Skalierung zu speichern, können Sie auch die object-fitCSS3-Eigenschaft verwenden.

Nützlicher Artikel: Steuern Sie die Bildseitenverhältnisse mit CSS3

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

Schlechte Nachrichten: IE wird nicht unterstützt ( kann ich verwenden )

Andrii Verbytskyi
quelle
6
Dies muss als Antwort markiert werden. "Objektanpassung" hat einwandfrei funktioniert.
αsααc t ի ε βöss
Seltsamerweise wurde die Unterstützung dafür in iOS 8.1 und nicht in 8.0 eingeführt.
Ray
2
object-fit: cover; arbeitete für mich. Hier: stackoverflow.com/questions/9071830/…
Deke
1
Wenn Sie möchten, dass das Bild oben links und nicht zentriert ist, müssen Sie auch die Objektposition 0 0 verwenden.
Chris Rae
Dies ist die einzige Antwort, die für mich funktioniert hat, um einen reaktionsschnellen Bildhintergrund zu erstellen, der den Bildschirm ausfüllt und gleichzeitig das Bildseitenverhältnis beibehält.
Ray Li
39

Nur CSS verwenden:

div > img {
  width: auto;
  height : auto;
  max-height: 100%;
  max-width: 100%;
}
Max
quelle
skaliert nicht
JFFIGK
17

HTML

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

CSS

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

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

Dadurch wird das Bild erweitert, um das übergeordnete Bild zu füllen, dessen Größe im divCSS festgelegt ist.

Alex
quelle
2
Fügen Sie nicht hinzu height: 100%, da dies das Bildverhältnis verzerrt - das OP möchte das Verhältnis beibehalten.
Casablanca
Ich bin mir nicht sicher, was das OP bedeutete, aber da würden Sie das Verhältnis nicht richtig halten?
Trufa
Was kann ich tun, um das Verhältnis beizubehalten? Wenn ich die Höhe lösche: 100%, wird das Bild zugeschnitten.
Bin Chen
7

Ich hatte viele Probleme, dies zum Laufen zu bringen. Jede einzelne Lösung, die ich fand, schien nicht zu funktionieren.

Mir wurde klar, dass ich die Div-Anzeige auf Flex einstellen musste, also ist dies im Grunde mein CSS:

div{
display: flex;
}

div img{ 
max-height: 100%;
max-width: 100%;
}
Bartho Bernsmann
quelle
Meine Bilder sind mit dieser Lösung in Chrome Version 61
Yevgeniy Afanasyev
Möglicherweise hat Ihr Div eine maximale Höhe / Höhe oder Breite eingestellt, was zu Bildverzerrungen führt.
Bartho Bernsmann
Genau mein Punkt. Das Bild ist verzerrt, weil Sie die Breite und Höhe auf Ihrem <div class = "w">
einstellen
Für Ihr Beispiel. Ich glaube, Sie suchen nach etwas wie auf Ihrem Bild CSS: height: auto; Breite: 100%;
Bartho Bernsmann
Die Aufgabe bestand darin, das Bild in ein Div zu integrieren. Dies impliziert, dass Div die Abmessungen hat und das Bild nur ein Seitenverhältnis hat. Ich muss die Höhe auf einen bestimmten Wert einstellen, da sonst die Fragenbedingungen und mein Bild verzerrt werden. Bitte werfen Sie einen Blick auf JS Fiddle und ändern Sie, was Ihrer Meinung nach erforderlich ist, damit es funktioniert. Vielen Dank.
Jewgenij Afanasjew
6

Versuchen Sie CSS:

img {
  object-fit: cover;
  height: 48px;
}
Faisal
quelle
3

Für mich hat das folgende CSS funktioniert (getestet in Chrome, Firefox und Safari).

Es gibt mehrere Dinge, die zusammenarbeiten:

  • max-height: 100%;, max-width: 100%;Und height: auto;, width: auto;machen den img Skala ersten 100% erreicht zu welcher Dimension , während das Seitenverhältnis bleibt dabei erhalten
  • position: relative;im behälter und position: absolute;im kind zusammen mit top: 50%;und left: 50%;zentrieren der oberen linken ecke des img im behälter
  • transform: translate(-50%, -50%); Bewegt das Bild um die Hälfte seiner Größe nach links und oben zurück und zentriert so das Bild im Behälter

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%);
}
VSchlattinger
quelle
1

Wenn Sie das Foto als Hintergrundbild festlegen, haben wir mehr Kontrolle über Größe und Platzierung, sodass das img-Tag einem anderen Zweck dient ...

Wenn wir möchten, dass das div das gleiche Seitenverhältnis wie das Foto hat, ist placeholder.png ein kleines transparentes Bild mit dem gleichen Seitenverhältnis wie photo.jpg. Wenn es sich bei dem Foto um ein Quadrat handelt, handelt es sich um einen Platzhalter im Format 1 x 1 Pixel. Wenn es sich bei dem Foto um ein Miniaturbild des Videos handelt, handelt es sich um einen Platzhalter im Format 16 x 9 usw.

Verwenden Sie für die Frage einen 1x1-Platzhalter, um das quadratische Verhältnis des Div beizubehalten, und ein Hintergrundbild background-size, um das Seitenverhältnis des Fotos beizubehalten.

Ich habe verwendet, background-position: center center;damit das Foto in der Div zentriert wird. (Wenn Sie das Foto in der vertikalen Mitte oder unten ausrichten, wird das Foto im img-Tag hässlich.)

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>

Um eine zusätzliche http-Anforderung zu vermeiden, konvertieren Sie das Platzhalterbild in eine Daten-URL .

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

Sie können die Klasse "img-fluid" für eine neuere Version verwenden, dh Bootstrap v4 .

und kann die Klasse "img-responsive" für ältere Versionen wie Bootstrap v3 verwenden .

Verwendung : -

img tag mit: -

class = "img-fluid"

src = "..."

Saurabh Sheorain
quelle
0

Hier ist ein All-JavaScript-Ansatz. Es skaliert ein Bild schrittweise nach unten, bis es richtig passt. Sie legen fest, um wie viel es bei jedem Ausfall verkleinert werden soll. In diesem Beispiel wird es jedes Mal um 10% verkleinert, wenn es fehlschlägt:

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);
});

Fühlen Sie sich frei, direkt zu kopieren und einzufügen.

Jared Beach
quelle
0

Was für mich funktioniert hat war:

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

Inline-Flex war erforderlich, um zu verhindern, dass die Bilder außerhalb des Divs angezeigt werden.

Nomad77
quelle