Zentrieren Sie ein großes Bild unbekannter Größe in einem kleineren Div mit verstecktem Überlauf

77

Ich möchte ein Bild in einem Div ohne Javascript und ohne Hintergrundbilder zentrieren .

Hier ist ein Beispielcode

<div> 
    <img src="/happy_cat.png"/> 
</div>
  • Ich kenne die Größe des Bilds nicht und es sollte in der Lage sein, die Breite des übergeordneten Elements zu überschreiten
  • Ich kenne die Breite des übergeordneten Div nicht (es ist 100%)
  • Das übergeordnete Div hat eine feste Höhe
  • Das Bild ist größer als das übergeordnete und das übergeordnete Bild hat einen Überlauf: versteckt
  • Müssen nur moderne Browser unterstützen

Erwünschtes Ergebnis. (Ignorieren Sie Trübungen usw., beachten Sie einfach die Positionierung).

Geben Sie hier die Bildbeschreibung ein

Ich weiß, dass dies mit Hintergrundbildern leicht möglich ist, aber das ist für mich keine Option. Ich könnte auch Javascript verwenden, aber es scheint ein sehr hartnäckiger Weg zu sein, dies zu erreichen.

Vielen Dank!

Jack

JackMahoney
quelle
3
Ich glaube nicht, dass dies nur mit CSS möglich ist. Sind Sie offen für jquery / js-Lösungen dafür?
Roy MJ
1
Ich möchte JS hier nur als letztes Ergebnis verwenden. Wenn dies nach einer Untersuchung unmöglich ist, werde ich mich zurückziehen und JS verwenden, aber ich bin sicher, dass dies mit einem raffinierten modernen CSS3 möglich ist.
JackMahoney
@JackMahoney Eine Frage: Wird die Abmessung (oder speziell die Höhe - da die Breite bereits 100% beträgt) des übergeordneten Elements <div>allein durch das Innenbild bestimmt?
Terry
Gute Frage. Die Größe des Elternteils ist bekannt und festgelegt.
JackMahoney
mögliches Duplikat des übergroßen Bildes in
dayuloli

Antworten:

105

Was ist damit:

.img {
   position: absolute;
   left: 50%;
   top: 50%;
   -webkit-transform: translateY(-50%) translateX(-50%);
}

Dies setzt voraus, dass das übergeordnete div relativ positioniert ist. Ich denke, das funktioniert, wenn Sie die .img eher relativ als absolut positioniert haben wollen. Entfernen Sie einfach die position: absoluteund ändern Sie oben / links zu margin-topund margin-left.

Sie wollen wahrscheinlich Browser - Unterstützung mit hinzuzufügen transform, -moz-transformusw.

Evan Layman
quelle
2
Ha - du weißt was das eigentlich funktioniert! Danke, Mann. Was für eine interessante Lösung. :)
JackMahoney
Ich habe kürzlich von der Übersetzungszentrierung erfahren und es ist großartig! Ich bin froh, dass es dir geholfen hat.
Evan Layman
1
Du hast keine Ahnung, wie viel Zeit du mir gespart hast!
Sydney 619
4
Dies funktioniert gut, aber wenn Sie eine IE8-kompatible Version möchten, sollten Sie die Antwort hier verwenden
Dayuloli
1
Diese Methode ist nicht perfekt, denn wenn Sie den Rand oben auf 50% ändern, basieren die 50% auf der übergeordneten Breite, aber nicht auf der übergeordneten Höhe (vorausgesetzt, die übergeordnete Breite entspricht nicht der Höhe), sodass ein Fehler auftritt Rand oben. Was sagst du zu dieser Situation?
Bald
51

Alte Frage, neue Antwort:

Wenn das Bild größer als das Umbruch-Div ist, funktioniert eine automatische Textausrichtung: Mitte oder Rand: Auto nicht. Wenn das Bild jedoch kleiner ist, führen Lösungen mit absoluter Positionierung oder einem negativen linken Rand zu seltsamen Effekten.

Wenn die Bildgröße (wie bei einem CSM) nicht im Voraus bekannt ist und möglicherweise größer oder kleiner als das Wrapping-Div ist, gibt es eine elegante CSS3-Lösung, die allen Zwecken dient:

div {
    display: flex;
    justify-content: center;
    height: 400px; /* or other desired height */
    overflow: hidden;
}
img {
    flex: none; /* keep aspect ratio */
}

Beachten Sie, dass Sie abhängig von anderen Regeln in Ihrem Stylesheet möglicherweise width: auto und / oder max-width: none an das img anhängen müssen.

RavanH
quelle
4
Das funktioniert gut. Wenn Sie auch vertikal zentrieren möchten, können Sie align-items: centerIhrem divContainer etwas hinzufügen .
Cory Gross
Genius. Vielen Dank! Ich habe auch Corys align-items: centerVorschlag für die vertikale Zentrierung verwendet, was ein Vergnügen war.
BigglesZX
3
Diese Art streckt das Bild in meinem Fall
Cedric Ipkiss
1
@ che-azeh es könnte eine andere CSS-Regel mit maximaler Höhe oder maximaler Breite geben, die auf Bilder
angewendet wird
1
tolle Lösung!
Ivan Doroshenko
2

Das ist immer etwas schwierig und es gibt viele Lösungen. Ich finde die beste Lösung die folgende. Dies zentriert es sowohl vertikal als auch horizontal.

CSS

#container {
    height: 400px;
    width: 400px;
}
.image {
    background: white;
    width: 100%;
    height: 100%;
    position: relative;
    overflow: hidden;
}

.left {
    width: 100px;
    height: 100%;
    z-index: 2;
    background: white;
    top: 0px;
    position: absolute;
    left: 0px;
}
.right {
    width: 100px;
    height: 100%;
    z-index: 2;
    position: absolute;
    background: white;
    top: 0px;
    right: 0px;
}
.image img {
    margin: auto;
    display: block;
}

HTML

    <div id="container">
<div class="image">
    <div class="left"></div>
    <div class="right"></div>
    <img width="500" src="https://www.google.com.au/images/srpr/logo11w.png" />
</div>

Siehe Geige

etwas andere Technik: Geige

Fahrrad
quelle
Dies funktioniert nicht, da Sie eine explizite Breite für den .centered-Container festgelegt haben. Ich kenne keine der Breiten des Elements!
JackMahoney
Wenn die Bildbreite größer als der Container ist, hilft die maximale Breite nicht, sie zu zentrieren. jsfiddle.net/ZXUxv/1
JackMahoney
Ich glaube nicht, dass Sie meine Anforderungen verstehen (sorry, wenn das unhöflich klingt). Selbst wenn ich eine maximale Breite festlege, wird das Bild selbst nicht zentriert, wenn es größer als der Container ist (den ich zulassen möchte). Ich kann die Größe des Bildes nicht auf eine maximale Breite beschränken. Es muss größer als sein Elternteil sein und in ihm zentriert sein. Siehe die js Geige in meinem letzten Kommentar. Es hat ein größeres Bild und eine maximale Breite.
JackMahoney
@ JackMahoney Entschuldigung, ich habe Ihren Kommentar nicht gesehen. Bitte überprüfen Sie die aktualisierte Geige. Es sollte tun, was Sie fragen. Ansonsten habe ich keine Ahnung, was Sie fragen.
Fahrrad
Entschuldigung, die aktualisierte Geige hat immer noch kein Bild, das im übergeordneten Element zentriert ist. Trotzdem danke für deine Zeit. Sehen Sie mein Bild in der aktualisierten Frage, wenn Sie durch die Frage verwirrt sind.
JackMahoney
2

Vielen Dank an alle für Ihre Hilfe. Ich werde dies nur in CSS für unerreichbar halten.

Ich werde zu einer jQuery-Lösung wechseln. Hier ist ein [Pseudo] Code für Interessierte.

Ich wollte eine CSS-Lösung aufgeben, aber es sieht so aus, als ob dies möglich ist (siehe akzeptierte Antwort). Hier ist die JS-Lösung, mit der ich gehen wollte.

var $img = $('img'),
    w = $img.width();

$img.css({marginLeft: -w});

Und das dazugehörige CSS

img{
  position:absolute;
  left:50%;
}
JackMahoney
quelle
2

Ich weiß, dass dies alt ist, aber ich habe auch eine reine CSS-Lösung gefunden, die der oben genannten sehr ähnlich ist.

.parent {
    float: left;
    position: relative;
    width: 14.529%; // Adjust to your needs
}

.parent img {
    margin: auto;
    max-width: none; // this was needed for my particular instance
    position: absolute;
    top: 11px; right: -50%; bottom: 0; left: -50%;
    z-index: 0;
}
Alles Grafik
quelle
1

Initialisieren Sie einfach die Position Ihres Bildes wie folgt.

HTML:

<div> 
    <img id="img" src="/happy_cat.png"/> 
</div>

CSS:

#img {
    left: 0;
    right: 0;
}

Oder schauen Sie mit einem margin: auto;

Dies ist für die horizontale Ausrichtung. Um es auch vertikal auszurichten, können Sie es display: table-cell;mit Ihrem <div>Dann tun , vertical-align: middle;aber es ist keine gute Übung, da Sie <div>kein Tisch sind.

Emilie
quelle
1
Dies funktioniert leider nicht für Bilder, deren Breite größer als die des übergeordneten Elements ist.
JackMahoney
Oh, das ist wahr. Das habe ich vermisst.
Emilie