Wie kann ich mit dem CSS-Flexbox-Modell ein Bild zwingen, sein Seitenverhältnis beizubehalten?
JS Fiddle: http://jsfiddle.net/xLc2Le0k/2/
Beachten Sie, dass sich die Bilder dehnen oder verkleinern, um die Breite des Containers auszufüllen. Das ist in Ordnung, aber können wir es auch dehnen oder verkleinern lassen, um die Bildproportionen beizubehalten?
HTML
<div class="slider">
<img src="http://www.placebacon.net/400/300" alt="Bacn">
<img src="http://www.placebacon.net/400/300" alt="Bacn">
<img src="http://www.placebacon.net/400/300" alt="Bacn">
<img src="http://www.placebacon.net/400/300" alt="Bacn">
</div>
CSS
.slider {
display: flex;
}
.slider img {
margin: 0 5px;
}
<div>
mit dem CSSbackground-image: url(...);background-size:contain; background-repeat:no-repeat
Antworten:
Wenn Sie für IMG-Tags eine Seite definieren, wird die Größe der anderen Seite geändert, um das Seitenverhältnis beizubehalten, und standardmäßig werden Bilder auf ihre ursprüngliche Größe erweitert.
Wenn Sie diese Tatsache verwenden, wenn Sie jedes img-Tag in ein div-Tag einwickeln und seine Breite auf 100% des übergeordneten div einstellen, entspricht die Höhe dem gewünschten Seitenverhältnis.
http://jsfiddle.net/0o5tpbxg/
quelle
Um zu verhindern, dass sich Bilder in einem flexiblen Elternteil in einer der Achsen dehnen, habe ich einige Lösungen gefunden.
Sie können versuchen, die Objektanpassung für das Bild zu verwenden, z
http://jsfiddle.net/ykw3sfjd/
Oder Sie können flexspezifische Regeln hinzufügen, die in einigen Fällen besser funktionieren.
quelle
object-fit: contain;
tat den Trick für mich, als ich nur das Problem in Chrom hatte, ff war in Ordnung.Es ist nicht erforderlich, ein enthaltendes div hinzuzufügen.
Die Standardeinstellung für die CSS-Eigenschaft "Align-Items" ist "Stretch". Dadurch werden Ihre Bilder auf ihre volle ursprüngliche Höhe gedehnt. Wenn Sie die CSS-Eigenschaft "align-items" auf "flex-start" setzen, wird Ihr Problem behoben.
quelle
Dies funktioniert jedoch nicht wie erwartet, wenn die Bilder, soweit ich weiß , mit dem aktuellen Flexible Box Layout Module Level 1 als direkte Flex-Elemente festgelegt werden .
Sehen Sie sich diese Diskussionen an und Fehlerberichte könnten verwandt sein:
Um dieses Problem zu umgehen, können Sie jedes
<img>
mit einem<div>
oder einem<span>
oder so umschließen.jsFiddle
Alternativ können Sie
table
stattdessen das CSS- Layout verwenden, mit dem Sie ähnliche Ergebnisseflexbox
erzielen, da es auch für IE8 in mehr Browsern funktioniert.jsFiddle
quelle
.slider > div{min-width:0}
neue Browser, die dies unterstützenmin-width: auto
.auto
Wert als Standardwert fürmin-width
undmin-height
(zuvor0
) eingeführt. Chrome implementiert es noch nicht, sodass Ihr erstes Snippet funktioniert. Neue Browser benötigen es jedoch, damit die Flex-Elemente kleiner als die Standardbreite der Bilder werden.Ich habe in letzter Zeit mit Flexbox herumgespielt und bin durch Experimente und die folgenden Überlegungen zu einer Lösung gekommen. In Wirklichkeit bin ich mir jedoch nicht sicher, ob genau das passiert.
Wenn die tatsächliche Breite durch das Flex-System beeinflusst wird. Nachdem die Breite der Elemente die maximale Breite des übergeordneten Elements erreicht hat, wird die in CSS festgelegte zusätzliche Breite ignoriert. Dann ist es sicher, die Breite auf 100% einzustellen.
Da die Höhe des img-Tags vom Bild selbst abgeleitet wird, kann das Setzen der Höhe auf 0% etwas bewirken. (Hier ist mir unklar, was ... aber es machte für mich Sinn, dass es das Problem beheben sollte)
DEMO
(Denken Sie daran, es hier zuerst gesehen zu haben!)
Funktioniert noch nur in Chrom
quelle
auto
". Genau das passiert in Firefox.Dieses Verhalten wird erwartet. Der Flex-Container streckt standardmäßig alle seine untergeordneten Elemente. Bild haben keine Ausnahme. (dh Eltern haben
align-items: stretch
Eigentum)Um das Seitenverhältnis beizubehalten, haben wir zwei Lösungen:
align-items: stretch
durchalign-items: flex-start
oderalign-self: center
usw., http://jsfiddle.net/e394Lqnt/3/oder
align-self: center
oderalign-self: flex-start
usw. http://jsfiddle.net/e394Lqnt/2/quelle
Eigentlich habe ich herausgefunden, dass der Container des Bild-Tags eine Höhe haben muss, um das Verhältnis des Bildes beizubehalten. zum Beispiel>
dann wird Ihr Container in Ihrem HTML das Tag-Bild umschließen
Dies funktioniert für IE und andere Browser
quelle
Ich hatte gerade das gleiche Problem. Verwenden Sie die Flex-Ausrichtung, um Ihre Elemente zu zentrieren. Sie müssen
align-items: center
anstelle von verwendenalign-content: center
. Dadurch wird das Seitenverhältnis beibehalten, während bei der Ausrichtung des Inhalts das Seitenverhältnis nicht beibehalten wird.quelle