CSS forza il ridimensionamento dell'immagine e mantiene le proporzioni


577

Sto lavorando con le immagini e ho riscontrato un problema con le proporzioni.

<img src="big_image.jpg" width="900" height="600" alt="" />

Come puoi vedere, heighte widthsono già stati specificati. Ho aggiunto la regola CSS per le immagini:

img {
  max-width:500px;
}

Ma per big_image.jpg, ricevo width=500e height=600. Come posso impostare il ridimensionamento delle immagini, mantenendo le proporzioni.

Risposte:


775

img {
  display: block;
  max-width:230px;
  max-height:95px;
  width: auto;
  height: auto;
}
<p>This image is originally 400x400 pixels, but should get resized by the CSS:</p>
<img width="400" height="400" src="http://i.stack.imgur.com/aEEkn.png">

Ciò ridurrà l'immagine se è troppo grande per l'area specificata (come inconveniente, non ingrandirà l'immagine).


11
Esiste una versione di questo che ingrandirà le immagini per adattarle anche al loro contenitore? Ho provato la larghezza massima / altezza massima come numeri con larghezza / altezza come auto, ma come setec ha detto sopra, non ingrandirà l'immagine. Ho provato a usare anche min-width / min-height. Non riesco proprio a ottenere la combinazione giusta. Voglio semplicemente che qualunque immagine sia necessario inserire in questo contenitore, verrà visualizzata alla dimensione massima possibile senza modificare le proporzioni, indipendentemente dal fatto che ciò comporti la riduzione o la crescita dell'immagine per ottenere ciò.
Dee2000,

7
Sembra che visualizzi: il blocco non è più necessario.
actimel,

3
Si noti che la domanda riguardava un <img>elemento che include una larghezza e un'altezza e penso che ciò significhi che è necessario utilizzare !importantper aggirare le informazioni sulla larghezza / altezza del tag.
Alexis Wilke,

18
Le regole CSS di @AlexisWilke hanno la precedenza sugli attributi html. !importantnon è necessario.
Jargs,

5
Usandolo su Chrome, non funziona per me, anche con! Important
Ray

266

Ho lottato con questo problema abbastanza duramente e alla fine sono arrivato a questa semplice soluzione:

object-fit: cover;
width: 100%;
height: 250px;

Puoi regolare la larghezza e l'altezza in base alle tue esigenze e la proprietà adatta all'oggetto farà il ritaglio per te.

Saluti.


44
object-fitè fantastico, ottimo consiglio! Ci sono alcune librerie di polifill se qualcuno si sta chiedendo della compatibilità con IE.
leggermente l'

7
Adorabile,
tieni

1
Non utilizzabile su SAMSUNG Signage Display WebApps.
Mär

3
Migliore soluzione disponibile
Cynthia Sanchez,

10
Puoi anche usare object-fit: containe specificare una larghezza o altezza!
Broper

236

Le soluzioni di seguito consentiranno il ridimensionamento e il ridimensionamento dell'immagine , a seconda della larghezza della casella padre.

Tutte le immagini hanno un contenitore padre con una larghezza fissa solo a scopo dimostrativo . In produzione, questa sarà la larghezza della casella padre.

Best Practice (2018):

Questa soluzione dice al browser di rendere l'immagine con la larghezza massima disponibile e regolare l'altezza come percentuale di quella larghezza.

.parent {
  width: 100px;
}

img {
  display: block;
  width: 100%;
  height: auto;
}
<p>This image is originally 400x400 pixels, but should get resized by the CSS:</p>
<div class="parent">
  <img width="400" height="400" src="https://placehold.it/400x400">
</div>

Soluzione più elaborata:

Con la soluzione più elaborata, sarai in grado di ritagliare l'immagine indipendentemente dalle sue dimensioni e aggiungere un colore di sfondo per compensare il ritaglio.

.parent {
  width: 100px;
}

.container {
  display: block;
  width: 100%;
  height: auto;
  position: relative;
  overflow: hidden;
  padding: 34.37% 0 0 0; /* 34.37% = 100 / (w / h) = 100 / (640 / 220) */
}

.container img {
  display: block;
  max-width: 100%;
  max-height: 100%;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
}
<p>This image is originally 640x220, but should get resized by the CSS:</p>
<div class="parent">
  <div class="container">
    <img width="640" height="220" src="https://placehold.it/640x220">
  </div>
</div>

Per la linea che specifica il riempimento, è necessario calcolare le proporzioni dell'immagine, ad esempio:

640px (w) = 100%
220px (h) = ?

640/220 = 2.909
100/2.909 = 34.37%

Quindi, imbottitura superiore = 34,37%.


1
Funziona, ma dovrebbe essere max-larghezza: 100% anziché larghezza nella maggior parte degli usi.
Dudeist,

Non credo !importantsia necessario qui.
Flimm

1
Con il genitore impostato su 100px. Come funzionerà in modo reattivo?
Remi,

@Remi è a scopo dimostrativo. Ho aggiunto un chiarimento all'inizio della risposta.
Aternus,

@Flimm è stato utilizzato in precedenza per problemi di compatibilità, nel 2016 non è più necessario.
Aternus,

64

La proprietà size-background è solo> = 9, ma se per te va bene, puoi usare un div con background-imagee impostare background-size: contain:

div.image{
    background-image: url("your/url/here");
    background-size: contain;
    background-repeat: no-repeat;
    background-position: center;
}

Ora puoi semplicemente impostare la dimensione del div su quello che vuoi e non solo l'immagine manterrà le sue proporzioni, ma sarà anche centralizzata sia verticalmente che orizzontalmente all'interno del div. Basta non dimenticare di impostare le dimensioni sul CSS poiché i div non hanno l'attributo larghezza / altezza sul tag stesso.

Questo approccio è diverso dalla risposta di setecs, usando questa l'area dell'immagine sarà costante e definita da te (lasciando spazi vuoti orizzontalmente o verticalmente a seconda della dimensione div e delle proporzioni dell'immagine), mentre la risposta di setecs ti darà una casella che esattamente dimensione dell'immagine ridimensionata (senza spazi vuoti).

Modifica: in base alla documentazione sulle dimensioni dello sfondo MDN, è possibile simulare la proprietà delle dimensioni dello sfondo in IE8 utilizzando una dichiarazione di filtro proprietaria:

Sebbene Internet Explorer 8 non supporti la proprietà delle dimensioni dello sfondo, è possibile emulare alcune delle sue funzionalità utilizzando la funzione non -ms-filter standard:

-ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='path_relative_to_the_HTML_file', sizingMethod='scale')";

2
finalmente una soluzione solo CSS per massimizzare un'immagine mantenendo le proporzioni, grazie. Fortunatamente che IE prima di 9 è sempre meno importante.
umanità e

2
Ottima soluzione, grazie! Si noti inoltre che è possibile sostituire "contenere" con "copertina" se si desidera riempire completamente il div e ritagliare pixel extra che non si adattano al rapporto
mbritto

Questa dovrebbe essere la risposta corretta. Adoro questa soluzione. Mantiene le tue proporzioni ed è facile da capire.
skolind il

1
Mentre questa è una risposta corretta a livello di codice, se un'immagine "conta" in questo modo non hai attributi img, quindi stai uccidendo SEO.
fat_mike,

Grande! È stata l'unica di queste soluzioni che ha funzionato sia per le immagini di ritratti che di paesaggi, nonché per i contenitori di ritratti e di paesaggi dell'immagine (ad esempio variabili in base alla dimensione della finestra) in tutte e 4 le combinazioni e inoltre in IE11, che sembrava essere abbastanza Un requisito. Grazie!
cupiqi09,

53

Molto simile ad alcune risposte qui, ma nel mio caso avevo immagini che a volte erano più alte, a volte più grandi.

Questo stile ha funzionato come un fascino per assicurarsi che tutte le immagini utilizzino tutto lo spazio disponibile, mantengano il rapporto e non i tagli:

.img {
   object-fit: contain;
   max-width: 100%;
   max-height: 100%;
   width: auto;
   height: auto;
}

object-fitfunziona per me funziona in tutti i browser?
Murtuza Zabuawala,

È .imguna classe sul genitore o l'immagine? Potresti creare un jsfiddle con esempio per immagini sia di ritratto che di paesaggio?
Design di Adrian,

19

Rimuovere la proprietà "height".

<img src="big_image.jpg" width="900" alt=""/>

Specificando entrambi si stanno modificando le proporzioni dell'immagine. Basta impostarne uno per ridimensionare ma preservare le proporzioni.

Facoltativamente, per limitare gli eccessi:

<img src="big_image.jpg" width="900" alt="" style="max-width:500px; height:auto; max-height:600px;"/>

non posso farlo a tutte le immagini - ci sono molte immagini già inserite in molti file html
moonvader

2
Ok. prova img {max-width: 500px; height: auto; altezza massima: 600 px;}
el Dude,

1
Informazioni utili come quel commento dovrebbero essere aggiunte al tuo post. In questo modo possiamo immediatamente vedere cosa ti è venuto in mente.
Bram Vanroy,

2
L'aspetto negativo di omettere l' heightattributo nel imgtag è che il browser non è in grado di calcolare la quantità di spazio che l'immagine occuperà prima di scaricare l'immagine. Questo rende la pagina più lenta da visualizzare e può portare a più "salti".
Flimm,

11

Basta aggiungere questo al tuo CSS, si ridurrà automaticamente e si espanderà mantenendo il rapporto originale.

img {
    display: block;
    max-width: 100%;
    max-height: 100%;
    width: auto;
    height: auto;
}

2
Questa è la stessa risposta della risposta di setec , ad eccezione dell'uso 100%invece di un valore di pixel specifico.
Flimm

5
display: block;non è necessario.
Flimm

È perfetto e funziona con immagini di qualsiasi dimensione e proporzione
Le Droid

8

Non v'è alcun modo standard per preservare proporzioni per le immagini con width, heighte max-widthspecificato insieme.

Pertanto, siamo costretti a specificare widthe heightimpedire i "salti" di pagina durante il caricamento delle immagini oppure a utilizzare max-widthe non specificare le dimensioni per le immagini.

Specificare solo width(senza height) in genere non ha molto senso, ma puoi provare a sovrascrivere l' heightattributo HTML aggiungendo una regola come IMG {height: auto; }nel tuo foglio di stile.

Vedi anche il relativo bug 392261 di Firefox .


grazie funziona nelle versioni moderne di IE, Opera, FF e Chrome. ho bisogno di un po 'di tempo per testarlo con altri browser.
moonvader,

7
Non utilizzare !importantnei CSS. È un hack che alla fine tornerà a perseguitarti.
Automatico,

1
Non hai nemmeno bisogno di !importantqui.
Flimm

8

Ecco una soluzione:

img {
   width: 100%;
   height: auto;
   object-fit: cover;
}

Questo farà in modo che l'immagine copra sempre l'intero genitore (ridimensionando su e giù) e mantenendo le stesse proporzioni.


5

Imposta la classe CSS del tag del contenitore di immagini su image-class:

<div class="image-full"></div>

e aggiungi questo tuo foglio di stile CSS.

.image-full {
    background: url(...some image...) no-repeat;
    background-size: cover;
    background-position: center center;
}

5

Per mantenere un'immagine reattiva mentre si impone all'immagine di avere un determinato formato è possibile effettuare le seguenti operazioni:

HTML:

<div class="ratio2-1">
   <img src="../image.png" alt="image">
</div>

E SCSS:

.ratio2-1 {
  overflow: hidden;
  position: relative;

  &:before {
    content: '';
    display: block;
    padding-top: 50%; // ratio 2:1
  }

  img {
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
  }
}

Questo può essere usato per imporre un certo formato, indipendentemente dalle dimensioni dell'immagine caricata dagli autori.

Grazie a @Kseso su http://codepen.io/Kseso/pen/bfdhg . Controlla questo URL per ulteriori rapporti e un esempio funzionante.


Mi piace questo come funziona con i cerchi / border-radius. Ma sfortunatamente, ritaglia l'immagine e non funziona così bene nel creare un bordo per l'immagine nel div, per quanto ho provato.
Jake,

4

Per forzare l'immagine che si adatta a una dimensione esatta, non è necessario scrivere troppi codici. È così semplice

img{
    width: 200px;
    height: auto;
    object-fit: contain; /* Fit logo in the image size */
        -o-object-fit: contain; /* Fit logo fro opera browser */
    object-position: top; /* Set logo position */
        -o-object-position: top; /* Logo position for opera browser */
    }
<img src="http://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-logo.png" alt="Logo">


4

https://jsfiddle.net/sot2qgj6/3/

Ecco la risposta se vuoi mettere un'immagine con percentuale di larghezza fissa , ma non pixel di larghezza fissi .

E questo sarà utile quando si ha a che fare con schermi di dimensioni diverse .

I trucchi sono

  1. Utilizzo padding-topper impostare l'altezza dalla larghezza.
  2. Usare position: absoluteper mettere l'immagine nello spazio di riempimento.
  3. Usare max-height and max-widthper assicurarsi che l'immagine non si sovrapponga all'elemento genitore.
  4. usando display:block and margin: autoper centrare l'immagine.

Ho anche commentato la maggior parte dei trucchi all'interno del violino.


Trovo anche altri modi per farlo accadere. Non ci sarà alcuna immagine reale in html, quindi ho personalmente la risposta migliore quando ho bisogno dell'elemento "img" in html.

CSS semplice usando lo sfondo http://jsfiddle.net/4660s79h/2/

immagine di sfondo con la parola in alto http://jsfiddle.net/4660s79h/1/

il concetto di utilizzare la posizione assoluta è da qui http://www.w3schools.com/howto/howto_css_aspect_ratio.asp


Questo non funziona se "altezza e larghezza sono già specificate" come menzionato nella domanda originale. Ci sono momenti in cui si desidera forzare la larghezza e l'altezza e quindi ingrandire / ridurre l'immagine in base alle proporzioni.
Design di Adrian,

3

Puoi usare questo:

img { 
    width: 500px; 
    height: 600px; 
    object-fit: contain; 
    position: relative; 
    top: 50%; 
    transform: translateY(-50%); 
}

2

Puoi creare un div come questo:

<div class="image" style="background-image:url('/to/your/image')"></div>

E usa questo css per modellarlo:

height: 100%;
width: 100%;
background-position: center center;
background-repeat: no-repeat;
background-size: contain; // this can also be cover

Ciò allungherà il div fino al 100% della larghezza del suo genitore, ma non manterrà le proporzioni dell'immagine.
David Ball

Hai provato? L'ho fatto funzionare jsfiddle.net/zuysj22w . Puoi mostrare il tuo caso? @DavidBall
Chun Yang

Questa è una soluzione simile alla risposta di Hoffmann .
Flimm

2

Suggerirei per un approccio reattivo che la migliore pratica sarebbe usare le unità Viewport e gli attributi min / max come segue:

img{
  display: block;
  width: 12vw;
  height:12vw;
  max-width:100%;
  min-width:100px;
  min-height:100px;
  object-fit:contain;
}

1

Ciò ridurrà l'immagine se è troppo grande per l'area specificata (come inconveniente, non ingrandirà l'immagine).

La soluzione di setec va bene per "Riduci per adattarsi" in modalità automatica. Tuttavia, per ESPANDERE in modo ottimale per adattarsi alla modalità "auto", è necessario prima inserire l'immagine ricevuta in un ID temporaneo, controllare se può essere espansa in altezza o in larghezza (a seconda della sua proporzione v / s il rapporto di aspetto di il blocco display),

$(".temp_image").attr("src","str.jpg" ).load(function() { 
    // callback to get actual size of received image 

    // define to expand image in Height 
    if(($(".temp_image").height() / $(".temp_image").width()) > display_aspect_ratio ) {
        $(".image").css('height', max_height_of_box);
        $(".image").css('width',' auto');
    } else { 
        // define to expand image in Width
        $(".image").css('width' ,max_width_of_box);
        $(".image").css('height','auto');
    }
    //Finally put the image to Completely Fill the display area while maintaining aspect ratio.
    $(".image").attr("src","str.jpg");
});

Questo approccio è utile quando le immagini ricevute sono più piccole della casella di visualizzazione. È necessario salvarli sul server in formato originale piccolo anziché nella versione espansa per riempire la casella di visualizzazione più grande per risparmiare su dimensioni e larghezza di banda.


Sebbene il post della domanda non sia stato chiarito, penso che OP abbia implicato fortemente che stava cercando una soluzione solo CSS.
Flimm

0

img {
  max-width: 80px; /* Also works with percentage value like 100% */
  height: auto;
}
<p>This image is originally 400x400 pixels, but should get resized by the CSS:</p>
<img width="400" height="400" src="https://i.stack.imgur.com/aEEkn.png">

<p>Let's say the author of the HTML deliberately wants
  the height to be half the value of the width,
  this CSS will ignore the HTML author's wishes, which may or may not be what you want:
</p>
<img width="400" height="200" src="https://i.stack.imgur.com/aEEkn.png">


0

Che ne dici di usare uno pseudo elemento per l'allineamento verticale? Questo codice in meno è per una giostra ma immagino che funzioni su ogni contenitore di dimensioni fisse. Manterrà le proporzioni e inserirà le barre @ grigio-scure in alto / in basso o a sinistra / scrittura per la dimensione più breve. Nel frattempo l'immagine è centrata orizzontalmente dall'allineamento del testo e verticalmente dall'elemento pseudo.

    > li {
      float: left;
      overflow: hidden;
      background-color: @gray-dark;
      text-align: center;

      > a img,
      > img {
        display: inline-block;
        max-height: 100%;
        max-width: 100%;
        width: auto;
        height: auto;
        margin: auto;
        text-align: center;
      }

      // Add pseudo element for vertical alignment of inline (img)
      &:before {
        content: "";
        height: 100%;
        display: inline-block;
        vertical-align: middle;
      }
    }

0

Presentazione a schermo intero:

img[data-attribute] {height: 100vh;}

Tieni presente che se l'altezza della porta di visualizzazione è maggiore dell'immagine, l'immagine si degraderà naturalmente rispetto alla differenza.


-1

Penso, infine, che questa sia la soluzione migliore, facile e semplice :

img {
    display: block;
    max-width: 100%;
    max-height: 100%;
    width: auto;
    height: auto;
}

1
Potresti spiegare brevemente perché questa soluzione aiuta? (Basta una frase.)
Aenadon,

Semplicemente perché l'immagine lo manterrà proporzioni, mentre la larghezza massima e l'altezza massima impediranno che diventi più grande del contenitore
Uknow
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.