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.