Ich habe versucht herauszufinden, wie ein übergroßes Bild innerhalb eines Divs nur mit CSS zentriert werden kann.
Wir verwenden ein flüssiges Layout, daher variiert die Breite der Bildcontainer mit der Seitenbreite (die Höhe von div ist fest). Das Bild befindet sich in einem Div, wobei ein eingefügter Boxshadow so bewertet wird, als ob Sie durch die Seite auf das Bild schauen.
Das Bild selbst wurde so dimensioniert, dass es das umgebende Div mit seinem größtmöglichen Wert ausfüllt (das Design hat eine max-width
Wert).
Es ist ziemlich einfach, wenn das Bild kleiner als das umgebende Div ist:
margin-left: auto;
margin-right: auto;
display: block;
Aber wenn das Bild größer als das Div ist, beginnt es einfach am linken Rand und ist außermittig rechts (wir verwenden) overflow: hidden
).
Wir könnten eine zuweisen width=100%
, aber Browser machen einen miesen Job beim Ändern der Bildgröße, und das Webdesign konzentriert sich auf qualitativ hochwertige Bilder.
Irgendwelche Ideen zum Zentrieren des Bildes, damit overflow:hidden
beide Kanten gleichmäßig abgeschnitten werden?
Antworten:
Versuchen Sie so etwas. Dies sollte jedes große Element in der Mitte vertikal und horizontal in Bezug auf sein übergeordnetes Element zentrieren, unabhängig von beiden Größen.
quelle
-100%
für oben / rechts / unten / links verwenden? Damit könnte der Container buchstäblich jede Breite haben.-100%
Problem auch erlebt ^^. Übrigens: Wenn Sie hinzufügenmin-width
undmin-height
von100%
Ihnen im Grunde einbackground-size: cover;
Verhalten mit Bild-Tags bekommen -> jsfiddleDies ist ein altes Q, aber eine moderne Lösung ohne Flexbox oder Positions absolut funktioniert so.
Code-Snippet anzeigen
Warum funktioniert es also?
Auf den ersten Blick scheinen wir 50% nach rechts und dann wieder 50% nach links zu verschieben. Das würde zu einer Nullpunktverschiebung führen, na und?
Aber die 50% sind nicht gleich, weil der Kontext wichtig ist. Wenn Sie relative Einheiten verwenden, wird ein Rand als Prozentsatz der Breite des übergeordneten Elements berechnet , während die Transformation 50% relativ zum selben Element beträgt.
Wir haben diese Situation, bevor wir das CSS hinzufügen
Mit dem zusätzlichen Stil haben
margin-left: 50%
wirUnd die
transform: translateX(-50%)
Verschiebung zurück nach linksLeider funktioniert dies nur für die horizontale Zentrierung, da die Berechnung des Randprozentsatzes immer relativ zur Breite ist. Dh nicht nur
margin-left
undmargin-right
, sondern auchmargin-top
undmargin-bottom
werden in Bezug auf die Breite berechnet.Die Browserkompatibilität sollte kein Problem sein: https://caniuse.com/#feat=transforms2d
quelle
margin-top: 50%
es 50% der Breite beträgt . nicht die gewünschte Höhe.-webkit-transform: translateX(-50%);
für ein gutes Maß)Setzen Sie ein großes Div in das Div, zentrieren Sie das und zentrieren Sie das Bild in diesem Div.
Dies zentriert es horizontal:
HTML:
CSS:
Demo: http://jsfiddle.net/Guffa/L9BnL/
Um es auch vertikal zu zentrieren, können Sie dasselbe für das innere Div verwenden, aber Sie benötigen die Höhe des Bildes, um es absolut darin zu platzieren.
quelle
width
Einstellung im Container entferne , entspricht dies der Breite des übergeordneten Elements , und das Bild wird zentriert, auch wenn die Seite schmaler als das Bild ist, dh so viel vom linken Rand wie vom rechten Rand ausgeblendet wird : jsfiddle.net/Guffa/L9BnL/2Spät zum Spiel, aber ich fand diese Methode äußerst intuitiv. https://codepen.io/adamchenwei/pen/BRNxJr
CSS
HTML
quelle
display: flex
auf dem übergeordneten Container undalign-self: center
auf dem Bild ausgeführt. Hier ist eine optimierte Version: codepen.io/anon/pen/dWKyeyVerwenden Sie keine feste oder explizite Breite oder Höhe für das Bild-Tag. Codieren Sie es stattdessen:
Beispiel: http://jsfiddle.net/xwrvxser/1/
quelle
Ich bin ein großer Fan davon, ein Bild zum Hintergrund eines Div / Node zu machen - dann können Sie es einfach mit dem
background-position: center
Attribut zentrieren, unabhängig von der Bildschirmgrößequelle
Die Breite und Höhe sind nur zum Beispiel:
Es muss für Sie funktionieren, wenn das linke und das obere Ende Ihres übergeordneten Divs nicht ganz oben und links vom Fenster Ihres Bildschirms sind. Für mich geht das.
quelle
Ich fand, dass dies eine elegantere Lösung ohne Flex ist:
quelle
Aufbauend auf der großartigen Antwort von @ yunzen:
Ich vermute, dass viele Leute, die nach diesem Thema suchen, versuchen, ein großes Bild als "Helden" -Hintergrundbild zu verwenden, zum Beispiel auf einer Homepage. In diesem Fall möchten sie häufig, dass Text über dem Bild angezeigt wird und auf Mobilgeräten gut verkleinert wird.
Hier ist das perfekte CSS für ein solches Hintergrundbild (verwenden Sie es auf dem
<img>
Tag):quelle
Eine Option, die Sie verwenden können, ist, dass
object-fit: cover
es sich ein bisschen wie verhältbackground-size: cover
. Mehr zur Objektanpassung .Ignoriere alle JS unten, das ist nur für die Demo.
Der Schlüssel hier ist, dass Sie das Bild in einem Wrapper festlegen und ihm die folgenden Eigenschaften geben müssen.
Ich habe unten eine Demo erstellt, in der Sie die Höhe / Breite des Wrappers ändern und im Spiel sehen. Das Bild wird immer vertikal und horizontal zentriert. Es nimmt 100% seiner übergeordneten Breite und Höhe ein und wird nicht gedehnt / gequetscht. Dies bedeutet, dass das Seitenverhältnis des Bildes beibehalten wird. Die Änderungen werden stattdessen durch Vergrößern / Verkleinern übernommen.
Der einzige Nachteil
object-fit
ist, dass es unter IE11 nicht funktioniert .quelle