Come posso riempire un div con un'immagine mantenendola proporzionale?


120

Ho trovato questo thread: come allunghi un'immagine per riempire un <div> mantenendo le proporzioni dell'immagine? - non è del tutto la cosa che voglio.

Ho un div con una certa dimensione e un'immagine al suo interno. Voglio sempre riempire il div con l'immagine indipendentemente dal fatto che l'immagine sia orizzontale o verticale. E non importa se l'immagine è tagliata (il div stesso ha l'overflow nascosto).

Quindi, se l'immagine è verticale, voglio widthche sia 100%e height:autocosì rimanga proporzionata. Se l'immagine è paesaggio voglio heightche sia 100%e l' width to beauto`. Sembra complicato, vero?

<div class="container">
   <img src="some-image.jpg" alt="Could be portrait or landscape"/>
</div>

Dato che non so come farlo, ho semplicemente creato una rapida immagine di ciò che intendo. Non riesco nemmeno a descriverlo adeguatamente.

inserisci qui la descrizione dell'immagine

Quindi, immagino di non essere il primo a chiederlo. Tuttavia non sono riuscito a trovare una soluzione a questo problema. Forse c'è qualche nuovo modo CSS3 per farlo - sto pensando a flex-box. Qualche idea? Forse è anche più facile di quanto mi aspetto che sia?


Perché vuoi usare css3 quando puoi ancora farlo facilmente con javascript? Vai con js matey ..
GautamJeyaraman

1
Non testato ma potresti provare a impostare min-height e min-width al 100%? Questo dovrebbe almeno riempire la scatola e mantenerla in proporzione
Chrisbulmer

Risposte:


150

Se capisco correttamente cosa vuoi, puoi lasciare gli attributi di larghezza e altezza fuori dall'immagine per mantenere le proporzioni e usare flexbox per fare il centraggio per te.

.fill {
    display: flex;
    justify-content: center;
    align-items: center;
    overflow: hidden
}
.fill img {
    flex-shrink: 0;
    min-width: 100%;
    min-height: 100%
}
<div class="fill">
    <img src="https://lorempizza.com/320/240" alt="" />
</div>

JSFiddle qui

L'ho provato con successo in IE9, Chrome 31 e Opera 18. Ma non sono stati testati altri browser. Come sempre devi considerare le tue particolari esigenze di supporto.


In IE9 l'immagine non è centrata verticalmente o orizzontalmente con questo metodo, è allineata in alto e a sinistra. i59.tinypic.com/ouo77s.png
Mike Kormendy

1
Questo ha un problema su iPad, sembra che Safari allunghi l'immagine al 100% della sua altezza ma non mantiene la proprietà di larghezza minima.
Sean

14
Questo sembra ridimensionare le piccole immagini per riempire, ma non per adattarle. Almeno quando uso un'immagine grande ne mostra solo una piccola parte.
Johncl

12
Per avere un'immagine grande ridimensionata per adattarla, ho usato quanto segue sull'immagine:.fill img { min-height:100%; min-width: 100%; object-fit: cover; }
Peter G

super eroe! : D
Garis M Suero

47

È un po 'tardi ma ho appena avuto lo stesso problema e alla fine l'ho risolto con l'aiuto di un altro post di stackoverflow ( https://stackoverflow.com/a/29103071 ).

.img {
   object-fit: cover;
   width: 50px;
   height: 100px;
}

Spero che questo aiuti ancora qualcuno.

Ps: funziona anche insieme alle proprietà CSS max-height , max-width , min-width e min-height . È particolarmente utile con l'utilizzo di unità di lunghezza come 100% o 100vh / 100vw per riempire il contenitore o l'intera finestra del browser.


è una soluzione crossbrowser?
Candlejack

1
adattamento all'oggetto: copertura; funziona alla grande! Informazioni sul browser (non funziona in IE): css-tricks.com/almanac/properties/o/object-fit Soluzione di fallback per IE: medium.com/@primozcigler/… MS sta lavorando all'implementazione: developer.microsoft.com / it-us / microsoft-edge / platform / status /…
Kaah

Immagino che l'aggiunta di una object-positionregola a questa classe sarà utile qui. Solo una nota a margine.
Taha Paksu

8

Una vecchia domanda ma merita un aggiornamento in quanto ora c'è un modo.

La risposta corretta basata su CSS è usare object-fit: cover, che funziona come background-size: cover. Il posizionamento verrebbe curato per object-positionattributo, che per impostazione predefinita è centratura.

Ma non è supportato in alcun browser IE / Edge o Android <4.4.4. Inoltre, object-positionnon è supportato da Safari, iOS o OSX. I polyfill esistono, le immagini che si adattano agli oggetti sembrano fornire il miglior supporto.

Per maggiori dettagli su come funziona la proprietà, consulta l' articolo sui trucchi CSSobject-fit per spiegazioni e demo.


8

Questo dovrebbe farlo:

img {    
min-width: 100%;
min-height: 100%;
width: auto;
height: auto;
}

Funziona abbastanza bene per me, nel mio caso ho solo richiesto di aggiungere la posizione: assoluta e superiore: 0, e anche un po 'di z-index
byroncorrales

7

Tutte le risposte seguenti hanno larghezza e altezza fisse, il che rende la soluzione "non reattiva".

Per ottenere il risultato ma mantenere l'immagine reattiva ho usato quanto segue:

  1. All'interno del contenitore posizionare un'immagine gif trasparente con le proporzioni desiderate
  2. Fornisci un tag immagine inline css sfondo con l'immagine che desideri ridimensionare e ritagliare

HTML:

<div class="container">
    <img style="background-image: url("https://i.imgur.com/XOmNCwY.jpg");" src="img/blank.gif">
</div> 


.container img{
   width: 100%;
   height: auto;
   background-size: cover;
   background-repeat: no-repeat;
   background-position: center;
}​

Ho usato l'immagine di sfondo per l'intero sito web della mia azienda di portfolio di design in modo da poter avere la dimensione dello sfondo: copertina. Ora la mia immagine SEO è tutta incasinata perché le immagini di sfondo non vengono riconosciute da Google. Vorrei averlo codificato in un altro modo.
Alex Banman

5

Puoi ottenere ciò utilizzando le proprietà CSS Flex. Si prega di vedere il codice di seguito

.img-container {
  border: 2px solid red;
  justify-content: center;
  display: flex;
  flex-direction: row;
  overflow: hidden;
  
}
.img-container .img-to-fit {
  flex: 1;
  height: 100%;
}
<div class="img-container">
  <img class="img-to-fit" src="https://images.pexels.com/photos/8633/nature-tree-green-pine.jpg" />
</div>


1
Funziona SOLO se rimuovi le proprietà di larghezza e altezza come accennato in alcune delle altre risposte.
Chiwda

3

Prendi in considerazione l'utilizzo di background-size: cover(IE9 +) insieme a background-image. Per IE8-, c'è un polyfill .


Questo non richiede l'URL di sfondo? Puoi approfondire di più? Può funzionare con <img src = "" /> come indicato nella domanda?
harsimranb

@harsimranb Ovviamente background-sizeha senso anche solo con background-imagespecificato (ho aggiornato di conseguenza la mia risposta). Non si applica agli IMGelementi.
Marat Tanalin

Questa è la migliore risposta. È semplice e ha un buon supporto del browser. Tutte le altre soluzioni sono molto complesse o non funzionano in IE (9).
JoostS

1

Prova questo:

img {
  position: relative;
  left: 50%;
  min-width: 100%;
  min-height: 100%;
  transform: translateX(-50%);
}

Spero che questo ti aiuti


1

Puoi usare div per ottenere ciò. senza tag img :) spero che questo aiuti.

.img{
	width:100px;
	height:100px;
	background-image:url('http://www.mandalas.com/mandala/htdocs/images/Lrg_image_Pages/Flowers/Large_Orange_Lotus_8.jpg');
	background-repeat:no-repeat;
	background-position:center center;
	border:1px solid red;
	background-size:cover;
}
.img1{
	width:100px;
	height:100px;
	background-image:url('https://images.freeimages.com/images/large-previews/9a4/large-pumpkin-1387927.jpg');
	background-repeat:no-repeat;
	background-position:center center;
	border:1px solid red;
	background-size:cover;
}
<div class="img">	
</div>
<div class="img1">	
</div>


1

L'unico modo in cui ho ottenuto lo scenario "migliore" descritto, è stato quello di mettere l'immagine come sfondo:

<div class="container"></div>
.container {
    width: 150px;
    height: 100px;
    background-image: url("http://i.stack.imgur.com/2OrtT.jpg");
    background-size: cover;
    background-repeat: no-repeat;
    background-position: 50% 50%;
}​

1

Ecco una risposta con il supporto a IE in object-fitmodo da non perdere il rapporto

Utilizzando un semplice frammento JS per rilevare se object-fitè supportato e quindi sostituire il imgper un filesvg

//for browsers which doesn't support object-fit (you can use babel to transpile to ES5)

if ('objectFit' in document.documentElement.style === false) {
  document.addEventListener('DOMContentLoaded', () => {
    Array.prototype.forEach.call(document.querySelectorAll('img[data-object-fit]'), image => {
      (image.runtimeStyle || image.style).background = `url("${image.src}") no-repeat 50%/${image.currentStyle ? image.currentStyle['object-fit'] : image.getAttribute('data-object-fit')}`
      image.src = `data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='${image.width}' height='${image.height}'%3E%3C/svg%3E`
    })
  })
}
img {
  display: inline-flex;
  width: 175px;
  height: 175px;
  margin-right: 10px;
  border: 1px solid red
}

/*for browsers which support object fit */

[data-object-fit='cover'] {
  object-fit: cover
}

[data-object-fit='contain'] {
  object-fit: contain
}
<img data-object-fit='cover' src='//picsum.photos/1200/600' />
<img data-object-fit='contain' src='//picsum.photos/1200/600' />
<img src='//picsum.photos/1200/600' />


Nota: ci sono anche alcuni object-fitpolyfill che object-fitfunzioneranno.

Ecco alcuni esempi:


0

Ecco il mio esempio di lavoro. Ho usato un trucco che sta impostando l'immagine come sfondo del contenitore div con background-size: cover e background-position: center center

Ho posizionato l'immagine con larghezza: 100% e opacità: 0 rendendola invisibile. Tieni presente che mostro la mia immagine solo perché ho un interesse speciale nel chiamare l'evento clic figlio.

Si prega di notare che anche se sto usando angolare è completamente irrilevante.

<div class="foto-item" ng-style="{'background-image':'url('+foto.path+')'}">
    <img class="materialboxed" ng-class="foto.picid" ng-src="{{foto.path}}" style="opacity: 0;filter: alpha(opacity=0);" width="100%" onclick="$('.materialboxed')/>
 </div>
<style>
.foto-item {
height: 75% !important;
width: 100%;
position: absolute;
top: 0;
left: 0;
overflow:hidden;
background-size: cover;
background-position: center center;
}
</style>

Il risultato è quello che definisci ottimale in tutti i casi


0

I valori CSS object-fit: covere delle object-position: left centerproprietà ora risolvono questo problema.


0

.image-wrapper{
    width: 100px;
    height: 100px;
    border: 1px solid #ddd;
}
.image-wrapper img {
    object-fit: contain;
    min-width: 100%;
    min-height: 100%;
    width: auto;
    height: auto;
    max-width: 100%;
    max-height: 100%;
}
<div class="image-wrapper">
  <img src="">
</div>


-3

Basta fissare l'altezza dell'immagine e fornire width = auto

img{
    height: 95vh;
    width: auto;
}
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.