Warum funktioniert die Objektanpassung in Flexbox nicht?
Lesezeit: 6 Minuten
Jack Guy
Ich habe mehrere Spalten, denen ich mit Flex die gleiche Breite gebe. Jeder enthält img -Tags, und ich möchte, dass diese Bilder die zeigen object-fit: cover Dimensionierung.
Die object-fit Die Eigenschaft gibt an, wie der Inhalt eines ersetzten Elements in die Box eingepasst werden soll, die durch seine verwendete Höhe und Breite festgelegt wird.
Der Schlüsselbegriff lautet: passend zu der durch seine verwendete Höhe und Breite festgelegten Box
Das Bild wird ersetzt, nicht sein Container. Und die durch ihre verwendete Höhe und Breite festgelegte Box bezieht sich auf das Bild selbst, nicht auf seinen Container.
Verschrotten Sie also den Container und machen Sie die Bilder selbst zu Flex-Items.
Die object-fit Die Eigenschaft gibt an, wie der Inhalt eines ersetzten Elements in die Box eingepasst werden soll, die durch seine verwendete Höhe und Breite festgelegt wird.
Hier sind drei der Werte:
cover
Der ersetzte Inhalt wird so bemessen, dass sein Seitenverhältnis beibehalten wird, während die gesamte Inhaltsbox des Elements ausgefüllt wird.
contain
Der ersetzte Inhalt wird so bemessen, dass sein Seitenverhältnis beibehalten wird, während er in die Inhaltsbox des Elements passt.
fill
Der ersetzte Inhalt wird so bemessen, dass er die Inhaltsbox des Elements ausfüllt.
Mit cover Das Bild behält sein Seitenverhältnis bei und deckt den gesamten verfügbaren Platz ab. Mit dieser Option kann ein Großteil eines Bildes außerhalb des Bildschirms beschnitten werden.
Mit contain Das Seitenverhältnis wird ebenfalls beibehalten, aber das Bild wird so skaliert, dass es in die Box passt. Dies kann zu Leerzeichen links und/oder rechts (Hochformat) oder oben und/oder unten (Querformat) führen. Die object-position -Eigenschaft kann verwendet werden, um das Bild innerhalb seiner Box zu verschieben.
Mit fill Das Seitenverhältnis wird aufgegeben und das Bild wird so bemessen, dass es in die Box passt.
Alternative, height: 100%; width: 100% damit die Bilder die gleiche Größe wie die Flex-Elemente haben.
– Oriol
10. Mai 2016 um 1:05 Uhr
Hinzufügen overflow: hidden zum img Deklaration war in meinem Fall entscheidend.
– Benutzer648519
10. Februar 2019 um 16:39 Uhr
Für IE11 Image Stretch Fix auch hinzufügen flex-shrink: 0 auf der <img/> selbst.
– Catamphetamin
15. November 2019 um 14:06 Uhr
“flex: none” zum Bildcontainer hat mir geholfen
– Oboroten
17. November 2020 um 11:03 Uhr
Oriol
Das Problem ist, dass object-fit gibt an, wie ein Bild in die gezeichnet wird imgaber Sie haben nicht die Größe dieser Elemente angegeben, sondern nur die Größe ihrer .test Eltern.
Eine Alternative zur Antwort von Michael_B besteht also darin, dass die Bilder dieselbe Größe wie die Flex-Elemente haben:
Das bemerke ich schon seit einiger Zeit object-fit funktioniert nicht von selbst. In allen Fällen, die ich gesehen habe, height und/oder width müssen in derselben Erklärung angegeben werden. Nichts darüber in der Spezifikation. dürfen object-fit von selbst funktionieren?
– Michael Benjamin
10. Mai 2016 um 11:46 Uhr
@Michael_B Mit nur einer Größe funktioniert es immer noch, aber es ist normalerweise nutzlos. object-fit ist im Grunde nützlich, wenn Sie die Größe geändert haben img Element ohne Beachtung des intrinsischen Seitenverhältnisses. Dann ist das Bild standardmäßig verzerrt (füllen), aber Sie möchten das Seitenverhältnis möglicherweise auf verschiedene Weise beibehalten (enthalten, abdecken). Wenn Sie nur eine Größe der img, die andere wird nach dem Seitenverhältnis berechnet. So alles object-fit Werte führen zum gleichen Ergebnis. Die Ausnahme ist, wenn Sie erweiterte Layouttechniken wie Flexbox verwenden, um die automatische Größe zu ändern, nachdem if aufgelöst wurde.
– Oriol
10. Mai 2016 um 12:00 Uhr
Ja, das war das Problem beim Testen width:100% auf der img im Originalcode. Es hat die Größe des Bildes geändert, aber die object-fit Eigentum wurde nutzlos. Danke für die Erklärung.
– Michael Benjamin
10. Mai 2016 um 12:18 Uhr
Ein weiterer Punkt, der nützlich sein könnte: Ich habe nicht bedacht height: 100% als allgemeine Lösung für das verschachtelte Bild, denn wenn der Container keine definierte Höhe hat, ein Prozentsatz height würde nicht funktionieren, es sei denn, absolut positionieren. Aber in diesem Fall funktioniert es, weil die Höhe des Containers definiert ist.
– Michael Benjamin
10. Mai 2016 um 13:35 Uhr
Für alle, die nicht einfach “den Container verschrotten und die Bilder selbst zu Flex-Items machen können”, fügen Sie einfach Containerebenen hinzu:
Als Unterstützung für die object-fit Funktionalität für Ihre Bilder in nicht kompatiblen Browsern können Sie eine CSS-Klasse mit erstellen background-image und background-size. Damit es den belegten Platz richtig berechnet, wickeln Sie ein ein img Element und machen es unsichtbar. Beispiel unten.
Wenn die <img/> gespannt ist 100% im IE11 dann hinzufügen flex-shrink: 0 auf der <img/> selbst, wie hier empfohlen: Flexbox auf IE11: Bild ohne Grund gestreckt?
8687700cookie-checkWarum funktioniert die Objektanpassung in Flexbox nicht?yes