Comment remplir un div avec une image tout en le maintenant proportionnel?

j'ai trouvé ce thread - comment étirez-vous une image pour remplir un

tout en gardant le format de l'image? - ce n'est pas tout ce que je veux.

j'ai un div avec une certaine taille et d'une image à l'intérieur d'elle. Je veux toujours remplir la div avec l'image indépendamment si l'image est le paysage ou le portrait. Et cela n'a pas d'importance si l'image est coupée (la div elle-même a un débordement caché).

donc si l'image est portrait je veux que le width soit 100% et le height:auto donc il reste en proportion. Si l'image est paysage, je veux que le height soit 100% et le width to be auto`. Sons droit compliqué?

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

comme je ne sais pas comment le faire, j'ai simplement créé une image rapide de ce que je veux dire. Je ne peux même pas décrire correctement.

enter image description here

donc, je suppose que je ne suis pas la première à demander ça. Cependant, je ne pouvais pas vraiment trouver une solution à cette question. Peut - être qu'il y a une nouvelle façon de faire CSS3-je pense à flex-box. Une idée? C'est peut-être encore plus facile que ce que je m'y attendais?

66
demandé sur TylerH 2013-01-03 19:54:21

13 réponses

si je comprends bien ce que vous voulez, vous pouvez laisser les attributs de largeur et de hauteur hors de l'image pour maintenir le rapport d'aspect et utiliser flexbox pour faire le centrage pour vous.

.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 ici

j'ai testé cela avec succès dans IE9, Chrome 31, et Opera 18. Mais aucun autre navigateur n'a été testé. Comme toujours, vous devez tenir compte de votre soutien exigence.

96
répondu Isius 2018-01-22 21:26:46

c'est un peu tard mais j'ai juste eu le même problème et je l'ai finalement résolu avec l'aide d'un autre poteau de débordement ( https://stackoverflow.com/a/29103071 ).

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

J'espère que ça aide encore quelqu'un.

Ps: fonctionne Aussi avec max-height , max-width , min-width et min-height propriétés css. C'est particulièrement pratique pour utiliser des unités de longueur comme 100% ou 100vh / 100vw pour remplir le conteneur ou toute la fenêtre du navigateur.

27
répondu Hermilton 2017-05-23 11:47:25

une vieille question mais mérite une mise à jour car il y a maintenant un moyen.

la bonne réponse basée sur CSS est d'utiliser object-fit: cover , qui fonctionne comme background-size: cover . Le positionnement serait pris en compte par l'attribut object-position , par défaut au centrage.

mais il n'y a aucun support pour cela dans les navigateurs IE / Edge, ou Android < 4.4.4. De plus, object-position n'est pas supporté par Safari, iOS ou OSX. Polyfills existent, object-fit-images semble donner de meilleurs.

pour plus de détails sur le fonctionnement de la propriété, Voir CSS Tricks article sur object-fit pour explication et démo.

7
répondu holist 2016-06-02 09:59:10

Cela devrait le faire:

img {    
min-width: 100%;
min-height: 100%;
width: auto;
height: auto;
}
4
répondu maksim1 2016-08-05 08:54:02

envisager d'utiliser background-size: cover (IE9+) en conjonction avec background-image . Pour IE8 -, il y a un polyfill .

2
répondu Marat Tanalin 2015-05-08 19:16:31

vous pouvez utiliser div pour atteindre cet objectif. sans étiquette img :) espérons que cela aide.

.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>
2
répondu Sivasakthivel Kalaiarasu 2017-11-29 09:11:07

Voici mon exemple de travail. J'ai utilisé un truc qui définit l'image comme arrière-plan du conteneur div avec background-size: cover and background-position: center center

j'ai placé l'image avec largeur:100% et opacité:0 ce qui la rend invisible. Notez que je ne montre mon image que parce que j'ai un intérêt particulier sur l'appel de l'événement de clic d'enfant.

s'il vous plaît noter que altught I am ussing angular il est complètement hors de propos.

<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>

le résultat est celui que vous définissez comme optimal dans tous les cas""

0
répondu Noel Carcases 2016-05-26 12:47:42

essayez ceci:

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

Espérons que cette aide

0
répondu Landerqvist 2016-08-07 02:28:54

les valeurs des propriétés CSS object-fit: cover et object-position: left center règlent maintenant ce problème.

0
répondu James 2018-06-08 07:46:56

la seule façon de réaliser le "meilleur scénario" décrit, était de mettre l'image en arrière-plan:

<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%;
}​
0
répondu David Nathan 2018-07-19 16:32:33

toutes les réponses ci-dessous ont une largeur et une hauteur fixes, ce qui rend la solution"non responsive".

pour obtenir le résultat mais garder l'image responsive j'ai utilisé le suivant:

  1. à l'Intérieur du contenant placer une image gif transparente avec la proportion désirée
  2. Donner une image de la balise inline css arrière-plan de l'image que vous souhaitez redimensionner et recadrer

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;
}​
0
répondu Artur Klassen 2018-07-23 21:20:15

vous pouvez y parvenir en utilisant les propriétés CSS flex. S'il vous plaît voir le code ci-dessous

.img-container {
  width: 150px;
  height: 150px;
  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>
0
répondu Sandeep K Nair 2018-09-11 17:24:35

Non, il n'y a pas de solution uniquement CSS3. Le réponse sommet sur la question liée est la deuxième meilleure chose, bien que.

-1
répondu Lynn 2017-05-23 12:34:45