Comment étirer une image pour remplir un tout en gardant le format de l'image?

je dois rendre cette image étirer à la taille maximale possible sans déborder il est <div> ou fausser l'image.

Je ne peux pas prédire le rapport d'aspect de l'image, donc il n'y a aucun moyen de savoir s'il faut utiliser:

<img src="url" style="width: 100%;">

ou

<img src="url" style="height: 100%;">

Je ne peux pas utiliser les deux (i.e. style=" width: 100%; height: 100%;") parce que cela étirera l'image pour s'adapter au <div> .

le <div> a une taille définie par pourcentage de l'écran, ce qui est également imprévisible.

150
demandé sur Jojodmo 2009-12-12 04:16:08

15 réponses

mise à jour 2016:

navigateur Moderne se comportent beaucoup mieux. Tout ce que vous devez faire est de définir la largeur de l'image à 100% ( demo )

.container img {
   width: 100%;
}

comme vous ne connaissez pas le format d'image, vous devrez utiliser quelques scripts. Voici comment je le ferais avec jQuery ( demo ):

CSS

.container {
    width: 40%;
    height: 40%;
    background: #444;
    margin: 0 auto;
}
.container img.wide {
    max-width: 100%;
    max-height: 100%;
    height: auto;
}
.container img.tall {
    max-height: 100%;
    max-width: 100%;
    width: auto;
}​

HTML

<div class="container">
 <img src="http://i48.tinypic.com/wrltuc.jpg" />
</div>
<br />
<br />
<div class="container">
 <img src="http://i47.tinypic.com/i1bek8.jpg" />
</div>

Script

$(window).load(function(){
 $('.container').find('img').each(function(){
  var imgClass = (this.width/this.height > 1) ? 'wide' : 'tall';
  $(this).addClass(imgClass);
 })
})
159
répondu Mottie 2016-07-22 21:47:08

pas une solution parfaite, mais ce CSS pourrait aider. Le zoom est ce qui fait fonctionner ce code, et le facteur devrait théoriquement être infini pour fonctionner idéalement pour les petites images - mais 2, 4, ou 8 fonctionne bien dans la plupart des cas.

#myImage {
    zoom: 2;  //increase if you have very small images

    display: block;
    margin: auto;

    height: auto;
    max-height: 100%;

    width: auto;
    max-width: 100%;
}
66
répondu Prouda 2012-10-26 22:10:41

il y a une façon beaucoup plus facile de le faire en utilisant seulement CSS et HTML :

HTML:

<div class="fill"></div>

CSS:

.fill {
    overflow: hidden;
    background-size: cover;
    background-position: center;
    background-image: url('path/to/image.jpg');
}

cela placera votre image comme arrière-plan, et l'étirera pour s'adapter à la taille div sans distorsion.

57
répondu Ryan 2016-07-01 15:36:27

si vous le pouvez, utilisez les images de fond et mettez background-size: cover . L'arrière-plan couvrira donc l'ensemble de l'élément.

CSS

div {
  background-image: url(path/to/your/image.png);
  background-repeat: no-repeat;
  background-position: 50% 50%;
  background-size: cover;
}

si vous êtes coincé avec l'utilisation d'images en ligne il ya quelques options. D'abord, il y a

object-fit

cette propriété agit sur des images, des vidéos et d'autres objets similaires à background-size: cover .

CSS

img {
  object-fit: cover;
}

Malheureusement, prise en charge du navigateur n'est pas super avec internet explorer jusqu'à la version 11 n'est pas soutenu. L'option suivante utilise jQuery

CSS + jQuery

HTML

<div>
  <img src="image.png" class="cover-image">
</div>

CSS

div {
  height: 8em;
  width: 15em;
}

Personnalisé plugin jQuery

(function ($) {
  $.fn.coverImage = function(contain) {
    this.each(function() {
      var $this = $(this),
        src = $this.get(0).src,
        $wrapper = $this.parent();

      if (contain) {
        $wrapper.css({
          'background': 'url(' + src + ') 50% 50%/contain no-repeat'
        });
      } else {
        $wrapper.css({
          'background': 'url(' + src + ') 50% 50%/cover no-repeat'
        });
      }

      $this.remove();
    });

    return this;
  };
})(jQuery);

utilisez le plugin comme ceci

jQuery('.cover-image').coverImage();

il prendra une image, la définira comme une image de fond sur l'élément d'enrubannage de l'image et supprimera la balise img du document. Enfin vous pouvez utiliser

pur CSS

vous pourriez utiliser ceci comme un repli. L'image sera agrandie pour couvrir son conteneur, mais elle ne sera pas réduite.

CSS

div {
  height: 8em;
  width: 15em;
  overflow: hidden;
}

div img {
  min-height: 100%;
  min-width: 100%;
  width: auto;
  height: auto;
  max-width: none;
  max-height: none;
  display: block;
  position: relative;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

Hope cela peut aider quelqu'un, amusez-vous!

23
répondu daniels 2015-11-12 08:14:45

merci à CSS3

img
{
   object-fit: contain;
}

https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit

IE BORD et comme toujours des étrangers: http://caniuse.com/#feat=object-fit

9
répondu It_Never_Works 2016-04-18 12:15:59

c'est impossible avec juste HTML et CSS, ou au moins follement exotique et compliqué. Si vous êtes prêt à ajouter du javascript, voici une solution en utilisant jQuery:

$(function() {
    $(window).resize(function() {
        var $i = $('img#image_to_resize');
        var $c = $img.parent();
        var i_ar = $i.width() / $i.height(), c_ar = $c.width() / $c.height();            
        $i.width(i_ar > c_ar ? $c.width() : $c.height() * (i_ar));
    });
    $(window).resize();
});

qui redimensionnera l'image pour qu'elle rentre toujours dans l'élément parent, quelle que soit sa taille. Et comme il est relié à l'événement $(window).resize() , lorsque l'utilisateur redimensionne la fenêtre, l'image s'ajustera.

cela ne tente pas de centrer l'image dans le conteneur, ce serait possible, mais je suppose que ce n'est pas ce que vous êtes après.

5
répondu Tatu Ulmanen 2009-12-12 01:55:12

Définir la largeur et la hauteur de l'extérieur container div. Ensuite, utilisez le style ci-dessous sur img:

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

cela vous aidera à garder un rapport d'aspect de votre img

5
répondu Chintan Bhatt 2014-03-27 19:01:01

je suis tombé sur cette question à la recherche d'un problème similaire. Je fais une page Web avec un design responsive et la largeur des éléments placés sur la page est réglée à un pourcentage de la largeur de l'écran. La hauteur est réglée avec une valeur vw.

puisque je suis en train d'ajouter des messages avec PHP et un backend de base de données, CSS pur était hors de question. J'ai cependant trouvé la solution jquery/javascript un peu troblesome, donc je suis venu avec une solution soignée (donc je pense moi-même au moins).

HTML (ou php)

div.imgfill {
  float: left;
  position: relative;
  background-repeat: no-repeat;
  background-position: 50%  50%;
  background-size: cover;
  width: 33.333%;
  height: 18vw;
  border: 1px solid black; /*frame of the image*/
  margin: -1px;
}
<div class="imgfill" style="background-image:url(source/image.jpg);">
  This might be some info
</div>
<div class="imgfill" style="background-image:url(source/image2.jpg);">
  This might be some info
</div>
<div class="imgfill" style="background-image:url(source/image3.jpg);">
  This might be some info
</div>

en utilisant style="" il est possible D'avoir PHP mettre à jour ma page dynamiquement et le style CSS avec style=" " finira dans une image parfaitement couverte, échelle pour couvrir le div-tag dynamique.

4
répondu Christian Jensen 2016-04-26 11:17:23

en utilisant cette méthode, vous pouvez remplir votre div avec le rapport d'image variant de divs et d'images.

jQuery:

$(window).load(function(){
   $('body').find(.fillme).each(function(){
      var fillmeval = $(this).width()/$(this).height();
      var imgval = $this.children('img').width()/$this.children('img').height();
      var imgClass;
      if(imgval > fillmeval){
          imgClass = "stretchy";
      }else{
          imgClass = "stretchx";
      }
      $(this).children('img').addClass(imgClass);
   });
});

HTML:

<div class="fillme">
   <img src="../images/myimg.jpg" />
</div>

CSS:

.fillme{
  overflow:hidden;
}
.fillme img.stretchx{
  height:auto;
  width:100%;
}
.fillme img.stretchy{
  height:100%;
  width:auto;
}
3
répondu user1994142 2013-01-20 06:03:25

Cela a fonctionné pour moi

div img {
    width: 100%;
    min-height: 500px;
    width: 100vw;
    height: 100vh;
    object-fit: cover;
}
3
répondu Developer_D 2016-11-18 16:37:15

vous pouvez utiliser object-fit: cover; sur le div parent.

https://css-tricks.com/almanac/properties/o/object-fit /

3
répondu Amrit Anandh 2017-08-18 10:17:34

si vous travaillez avec IMG tag, c'est facile.

j'ai fait ceci:

<style>
        #pic{
            height: 400px;
            width: 400px;
        }
        #pic img{
            height: 225px;               
            position: relative;
            margin: 0 auto;
        }
</style>

<div id="pic"><img src="images/menu.png"></div>

$(document).ready(function(){
            $('#pic img').attr({ 'style':'height:25%; display:none; left:100px; top:100px;' })
)}

mais je n'ai pas trouvé comment le faire fonctionner avec #pic { background:url(img/menu.png)} Enyone? Merci

2
répondu aleXela 2013-03-25 17:01:04

pour rendre cette image étirer à la taille maximale possible sans déborder c'est ou bifurquer l'image.

S'applique...

img {
  object-fit: cover;
  height: -webkit-fill-available;
}

styles à l'image.

2
répondu ianbeans 2017-12-12 17:52:26

HTML:

<style>
#foo, #bar{
    width: 50px; /* use any width or height */
    height: 50px;
    background-position: center center;
    background-repeat: no-repeat;
    background-size: cover;
}
</style>

<div id="foo" style="background-image: url('path/to/image1.png');">
<div id="bar" style="background-image: url('path/to/image2.png');">

JSFiddle

...Et si vous voulez définir ou modifier l'image (en utilisant #foo comme exemple):

jQuery:

$("#foo").css("background-image", "url('path/to/image.png')");

JavaScript:

document.getElementById("foo").style.backgroundImage = "url('path/to/image.png')";
1
répondu Patch92 2016-06-29 23:07:36

si vous souhaitez définir une largeur ou une hauteur maximale (de sorte qu'elle ne sera pas très grande) tout en conservant le format des images, vous pouvez le faire:

img{
   object-fit: contain;
   max-height: 70px;
}
1
répondu Bohao LI 2018-06-02 11:00:02