Bildgröße im CSS-FlexBox-Layout automatisch ändern und Seitenverhältnis beibehalten?

96

Ich habe das CSS-Flexbox-Layout verwendet, das wie folgt aussieht:

Geben Sie hier die Bildbeschreibung ein

Wenn der Bildschirm kleiner wird, wird daraus:

Geben Sie hier die Bildbeschreibung ein

Das Problem ist, dass die Größe der Bilder nicht geändert wird, wobei das Seitenverhältnis vom Originalbild beibehalten wird.

Ist es möglich, reines CSS und das Flexbox-Layout zu verwenden, um die Größe der Bilder zu ändern, wenn der Bildschirm kleiner wird?

Hier ist mein HTML:

<div class="content">
  <div class="row"> 
    <div class="cell">
      <img src="http://i.imgur.com/OUla6mK.jpg"/>
    </div>
    <div class="cell">
      <img src="http://i.imgur.com/M16WzMd.jpg"/>
    </div>
  </div>
</div>

mein CSS:

.content {
    background-color: yellow;    
}

.row {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;

    -webkit-box-orient: horizontal; 
    -moz-box-orient: horizontal;
    box-orient: horizontal;
    flex-direction: row;

    -webkit-box-pack: center;
    -moz-box-pack: center;
    box-pack: center;
    justify-content: center;

    -webkit-box-align: center;
    -moz-box-align: center;
    box-align: center;  
    align-items: center;

    background-color: red;

}

.cell {
    -webkit-box-flex: 1;
    -moz-box-flex: 1;
    box-flex: 1;
    -webkit-flex: 1 1 auto;
    flex: 1 1 auto; 

    padding: 10px;
    margin: 10px;

    background-color: green;
    border: 1px solid red;
    text-align: center;

}
konfile
quelle

Antworten:

82

img {max-width:100%;}ist eine Möglichkeit, dies zu tun. Fügen Sie es einfach Ihrem CSS-Code hinzu.

http://jsfiddle.net/89dtxt6s/

Omega
quelle
3
Ist dies auch für die Höhenabmessung möglich, wenn der Bildschirm kleiner wird?
Confile
@confile es würde viel von Ihrem Code-Layout abhängen, aber Sie können versuchen, height:100%;zu imgCSS hinzuzufügen .
Omega
height: 100vhwürde es tun, nicht height: 100%. Das Styling für die Höhe ist immer schwierig.
GDBJ
1
Warum ist dies als die richtige Antwort markiert? Hat Omega es nicht zum Standardverhalten des Browsers gemacht? jsfiddle.net/89dtxt6s/221
VeeK
69

Ich kam hierher, um eine Antwort auf meine verzerrten Bilder zu suchen. Ich bin align-items: centermir nicht ganz sicher, wonach die Operation oben sucht, aber ich fand, dass das Hinzufügen sie für mich lösen würde. Wenn Sie die Dokumente lesen, ist es sinnvoll, dies zu überschreiben, wenn Sie Bilder direkt biegen, da dies align-items: stretchdie Standardeinstellung ist. Eine andere Lösung besteht darin, Ihre Bilder zuerst mit einem Div zu versehen.

.myFlexedImage {
  display: flex;
  flex-flow: row nowrap;
  align-items: center;
}
gdbj
quelle
11
"Ich bin hierher gekommen, um eine Antwort auf meine verzerrten Bilder zu suchen." Ich bin aus demselben Grund hierher gekommen und Ihre Lösung hat mir geholfen (was als die eigentliche Lösung markiert wurde, hat mir überhaupt nicht geholfen)
Wagner da Silva
das hat mir auch geholfen, kann mir jemand erklären warum das funktioniert?
Jerry B. Nr. 1 Praktikant
Das war die richtige Antwort für mich. maximale Breite: 100%; korrigierte die Höhe nicht (Höhe war noch leicht gedehnt). In meinem Fall habe ich Align-Items verwendet: Flex-Start; weil ich nicht wollte, dass das Bild vertikal im Container zentriert wird, aber es funktionierte trotzdem, da es die Standardausrichtungselemente überschreibt: strecken; Hier ist eine Liste aller Eigenschaftswerte für Align-Elemente, die Sie zum Überschreiben verwenden können: w3schools.com/cssref/css3_pr_align-items.asp
Kyle Vassella
Ich habe viele Dinge ausprobiert, aber Ihre Ausrichtungselemente: Das Zentrum auf dem Elternteil ist der einzige, der den Trick gemacht hat.
Micros
Dies sollte die akzeptierte Antwort sein. Align-Content hat bei mir in Bezug auf das Dehnen nicht funktioniert, Align-Items haben jedoch unterschiedliche Funktionen. Diese SE klärt den Unterschied zwischen den beiden: stackoverflow.com/questions/27539262/…
John Ernest
40

Vielleicht möchten Sie die sehr neue und einfache CSS3-Funktion ausprobieren:

img { 
  object-fit: contain;
}

Das Bildverhältnis bleibt erhalten (wie bei Verwendung des Hintergrundbildtricks), und in meinem Fall hat es für dasselbe Problem gut funktioniert.

Seien Sie jedoch vorsichtig, es wird vom IE nicht unterstützt (siehe Support-Details hier ).

Lokinou
quelle
4
Bitte denken Sie daran, dass das übergeordnete Objekt ein Flex sein muss
Lokinou
Ich habe es versucht und es hat perfekt innerhalb eines Flex Div funktioniert.
Rémy Kaloustian
5

Ich schlage vor, nach background-sizeOptionen zum Anpassen der Bildgröße zu suchen .

Anstatt das Bild auf der Seite zu haben, wenn Sie es als Hintergrundbild festgelegt haben, können Sie Folgendes festlegen:

background-size: contain

oder

background-size: cover

Diese Optionen berücksichtigen beim Skalieren des Bildes sowohl die Höhe als auch die Breite. Dies funktioniert in IE9 und allen anderen aktuellen Browsern.

user3196436
quelle
3

Im zweiten Bild sieht es so aus, als ob Sie möchten, dass das Bild das Feld ausfüllt, aber das von Ihnen erstellte Beispiel behält das Seitenverhältnis bei (die Haustiere sehen normal aus, nicht schlank oder fett).

Ich habe keine Ahnung, ob Sie diese Bilder als Beispiel mit Photoshops versehen haben oder das zweite ist "wie es sein sollte" (Sie sagten IS, während das erste Beispiel "sollte" sagte).

Jedenfalls muss ich annehmen:

Wenn "die Größe der Bilder nicht unter Beibehaltung des Seitenverhältnisses geändert wird" und Sie mir ein Bild zeigen, das das Seitenverhältnis der Pixel beibehält, muss ich davon ausgehen, dass Sie versuchen, das Seitenverhältnis des "Zuschneide" -Bereichs (das Innere von) zu erreichen das Grün) WILE behält das Seitenverhältnis der Pixel bei. Das heißt, Sie möchten die Zelle mit dem Bild füllen, indem Sie das Bild vergrößern und zuschneiden.

Wenn dies Ihr Problem ist, spiegelt der von Ihnen angegebene Code NICHT "Ihr Problem" wider, sondern Ihr Startbeispiel.

Unter den beiden vorhergehenden Annahmen kann das, was Sie benötigen, nicht mit tatsächlichen Bildern erreicht werden, wenn die Höhe der Box dynamisch ist, sondern mit Hintergrundbildern. Entweder mithilfe von "Hintergrundgröße: Enthalten" oder diesen Techniken (intelligente Auffüllungen in Prozent, die das Zuschneiden begrenzen, oder die maximale Größe, wo immer Sie möchten): http://fofwebdesign.co.uk/template/_testing/scale-img/scale- img.htm

Dies ist mit Bildern nur möglich, wenn wir Ihr zweites Bild VERGESSEN und die Zellen eine feste Höhe haben. Glücklicherweise bleibt die Höhe nach Ihren Beispielbildern gleich!

Wenn sich also die Höhe Ihres Containers nicht ändert und Sie Ihre Bilder quadratisch halten möchten, müssen Sie nur die maximale Höhe der Bilder auf diesen bekannten Wert einstellen (minus Auffüllungen oder Rahmen, abhängig von der Box-Size-Eigenschaft des Zellen)

So was:

<div class="content">
  <div class="row">    
      <div class="cell">    
          <img src="http://lorempixel.com/output/people-q-c-320-320-2.jpg"/>
      </div>
      <div class="cell">    
          <img src="http://lorempixel.com/output/people-q-c-320-320-7.jpg"/>
      </div>
    </div>
</div>

Und das CSS:

.content {
    background-color: green;
}

.row {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;

    -webkit-box-orient: horizontal; 
    -moz-box-orient: horizontal;
    box-orient: horizontal;
    flex-direction: row;

    -webkit-box-pack: center;
    -moz-box-pack: center;
    box-pack: center;
    justify-content: center;

    -webkit-box-align: center;
    -moz-box-align: center;
    box-align: center;  
    align-items: center;

}

.cell {
    -webkit-box-flex: 1;
    -moz-box-flex: 1;
    box-flex: 1;
    -webkit-flex: 1 1 auto;
    flex: 1 1 auto;
    padding: 10px;
    border: solid 10px red;
    text-align: center;
    height: 300px;
    display: flex;
    align-items: center;
    box-sizing: content-box;
}
img {
    margin: auto;
    width: 100%;
    max-width: 300px;
    max-height:100%
}

http://jsfiddle.net/z25heocL/

Ihr Code ist ungültig (öffnende Tags sind nicht schließende Tags, daher geben sie NESTED-Zellen aus, keine Geschwister. Er hat einen SCREENSHOT Ihrer Bilder im fehlerhaften Code verwendet, und die Flexbox enthält nicht die Zellen, sondern beide Beispiele in einer Spalte ( Sie haben "row" eingerichtet, aber der beschädigte Code, der eine Zelle in der anderen verschachtelt, führte zu einem Flex innerhalb eines Flex, der schließlich als COLUMNS fungierte. Ich habe keine Ahnung, was Sie erreichen wollten und wie Sie auf diesen Code gekommen sind, aber ich ' Ich vermute, was Sie wollen, ist dies.

Ich habe den Zellen auch display: flex hinzugefügt, damit das Bild zentriert wird (ich denke, display: tablees hätte auch hier mit all diesen Markups verwendet werden können).

Sergio
quelle
Es scheint nicht, dass Sie die geringste Ahnung haben, wie die Frage von mir beantwortet wurde. Alles HTML und CSS in dieser jsfiddle ist das, was der Fragesteller (@confile) bereitgestellt hat. Lesen Sie einfach die Frage und Sie würden das sehen. Meine Lösung ist eine einfache Zeile von css img {max-width: 100%;}, und der Fragesteller hat meine Antwort vor über einem Jahr akzeptiert, da sie die gewünschte Lösung bietet. Ich wünsche Ihnen hier alles Gute, bitte versuchen Sie, die Fragen richtig zu lesen und antworten Sie dann in Zukunft entsprechend, danke.
Omega
0

HTML:

<div class="container">
    <div class="box">
        <img src="http://lorempixel.com/1600/1200/" alt="">
    </div>
</div>

CSS:

.container {
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: stretch;

  width: 100%;
  height: 100%;

  border-radius: 4px;
  background-color: hsl(0, 0%, 96%);
}

.box {
  border-radius: 4px;
  display: flex;
}

.box img {
  width: 100%;
  object-fit: contain;
  border-radius: 4px;
}
Ukr
quelle
0

So würde ich mit verschiedenen Bildern (Größen und Proportionen) in einem flexiblen Raster umgehen.

.images {
  display: flex;
  flex-wrap: wrap;
  margin: -20px;
}

.imagewrapper {
  display: flex;
  justify-content: center;
  align-items: center;
  width: calc(50% - 20px);
  height: 300px;
  margin: 10px;
}

.image {
  display: block;
  object-fit: cover;
  width: 100%;
  height: 100%; /* set to 'auto' in IE11 to avoid distortions */
}
<div class="images">
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/800x600" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/1024x768" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/1000x800" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/500x800" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/800x600" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/1024x768" />
  </div>
</div>

ggzone
quelle
-5

Ich benutze jquery oder vw, um das Verhältnis zu halten

jquery

function setSize() {
    var $h = $('.cell').width();
    $('.your-img-class').height($h);
}
$(setSize);
$( window ).resize(setSize); 

vw

 .cell{
    width:30vw;
    height:30vw;
}
.cell img{
    width:100%;
    height:100%;
}
Erick Boileau
quelle