Ridimensiona automaticamente l'immagine nel layout CSS FlexBox e mantiene le proporzioni?


99

Ho usato il layout CSS flex box che appare come mostrato di seguito:

inserisci qui la descrizione dell'immagine

Se lo schermo si rimpicciolisce, si trasforma in questo:

inserisci qui la descrizione dell'immagine

Il problema è che le immagini non vengono ridimensionate mantenendo le proporzioni dell'immagine originale.

È possibile utilizzare CSS puro e il layout flex box per ridimensionare le immagini se lo schermo si rimpicciolisce?

Ecco il mio 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>

il mio 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;

}

Risposte:


84

img {max-width:100%;}è un modo per farlo. Aggiungilo al tuo codice CSS.

http://jsfiddle.net/89dtxt6s/


3
È possibile farlo anche per l'altezza se lo schermo si rimpicciolisce?
confile

@confile dipenderebbe molto dal layout del codice, ma puoi provare ad aggiungerlo height:100%;a imgcss.
Omega

height: 100vhlo farei, no height: 100%. Lo styling per l'altezza è sempre complicato.
gdbj

1
Perché è contrassegnata come risposta corretta? Omega non l'ha trasformato nel comportamento predefinito del browser? jsfiddle.net/89dtxt6s/221
VeeK

73

Sono venuto qui cercando una risposta alle mie immagini distorte. Non sono del tutto sicuro di cosa stia cercando l'operazione sopra, ma ho scoperto che l'aggiunta align-items: centerlo risolverebbe per me. Leggendo i documenti, ha senso sovrascriverlo se stai flettendo direttamente le immagini, poiché align-items: stretchè l'impostazione predefinita. Un'altra soluzione è avvolgere prima le tue immagini con un div.

.myFlexedImage {
  display: flex;
  flex-flow: row nowrap;
  align-items: center;
}

11
"Sono venuto qui in cerca di una risposta alle mie immagini distorte" Sono arrivato qui per lo stesso motivo e la tua soluzione mi ha aiutato (ciò che è stato contrassegnato come la soluzione effettiva non mi ha aiutato affatto)
Wagner da Silva

anche questo mi ha aiutato, qualcuno può spiegare perché funziona?
Jerry B. n. 1 stagista

Questa è stata la risposta corretta per me. larghezza massima: 100%; non ha corretto l'altezza (l'altezza era ancora leggermente allungata). Nel mio caso ho usato align-items: flex-start; perché non volevo che l'immagine fosse centrata verticalmente nel contenitore, ma funzionava comunque poiché sovrascrive gli align-items predefiniti: stretch; Ecco un elenco di tutti i valori di proprietà per gli elementi di allineamento che potresti utilizzare per sovrascrivere: w3schools.com/cssref/css3_pr_align-items.asp
Kyle Vassella

Ho provato molte cose, ma i tuoi oggetti di allineamento: il centro sul genitore è l'unico che ha funzionato.
Micros

Questa dovrebbe essere la risposta accettata. Align-content non ha funzionato per me in termini di allungamento, ma align-items sì, entrambi hanno funzioni diverse. Questo SE chiarisce la differenza tra i due: stackoverflow.com/questions/27539262/…
John Ernest,

44

Potresti provare la nuovissima e semplice funzione CSS3:

img { 
  object-fit: contain;
}

Conserva le proporzioni dell'immagine (come quando usi il trucco dell'immagine di sfondo) e nel mio caso ha funzionato bene per lo stesso problema.

Attenzione però, non è supportato da IE (vedi i dettagli del supporto qui ).


4
Ricorda che l'oggetto genitore deve essere un flex
Lokinou

Ho provato questo e ha funzionato perfettamente all'interno di un div flex.
Rémy Kaloustian il

6

Suggerisco di esaminare le background-sizeopzioni per regolare la dimensione dell'immagine.

Invece di avere l'immagine nella pagina se l'hai impostata come immagine di sfondo puoi impostare:

background-size: contain

o

background-size: cover

Queste opzioni tengono conto sia dell'altezza che della larghezza quando si ridimensiona l'immagine. Funzionerà in IE9 e in tutti gli altri browser recenti.


3

Nella seconda immagine sembra che tu voglia che l'immagine riempia il riquadro, ma l'esempio che hai creato MANTIENE le proporzioni (gli animali sembrano normali, non magri o grassi).

Non ho idea se hai photoshoppato quelle immagini come esempio o anche il secondo è "come dovrebbe essere" (hai detto È, mentre il primo esempio hai detto "dovrebbe")

Ad ogni modo, devo presumere:

Se "le immagini non vengono ridimensionate mantenendo le proporzioni" e mi mostri un'immagine che MANTIENE le proporzioni dei pixel, devo presumere che tu stia cercando di ottenere le proporzioni dell'area di "ritaglio" (l'interno di il verde) WILE mantenendo le proporzioni dei pixel. Cioè vuoi riempire la cella con l'immagine, ingrandendo e ritagliando l'immagine.

Se questo è il tuo problema, il codice che hai fornito NON riflette "il tuo problema", ma il tuo esempio di partenza.

Date le due ipotesi precedenti, ciò di cui hai bisogno non può essere realizzato con immagini reali se l'altezza della scatola è dinamica, ma con immagini di sfondo. O usando "background-size: contain" o queste tecniche (padding intelligenti in percentuali che limitano il ritaglio o le dimensioni massime ovunque tu voglia): http://fofwebdesign.co.uk/template/_testing/scale-img/scale- img.htm

L'unico modo in cui ciò è possibile con le immagini è se DIMENTICIAMO la tua seconda iimage e le celle hanno un'altezza fissa e FORTUNATAMENTE, a giudicare dalle tue immagini campione, l'altezza rimane la stessa!

Quindi, se l'altezza del tuo contenitore non cambia e vuoi mantenere le tue immagini quadrate, devi solo impostare l'altezza massima delle immagini su quel valore noto (meno padding o bordi, a seconda della proprietà di dimensionamento del riquadro del cellule)

Come questo:

<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>

E il 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/

Il tuo codice non è valido (i tag di apertura sono invece di quelli di chiusura, quindi generano celle NESTED, non fratelli, ha usato uno SCREENSHOT delle tue immagini all'interno del codice difettoso e la scatola flessibile non contiene le celle ma entrambi gli esempi in una colonna ( hai impostato "riga" ma il codice corrotto che annida una cella all'interno dell'altra ha prodotto un flex all'interno di un flex, che alla fine funziona come COLUMNS. Non ho idea di cosa volevi ottenere e di come sei arrivato con quel codice, ma io ' Sto indovinando quello che vuoi è questo.

Ho aggiunto display: flex anche alle celle, quindi l'immagine viene centrata (penso che display: tableavrebbe potuto essere usato anche qui con tutto questo markup)


Non sembra che tu abbia la minima idea di come ho risposto alla domanda. Tutto l'html e il css in quel jsfiddle è ciò che l'interrogante (@confile) ha fornito. Leggi la domanda e lo vedrai. La mia soluzione è una semplice riga di css img {max-width: 100%;} e l'interrogante ha accettato la mia risposta più di un anno fa in quanto fornisce la soluzione che era stata richiesta. Ti auguro tutto il meglio qui, per favore prova a leggere correttamente le domande e poi rispondi di conseguenza in futuro, grazie.
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;
}

0

È così che gestisco immagini diverse (dimensioni e proporzioni) in una griglia flessibile.

.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>


-5

Sto usando jquery o vw per mantenere il rapporto

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%;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.