Come posso adattare un'immagine (img) all'interno di un div e mantenere le proporzioni?


136

Ho un div 48x48 e al suo interno c'è un elemento img, voglio inserirlo nel div senza perdere alcuna parte, nel frattempo il rapporto viene mantenuto, è realizzabile usando html e css?

Risposte:


70

Avrai bisogno di JavaScript per evitare il ritaglio se non conosci la dimensione dell'immagine nel momento in cui scrivi il CSS.

HTML e JavaScript

<div id="container">
    <img src="something.jpg" alt="" />
</div>

<script type="text/javascript">
(function() {

var img = document.getElementById('container').firstChild;
img.onload = function() {
    if(img.height > img.width) {
        img.height = '100%';
        img.width = 'auto';
    }
};

}());
</script>

CSS

#container {
   width: 48px;
   height: 48px;
}

#container img {
   width: 100%;
}

Se usi una libreria JavaScript, potresti volerne approfittare.


2
La risposta di Michael è molto più semplice e non usa Javascript. Non conosco la compatibilità del browser però.
weberc2,

3
No, la risposta di Michael funziona fintanto che l'immagine è più grande del div. Se vuoi che l'immagine riempia il div per quanto riguarda la dimensione dell'immagine (e, se non conosci la dimensione dell'immagine in anticipo, lo fai), questa è la strada da percorrere.
Rémy DAVID,

2
Non potresti usare l'altezza massima: 100%; max-width: 100%; min-width: 100%; altezza minima: 100% e ottenere lo stesso risultato allora? Domanda onesta.
Daniel Casserly,

No, facendo ciò imponi che la larghezza e l'altezza siano al 100%, quindi cambi le proporzioni dell'immagine.
gztomas,

onload non verrà chiamato quando l'immagine viene memorizzata nella cache nel browser, quindi funzionerà solo quando l'immagine viene caricata per la prima volta.
Redtopia,

314

Utilizzare max-height:100%; max-width:100%;per l'immagine all'interno del div.


4
@ZoveGames Browser non abilitati per JS? Le statistiche di Yahoo del 2010 mostrano una media dell'1,3%. Penso che sia sicuro presumere che a. oggi è probabilmente più bassa eb. programmers.stackexchange.com/questions/26179/…
EasyCo

5
Non funziona per me ... Rende l'immagine del 100% delle sue dimensioni (ad es .: larghezza 300 px per un'immagine che in realtà è larga 300 px).
Tomáš Zato - Ripristina Monica il

1
C'è qualche terribile bug specifico di Chrome su Windows che questo provoca. Potenzialmente qualche cattiva interazione con alcuni plugin smoothscroll che ho. Finisce per provare a far scorrere il corpo anche se il mouse si trova su un overflow:scrolldiv con una grande immagine al suo interno. Curioso. Ancora più strano: la soluzione di Max in realtà lo risolve. Sono abbastanza stufo dei CSS, davvero. Utilizzato per essere potente e cool. Ora le implementazioni producono solo incoerenza buggy dopo incoerenza buggy.
Steven Lu

21
funziona solo quando si ridimensiona un'immagine. se vuoi inserire una piccola immagine in un contenitore più grande, questo non funzionerà
Yossi Shasho,

2
Non mantiene le proporzioni originali dell'immagine.
αsααc t ի ε βöss

78

Purtroppo la larghezza massima + altezza massima non coprono completamente il mio compito ... Quindi ho trovato un'altra soluzione:

Per salvare il rapporto immagine durante il ridimensionamento è anche possibile utilizzare la proprietà object-fitCSS3.

Articolo utile: controlla le proporzioni dell'immagine con CSS3

img {
    width: 100%; /* or any custom size */
    height: 100%; 
    object-fit: contain;
}

Cattive notizie: IE non supportato ( posso usare )


6
Questo deve essere contrassegnato come la risposta .. "object-fit" ha funzionato perfettamente.
αsααc t ի ε βöss

Stranamente, sembra che il supporto per questo sia stato introdotto in iOS 8.1, non 8.0.
ray,

2
object-fit: cover; ha funzionato per me. Qui: stackoverflow.com/questions/9071830/…
Deke,

1
Se vuoi che l'immagine sia in alto a sinistra anziché centrata, devi anche usare la posizione dell'oggetto 0 0.
Chris Rae,

Questa è l'unica risposta che ha funzionato per me per creare uno sfondo di immagine reattivo che riempiva lo schermo mantenendo le proporzioni dell'immagine.
Ray Li,

39

Utilizzando solo CSS:

div > img {
  width: auto;
  height : auto;
  max-height: 100%;
  max-width: 100%;
}

non si
ingrandisce

17

HTML

<div>
    <img src="something.jpg" alt="" />
</div>

CSS

div {
   width: 48px;
   height: 48px;
}

div img {
   display: block;
   width: 100%;
}

Questo farà espandere l'immagine per riempire il suo genitore, di cui la sua dimensione è impostata nel divCSS.


2
Non aggiungere height: 100%, questo distorcerà il rapporto dell'immagine - l'OP vuole mantenere il rapporto.
Casablanca,

Non sono sicuro di cosa significasse l'OP, ma lì non manterresti il ​​rapporto giusto?
Trufa,

cosa posso fare per mantenere il rapporto? Se elimino l'altezza: 100% l'immagine verrà ritagliata.
Bin Chen,

7

Avevo molti problemi per farlo funzionare, ogni singola soluzione che ho trovato non sembra funzionare.

Mi sono reso conto che dovevo impostare il display div su flex, quindi sostanzialmente questo è il mio CSS:

div{
display: flex;
}

div img{ 
max-height: 100%;
max-width: 100%;
}

Le mie immagini sono distorte con questa soluzione in Chrome Versione 61
Yevgeniy Afanasyev

Forse il tuo div ha un'altezza massima / altezza o larghezza impostata e questo sta causando la distorsione dell'immagine.
Bartho Bernsmann,

Esattamente il mio punto .. L'immagine è distorta perché stai impostando la larghezza e l'altezza sul tuo <div class = "w">
Bartho Bernsmann

Per il tuo esempio .. Credo che tu stia cercando qualcosa di simile alla tua immagine CSS: height: auto; larghezza: 100%;
Bartho Bernsmann,

il compito era quello di adattare l'immagine a un div, implica che div ha le dimensioni e l'immagine ha solo proporzioni. Devo impostare l'altezza su un valore, altrimenti le condizioni della domanda saranno distorte e la mia immagine. Dai un'occhiata al violino JS e cambia ciò che ritieni necessario per farlo funzionare. Grazie.
Yevgeniy Afanasyev,

6

Prova CSS:

img {
  object-fit: cover;
  height: 48px;
}

3

Per me, il seguente CSS ha funzionato (testato su Chrome, Firefox e Safari).

Ci sono più cose che lavorano insieme:

  • max-height: 100%;, max-width: 100%;E height: auto;, width: auto;rendere la scala di qualsiasi dimensione img primi raggiunge il 100%, mantenendo le proporzioni
  • position: relative;nel contenitore e position: absolute;nel bambino insieme top: 50%;e left: 50%;centrare l'angolo in alto a sinistra dell'img nel contenitore
  • transform: translate(-50%, -50%); sposta l'img indietro a sinistra e in alto di metà della sua dimensione, centrando così l'img nel contenitore

CSS:

.container {
    height: 48px;
    width: 48px;

    position: relative;
}

.container > img {
    max-height: 100%;
    max-width: 100%;
    height: auto;
    width: auto;

    position: absolute;
    top: 50%;
    left: 50%;

    transform: translate(-50%, -50%);
}

1

Impostare la foto come immagine di sfondo ci darà un maggiore controllo sulle dimensioni e sul posizionamento, lasciando il tag img per uno scopo diverso ...

Di seguito, se vogliamo che il div abbia le stesse proporzioni della foto, placeholder.png è una piccola immagine trasparente con le stesse proporzioni di photo.jpg. Se la foto è quadrata, è un segnaposto 1px x 1px, se la foto è un'anteprima video, è un segnaposto 16x9, ecc.

Specifico per la domanda, usa un segnaposto 1x1 per mantenere le proporzioni quadrate del div, con un'immagine di sfondo che usa background-sizeper mantenere le proporzioni della foto.

Ho usato background-position: center center;così la foto sarà centrata nel div. (L'allineamento della foto al centro o in basso verticale diventerebbe brutto con la foto nel tag img.)

div {
    background: url(photo.jpg) center center no-repeat;
    background-size: contain;
    width: 48px; // or a % in responsive layout
}
img {
    width: 100%;
}

<div><img src="placeholder.png"/></div>

Per evitare una richiesta http aggiuntiva, converti l'immagine segnaposto in un dato: URL .

<img src="data:image/png;base64,..."/>

0

è possibile utilizzare la classe "img-fluid" per la versione più recente, ad esempio Bootstrap v4 .

e può utilizzare la classe "img-responsive" per versioni precedenti come Bootstrap v3 .

Utilizzo : -

tag img con: -

class = "img-fluid"

src = "..."


0

Ecco un approccio tutto JavaScript. Ridimensiona progressivamente un'immagine fino a quando non si adatta correttamente. Scegli quanto ridurlo ogni volta che fallisce. Questo esempio lo riduce del 10% ogni volta che fallisce:

let fit = function (el, w, h, percentage, step)
{
    let newH = h;
    let newW = w;

    // fail safe
    if (percentage < 0 || step < 0) return { h: h, w: w };
    if (h > w)
    {
        newH = el.height() * percentage;
        newW = (w / h) * newH;
        if (newW > el.width())
        {
            return fit(el, w, h, percentage - step, step);
        }
    }
    else
    {
        newW = el.width() * percentage;
        newH = (h / w) * newW;
        if (newH > el.height())
        {
            return fit(el, w, h, percentage - step, step);
        }
    }

    return { h: newH, w: newW };
};

img.bind('load', function ()
{
    let h = img.height();
    let w = img.width();
    let newFit = fit($('<img-wrapper-selector>'), w, h, 1, 0.1);

    img.width(newFit.w);
    img.height(newFit.h);
});

Sentiti libero di copiare e incollare direttamente.


0

Ciò che ha funzionato per me è stato:

<div style='display: inline-flex; width: 80px; height: 80px;'>
<img style='max-width: 100%; max-height: 100%' src='image file'>
</div>

inline-flex era necessario per evitare che le immagini andassero fuori dal div.

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.