Comment redimensionnez-vous automatiquement une grande image afin qu’elle s’intègre dans un conteneur div de largeur inférieure tout en conservant son rapport largeur: hauteur?
Exemple: stackoverflow.com - lorsqu'une image est insérée dans le panneau de l'éditeur et que l'image est trop grande pour tenir sur la page, l'image est automatiquement redimensionnée.
N'appliquez pas de largeur ni de hauteur explicites à la balise d'image. Au lieu de cela, donnez-le:
max-width:100%;
max-height:100%;
Aussi, height: auto;
si vous voulez spécifier une largeur uniquement.
Exemple: http://jsfiddle.net/xwrvxser/1/
img {
max-width: 100%;
max-height: 100%;
}
.portrait {
height: 80px;
width: 30px;
}
.landscape {
height: 30px;
width: 80px;
}
.square {
height: 75px;
width: 75px;
}
Portrait Div
<div class="portrait">
<img src="http://i.stack.imgur.com/xkF9Q.jpg">
</div>
Landscape Div
<div class="landscape">
<img src="http://i.stack.imgur.com/xkF9Q.jpg">
</div>
Square Div
<div class="square">
<img src="http://i.stack.imgur.com/xkF9Q.jpg">
</div>
Il s'avère qu'il existe un autre moyen de le faire.
<img style='height: 100%; width: 100%; object-fit: contain'/>
va faire le travail. C'est du CSS 3.
Violon: http://jsfiddle.net/mbHB4/7364/
À l'heure actuelle, il n'existe aucun moyen de le faire correctement de manière déterministe, avec des images de taille fixe telles que les fichiers JPEG ou PNG.
Pour redimensionner une image proportionnellement, vous devez définir soit la hauteur ou la largeur sur "100%", mais pas les deux. Si vous définissez les deux sur "100%", votre image sera étirée.
Le choix de la hauteur ou de la largeur dépend de la taille de votre image et de son conteneur:
height="100%"
sur l'image.width="100%"
sur l'image.Si votre image est un fichier SVG, qui est un format d'image vectorielle de taille variable, vous pouvez configurer l'extension pour l'adapter au conteneur.
Vous devez simplement vous assurer que le fichier SVG n'a aucune de ces propriétés définies dans la balise <svg>
:
height
width
viewbox
La plupart des programmes de dessin vectoriel définissent ces propriétés lors de l'exportation d'un fichier SVG. Vous devrez donc modifier manuellement votre fichier à chaque exportation ou écrire un script pour le faire.
Voici une solution qui aligne verticalement et horizontalement votre image dans une div sans l’étirer, même si l’image fournie est trop petite ou trop grande pour tenir dans la div.
Le contenu HTML:
<div id="myDiv">
<img alt="Client Logo" title="Client Logo" src="Imagelocation" />
</div>
Le contenu CSS:
#myDiv
{
height: 104px;
width: 140px;
}
#myDiv img
{
max-width: 100%;
max-height: 100%;
margin: auto;
display: block;
}
La partie jQuery:
var logoHeight = $('#myDiv img').height();
if (logoHeight < 104) {
var margintop = (104 - logoHeight) / 2;
$('#myDiv img').css('margin-top', margintop);
}
Faites simple!
Donnez au conteneur un corrigéheight
, puis pour la balise img
qui se trouve à l'intérieur, définissez width
et max-height
.
<div style="height: 250px">
<img src="..." alt=" " style="width: 100%;max-height: 100%" />
</div>
La différence est que vous définissez la width
sur 100%, et non le max-width
.
Découvrez ma solution: http://codepen.io/petethepig/pen/dvFsA
Il est écrit en CSS pur, sans code JavaScript. Il peut gérer des images de toute taille et de toute orientation.
Étant donné ce code HTML:
<div class="image">
<div class="trick"></div>
<img src="http://placekitten.com/415/200"/>
</div>
le code CSS serait:
.image {
font-size: 0;
text-align: center;
width: 200px; /* Container's dimensions */
height: 150px;
}
img {
display: inline-block;
vertical-align: middle;
max-height: 100%;
max-width: 100%;
}
.trick {
display: inline-block;
vertical-align: middle;
height: 150px;
}
Vous pouvez définir l'image en tant qu'arrière-plan d'un div, puis utiliser le propriété CSS background-size :
background-size: cover;
It "Ajuste l'image de fond pour qu'elle soit la plus grande possible, de sorte que la zone de fond soit entièrement recouverte par l'image de fond. Certaines parties de l'image de fond peuvent ne pas être visibles dans le positionnement de l'arrière-plan zone " - W3Schools
Je viens de publier un plugin jQuery qui fait exactement ce dont vous avez besoin avec beaucoup d'options:
https://github.com/GestiXi/image-scale
Usage:
HTML
<div class="image-container">
<img class="scale" data-scale="best-fit-down" data-align="center" src="img/example.jpg">
</div>
JavaScript
$(function() {
$("img.scale").imageScale();
});
Cette solution n’étire pas l’image et ne remplit pas le conteneur en entier, mais elle en découpe une partie.
HTML:
<div><img src="/images/image.png"></div>
CSS:
div {
width: 100%;
height: 10em;
overflow: hidden;
img {
min-width: 100%;
min-height: 100%;
}
Ce qui suit fonctionne parfaitement pour moi:
img{
height: 99999px;
object-fit:contain;
max-height: 100%;
max-width: 100%;
display: block;
margin: auto auto;
}
J'ai une solution bien meilleure sans avoir besoin de JavaScript. Il est totalement réactif et je l’utilise beaucoup. Vous devez souvent adapter une image de n'importe quel rapport d'aspect à un élément conteneur avec un rapport d'aspect spécifié. Et avoir tout ce processus pleinement réactif est un must.
/* For this demo only */
.container {
max-width: 300px;
margin: 0 auto;
}
.img-frame {
box-shadow: 3px 3px 6px rgba(0, 0, 0, .15);
background: #ee0;
margin: 20px auto;
}
/* This is for responsive container with specified aspect ratio */
.aspect-ratio {
position: relative;
}
.aspect-ratio-1-1 {
padding-bottom: 100%;
}
.aspect-ratio-4-3 {
padding-bottom: 75%;
}
.aspect-ratio-16-9 {
padding-bottom: 56.25%;
}
/* This is the key part - position and fit the image to the container */
.fit-img {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
margin: auto;
max-width: 80%;
max-height: 90%
}
.fit-img-bottom {
top: auto;
}
.fit-img-tight {
max-width: 100%;
max-height: 100%
}
<div class="container">
<div class="aspect-ratio aspect-ratio-1-1 img-frame">
<img src="//placehold.it/400x300" class="fit-img" alt="sample">
</div>
<div class="aspect-ratio aspect-ratio-4-3 img-frame">
<img src="//placehold.it/400x300" class="fit-img fit-img-tight" alt="sample">
</div>
<div class="aspect-ratio aspect-ratio-16-9 img-frame">
<img src="//placehold.it/400x400" class="fit-img" alt="sample">
</div>
<div class="aspect-ratio aspect-ratio-16-9 img-frame">
<img src="//placehold.it/300x400" class="fit-img fit-img-bottom" alt="sample">
</div>
</div>
Vous pouvez définir la largeur maximale et la hauteur maximale indépendamment; l'image respectera la plus petite (en fonction des valeurs et du format de l'image). Vous pouvez également définir une image à aligner à votre guise (par exemple, pour une image de produit sur un fond blanc infini, vous pouvez la positionner facilement au centre, en bas).
Vous devez indiquer au navigateur à quelle hauteur vous le placez:
.example {
height: 220px; /* DEFINE HEIGHT */
background: url('../img/example.png');
background-size: 100% 100%;
background-repeat: no-repeat;
}
Le code ci-dessous est adapté des réponses précédentes et est testé par moi-même à l’aide d’une image appelée storm.jpg
.
C'est le code HTML complet pour une page simple qui affiche l'image. Cela fonctionne parfaitement et a été testé par moi avec www.resizemybrowser.com. Placez le code CSS en haut de votre code HTML, sous votre section head. Placez le code de l'image où vous le souhaitez.
<html>
<head>
<style type="text/css">
#myDiv
{
height: auto;
width: auto;
}
#myDiv img
{
max-width: 100%;
max-height: 100%;
margin: auto;
display: block;
}
</style>
</head>
<body>
<div id="myDiv">
<img src="images/storm.jpg">
</div>
</body>
</html>
J'ai centré et redimensionné proportionnellement une image dans un hyperlien horizontalement et verticalement de cette façon:
#link {
border: 1px solid blue;
display: table-cell;
height: 100px;
vertical-align: middle;
width: 100px;
}
#link img {
border: 1px solid red;
display: block;
margin-left: auto;
margin-right: auto;
max-height: 60px;
max-width: 60px;
}
Il a été testé dans Internet Explorer, Firefox et Safari.
Plus d'informations sur le centrage est ici .
<style type="text/css">
#container{
text-align: center;
width: 100%;
height: 200px; /* Set height */
margin: 0px;
padding: 0px;
background-image: url('../assets/images/img.jpg');
background-size: content; /* Scaling down large image to a div */
background-repeat: no-repeat;
background-position: center;
}
</style>
<div id="container>
<!-- Inside container -->
</div>
Donnez la hauteur et la largeur dont vous avez besoin pour votre image au div qui contient la balise <img>. N'oubliez pas de donner la hauteur/largeur dans la balise de style appropriée.
Dans la balise <img>, donnez le max-height
et le max-width
à 100%.
<div style="height:750px; width:700px;">
<img alt="That Image" style="max-height:100%; max-width:100%;" src="">
</div>
Vous pouvez ajouter les détails dans les classes appropriées après avoir bien compris.
Édition: Le positionnement d'image basé sur une table précédent posait problème dans Internet Explorer 11 (max-height
ne fonctionne pas dans les éléments display:table
). Je l'ai remplacé par un positionnement en ligne qui fonctionne non seulement dans Internet Explorer 7 et Internet Explorer 11, mais qui nécessite également moins de code.
Voici mon point de vue sur le sujet. Cela ne fonctionnera que si le conteneur a une taille spécifiée (max-width
et max-height
ne semblent pas s'entendre avec des conteneurs sans taille concrète), mais j'ai écrit le contenu CSS dans un manière qui permet sa réutilisation (ajoutez picture-frame
class et px125
class class à votre conteneur existant).
En CSS:
.picture-frame
{
vertical-align: top;
display: inline-block;
text-align: center;
}
.picture-frame.px125
{
width: 125px;
height: 125px;
line-height: 125px;
}
.picture-frame img
{
margin-top: -4px; /* Inline images have a slight offset for some reason when positioned using vertical-align */
max-width: 100%;
max-height: 100%;
display: inline-block;
vertical-align: middle;
border: 0; /* Remove border on images enclosed in anchors in Internet Explorer */
}
Et en HTML:
<a href="#" class="picture-frame px125">
<img src="http://i.imgur.com/lesa2wS.png"/>
</a>
/* Main style */
.picture-frame
{
vertical-align: top;
display: inline-block;
text-align: center;
}
.picture-frame.px32
{
width: 32px;
height: 32px;
line-height: 32px;
}
.picture-frame.px125
{
width: 125px;
height: 125px;
line-height: 125px;
}
.picture-frame img
{
margin-top: -4px; /* Inline images have a slight offset for some reason when positioned using vertical-align */
max-width: 100%;
max-height: 100%;
display: inline-block;
vertical-align: middle;
border: 0; /* Remove border on images enclosed in anchors in Internet Explorer */
}
/* Extras */
.picture-frame
{
padding: 5px;
}
.frame
{
border:1px solid black;
}
<p>32px</p>
<a href="#" class="picture-frame px32 frame">
<img src="http://i.imgur.com/lesa2wS.png"/>
</a>
<a href="#" class="picture-frame px32 frame">
<img src="http://i.imgur.com/kFMJxdZ.png"/>
</a>
<a href="#" class="picture-frame px32 frame">
<img src="http://i.imgur.com/BDabZj0.png"/>
</a>
<p>125px</p>
<a href="#" class="picture-frame px125 frame">
<img src="http://i.imgur.com/lesa2wS.png"/>
</a>
<a href="#" class="picture-frame px125 frame">
<img src="http://i.imgur.com/kFMJxdZ.png"/>
</a>
<a href="#" class="picture-frame px125 frame">
<img src="http://i.imgur.com/BDabZj0.png"/>
</a>
Edit: Améliorations supplémentaires possibles avec JavaScript (upscaling images)
function fixImage(img)
{
var $this = $(img);
var parent = $this.closest('.picture-frame');
if ($this.width() == parent.width() || $this.height() == parent.height())
return;
if ($this.width() > $this.height())
$this.css('width', parent.width() + 'px');
else
$this.css('height', parent.height() + 'px');
}
$('.picture-frame img:visible').each(function
{
if (this.complete)
fixImage(this);
else
this.onload = function(){ fixImage(this) };
});
La réponse acceptée par Thorn007 ne fonctionne pas lorsque l'image est trop petite .
Pour résoudre ce problème, j'ai ajouté un facteur d'échelle . De cette façon, cela agrandit l'image et remplit le conteneur div.
Exemple:
<div style="width:400px; height:200px;">
<img src="pix.jpg" style="max-width:100px; height:50px; transform:scale(4); transform-Origin:left top;" />
</div>
Remarques:
-webkit-transform:scale(4); -webkit-transform-Origin:left top;
dans le style.Je vois que beaucoup de gens sont suggestion object-fit , ce qui est une bonne option. Mais si vous voulez aussi travailler dans anciens navigateurs , il existe un autre moyen de le faire facilement.
S'il vous plaît vérifier ma réponse ici: IE et correctif Edge pour object-fit: cover;
C'est assez simple. L’approche que j’ai choisie consistait à positionner l’image à l’intérieur du conteneur avec absolute , puis et placez-la au centre en utilisant la combinaison:
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
Une fois au centre, je donne à l'image,
// For vertical blocks (i.e., where height is greater than width)
height: 100%;
width: auto;
// For Horizontal blocks (i.e., where width is greater than height)
height: auto;
width: 100%;
Cela donne à l'image l'effet de Object-fit: cover.
https://jsfiddle.net/furqan_694/s3xLe1gp/
Cette logique fonctionne dans tous les navigateurs.
Comme répondu ici , vous pouvez également utiliser vh
unités au lieu de max-height: 100%
si cela ne fonctionne pas sur votre navigateur (comme Chrome):
img {
max-height: 75vh;
}
Une solution simple (solution en 4 étapes !!) qui semble fonctionner pour moi est la suivante. L'exemple utilise la largeur pour déterminer la taille totale, mais vous pouvez également l'inverser pour utiliser plutôt la hauteur.
%
pour la taille relative ou la mise à l'échelle automatique (en fonction du conteneur d'image ou de l'affichage).px
(ou autre) pour une cote statique ou définiePar exemple,
<img style="width:100%; height:auto;"
src="https://googledrive.com/Host/0BwDx0R31u6sYY1hPWnZrencxb1k/thanksgiving.png"
/>
Toutes les réponses fournies, y compris celle acceptée, fonctionnent uniquement en supposant que l'encapsuleur div
a une taille fixe. Voici donc comment faire quelle que soit la taille de l’encapsuleur div
, ce qui est très utile si vous développez une page responsive:
Ecrivez ces déclarations dans votre sélecteur DIV
:
width: 8.33% /* Or whatever percentage you want your div to take */
max-height: anyValueYouWant /* (In px or %) */
Placez ensuite ces déclarations dans votre sélecteur IMG
:
width: "100%" /* Obligatory */
max-height: anyValueYouWant /* (In px or %) */
TRES IMPORTANT:
La valeur de maxHeight
doit être la même chose pour DIV
et IMG
sélecteurs.
J'ai résolu ce problème en utilisant le code suivant:
<div class="container"><img src="image_url" /></div>
.container {
height: 75px;
width: 75px;
}
.container img {
object-fit: cover;
object-position: top;
display: block;
height: 100%;
width: 100%;
}
Si vous utilisez Bootstrap, il vous suffit d’ajouter la classe img-responsive
à la balise img
:
<img class="img-responsive" src="img_chania.jpg" alt="Chania">
Une solution simple consiste à utiliser flexbox. Définissez le CSS du conteneur sur:
.container{
display: flex;
justify-content: center;
align-items: center;
align-content: center;
overflow: hidden;
/* Any custom height */
}
Ajustez la largeur de l’image contenue à 100% et vous obtiendrez une image Nice centrée dans le conteneur avec les dimensions préservées.
La solution est facile avec un peu de maths ...
Il suffit de placer l'image dans un div, puis dans le fichier HTML où vous spécifiez l'image. Définissez les valeurs de largeur et de hauteur en pourcentage en utilisant les valeurs en pixels de l'image pour calculer le rapport exact entre largeur et hauteur.
Par exemple, supposons que votre image ait une largeur de 200 pixels et une hauteur de 160 pixels. Vous pouvez dire en toute sécurité que la valeur de la largeur sera de 100%, car il s'agit de la valeur la plus grande. Pour calculer ensuite la valeur de la hauteur, il suffit de diviser la hauteur par la largeur, ce qui donne la valeur en pourcentage de 80%. Dans le code, cela ressemblera à quelque chose comme ça ...
<div class="image_holder_div">
<img src="some_pic.png" width="100%" height="80%">
</div>