Comment ajuster une image (img) dans un div et conserver le rapport hauteur / largeur?

136

J'ai un div 48x48 et à l'intérieur il y a un élément img, je veux l'insérer dans le div sans perdre aucune partie, en attendant le rapport est conservé, est-ce réalisable en utilisant html et css?

Bin Chen
la source

Réponses:

70

Vous aurez besoin de JavaScript pour empêcher le recadrage si vous ne connaissez pas la dimension de l'image au moment où vous écrivez le css.

HTML et 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%;
}

Si vous utilisez une bibliothèque JavaScript, vous souhaiterez peut-être en profiter.

Thomas
la source
2
La réponse de Michael est beaucoup plus simple et n'utilise pas Javascript. Je ne connais pas la compatibilité des navigateurs.
weberc2
3
Non, la réponse de Michael fonctionne tant que l'image est plus grande que la div. Si vous voulez que l'image remplisse le div concernant la taille de l'image (et, si vous ne connaissez pas la taille de l'image à l'avance, vous le faites), c'est la voie à suivre.
Rémy DAVID
2
Ne pourriez-vous pas utiliser max-height: 100%; largeur max: 100%; largeur min: 100%; min-height: 100% et obtenir le même résultat alors? Question honnête.
Daniel Casserly
Non, en faisant cela, vous forcez la largeur et la hauteur à être de 100%, donc vous modifiez le rapport hauteur / largeur de l'image.
gztomas
onload ne sera pas appelé lorsque l'image est mise en cache dans le navigateur, donc cela ne fonctionnera que lorsque l'image est chargée pour la première fois.
Redtopia
314

Utilisez max-height:100%; max-width:100%;pour l'image à l'intérieur du div.

Michael
la source
4
@ZoveGames Navigateurs non compatibles JS? Les statistiques Yahoo de 2010 montrent une moyenne de 1,3%. Je pense qu'il est prudent de supposer que a. il est probablement plus bas aujourd'hui et b. programmers.stackexchange.com/questions/26179/…
EasyCo
5
Cela ne fonctionne pas pour moi ... Cela rend l'image 100% de sa propre taille (par exemple: 300px de large pour une image qui fait en fait 300px de large).
Tomáš Zato - Réintégrer Monica le
1
Il y a un terrible bug spécifique à Chrome sur Windows que cela provoque. Potentiellement une mauvaise interaction avec certains plugins smoothscroll que j'ai. Il finit par essayer de faire défiler le corps même si la souris se trouve sur un overflow:scrolldiv avec une grande image. Curieuse. Encore plus étrange: la solution de Max le corrige. J'en ai assez du CSS, vraiment. Utilisé pour être puissant et cool. Maintenant, les implémentations produisent simplement une incohérence boguée après une incohérence boguée.
Steven Lu
21
ne fonctionne que lors de la réduction d'une image. si vous voulez insérer une petite image dans un conteneur plus grand, cela ne fonctionnera pas
Yossi Shasho
2
Il ne préserve pas le rapport hauteur / largeur d'origine de l'image.
Ĭsααc t ի ε βöss
78

Malheureusement max-width + max-height ne couvrent pas entièrement ma tâche ... J'ai donc trouvé une autre solution:

Pour enregistrer le rapport d'image lors de la mise à l'échelle, vous pouvez également utiliser la object-fitpropriété CSS3.

Article utile: contrôler les proportions d'image avec CSS3

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

Mauvaise nouvelle: IE non pris en charge ( puis-je utiliser )

Andrii Verbytskyi
la source
6
Cela doit être marqué comme la réponse. "Object-fit" a parfaitement fonctionné.
Ĭsααc t ի ε βöss
Curieusement, il semble que la prise en charge de cela ait été introduite dans iOS 8.1, et non dans 8.0.
ray
2
object-fit: cover; travaillé pour moi. Ici: stackoverflow.com/questions/9071830/…
Deke
1
Si vous voulez que l'image soit en haut à gauche plutôt que centrée, vous devez également utiliser la position d'objet 0 0.
Chris Rae
C'est la seule réponse qui a fonctionné pour moi pour créer un arrière-plan d'image réactif qui remplit l'écran tout en conservant le rapport hauteur / largeur de l'image.
Ray Li
39

Utilisation de CSS uniquement:

div > img {
  width: auto;
  height : auto;
  max-height: 100%;
  max-width: 100%;
}
Max
la source
ne passe pas à l'échelle
JFFIGK
17

HTML

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

CSS

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

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

Cela fera agrandir l'image pour remplir son parent, dont sa taille est définie dans le divCSS.

Alex
la source
2
N'ajoutez pas height: 100%, cela faussera le rapport d'image - l'OP veut maintenir le rapport.
casablanca
Je ne sais pas ce que signifiait le PO, mais là, vous ne conserveriez pas le bon ratio?
Trufa
que puis-je faire pour conserver le ratio? Si je supprime la hauteur: 100% l'image sera recadrée.
Bin Chen
7

J'avais beaucoup de problèmes pour que cela fonctionne, chaque solution que j'ai trouvée ne semblait pas fonctionner.

J'ai réalisé que je devais régler l'affichage div sur flex, donc en gros, voici mon CSS:

div{
display: flex;
}

div img{ 
max-height: 100%;
max-width: 100%;
}
Bartho Bernsmann
la source
Mes images sont déformées avec cette solution dans Chrome Version 61
Yevgeniy Afanasyev
Peut-être que votre div a une hauteur / hauteur ou une largeur maximale définie, ce qui cause la distorsion de votre image.
Bartho Bernsmann
Exactement mon point .. L'image est déformée parce que vous définissez la largeur et la hauteur sur votre <div class = "w">
Bartho Bernsmann
Pour votre exemple .. Je crois que vous cherchez quelque chose comme sur votre image CSS: height: auto; largeur: 100%;
Bartho Bernsmann
la tâche était d'adapter l'image dans un div, cela implique que div a les dimensions et l'image n'a que le rapport hauteur / largeur. J'ai besoin de régler la hauteur sur une valeur, sinon les conditions de la question seront déformées ainsi que mon image. Jetez un œil à JS Fiddle et changez ce que vous pensez être nécessaire pour le faire fonctionner. Merci.
Yevgeniy Afanasyev
6

Essayez CSS:

img {
  object-fit: cover;
  height: 48px;
}
Faisal
la source
3

Pour moi, le CSS suivant a fonctionné (testé dans Chrome, Firefox et Safari).

Il y a plusieurs choses qui fonctionnent ensemble:

  • max-height: 100%;, max-width: 100%;et height: auto;, width: auto;mettez l'image à l'échelle selon la dimension qui atteint en premier 100% tout en conservant le rapport hauteur / largeur
  • position: relative;dans le conteneur et position: absolute;dans l'enfant avec top: 50%;et left: 50%;centrer le coin supérieur gauche de l'image dans le conteneur
  • transform: translate(-50%, -50%); déplace l'image vers la gauche et le haut de la moitié de sa taille, centrant ainsi l'image dans le conteneur

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%);
}
VSchlattinger
la source
1

Définir la photo comme image d'arrière-plan nous donnera plus de contrôle sur la taille et le placement, laissant la balise img servir un objectif différent ...

Ci-dessous, si nous voulons que le div ait le même rapport hauteur / largeur que la photo, alors placeholder.png est une petite image transparente avec le même rapport hauteur / largeur que photo.jpg. Si la photo est un carré, c'est un espace réservé 1px x 1px, si la photo est une vignette vidéo, c'est un espace réservé 16x9, etc.

Spécifique à la question, utilisez un espace réservé 1x1 pour maintenir le rapport carré de la div, avec une image d'arrière-plan en utilisant background-sizepour maintenir le rapport hauteur / largeur de la photo.

Je l'ai utilisé background-position: center center;pour que la photo soit centrée dans le div. (Aligner la photo au centre ou en bas vertical deviendrait moche avec la photo dans la balise 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>

Pour éviter une demande supplémentaire http, convertir l'image de l' espace réservé à une donnée: URL .

<img src="data:image/png;base64,..."/>
Développeur Web
la source
0

vous pouvez utiliser la classe "img-fluid" pour une version plus récente, à savoir Bootstrap v4 .

et peut utiliser la classe "img-responsive" pour les anciennes versions comme Bootstrap v3 .

Utilisation : -

balise img avec: -

class = "img-fluide"

src = "..."

Saurabh Sheorain
la source
0

Voici une approche entièrement JavaScript. Il redimensionne progressivement une image jusqu'à ce qu'elle s'adapte correctement. Vous choisissez combien de réduire à chaque fois qu'il échoue. Cet exemple le réduit de 10% à chaque fois qu'il échoue:

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);
});

N'hésitez pas à copier et coller directement.

Plage de Jared
la source
0

Ce qui a fonctionné pour moi était:

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

inline-flex était nécessaire pour empêcher les images de sortir de la division.

Nomad77
la source