205 votes

Pourquoi flexbox étire-t-il mon image plutôt que de conserver le rapport hauteur/largeur ?

Flexbox a ce comportement où il étire les images à leur hauteur naturelle. En d'autres termes, si j'ai un conteneur flexbox avec une image enfant, et que je redimensionne la largeur de cette image, la hauteur ne se redimensionne pas du tout et l'image est étirée.

div {
  display: flex; 
  flex-wrap: wrap;
}

img {
  width: 50%
}

    Titre
    Paragraphe

Qu'est-ce qui cause cela?

6 votes

Dans Firefox et IE, cela fonctionne bien. Dans Chrome, vous pouvez corriger avec align-self:flex-start dans l'image. Je ne sais pas pourquoi, peut-être que la valeur par défaut dans Chrome est stretch.

2 votes

Aussi, en ajoutant height: 100%; à l'image résout le problème, j'aimerais savoir pourquoi cela étire également l'image.

3 votes

@blonfu, la valeur par défaut dans tous les navigateurs est align-items: stretch / align-self: stretch. Si vous ajoutez une bordure autour de chaque élément et supprimez wrap, vous remarquerez que tous les éléments s'étirent dans tous les navigateurs : codepen.io/anon/pen/oLXBVx?editors=1100

442voto

pradeep1991singh Points 3614

Il s'étire parce que la valeur par défaut de align-self est stretch. Définissez align-self sur center.

align-self: center;

Voir la documentation ici : align-self

0 votes

Oui mais les autres navigateurs maintiennent le rapport hauteur/largeur des images. Chrome n'utilise pas flex-basis sur les img

19 votes

Je pense que align-self: start; peut être une réponse plus forte car les images doivent s'aligner verticalement en haut de leurs conteneurs (pas au centre) comme le ferait une image sans style (pas de css). De toute façon, les deux réponses corrigent l'étirement. Donc cela dépend de ce que l'OP veut bien sûr - juste je n'ai pas eu l'impression que l'OP voulait un alignement vertical centré d'après son message.

0 votes

Si vous ne définissez pas une largeur sur une image et qu'elle se trouve dans un conteneur flex, elle s'étirera à 100%. align-self: [flex-start, center...others] empêchera l'image de prendre 100% de la largeur du conteneur flex. align-self:center le corrige bien sûr, mais si vous voulez que votre image commence ou se termine à partir du début du conteneur, utilisez align-items: flex-start ou flex-end

21voto

Dorian Points 2384

La clé d'attribut est align-self: center:

.container {
  display: flex;
  flex-direction: column;
}

img {
  max-width: 100%;
}

img.align-self {
  align-self: center;
}

    Sans align-self:

    Avec align-self:

3voto

Igal Points 836

J'ai rencontré le même problème avec un menu Foundation. align-self: center; n'a pas fonctionné pour moi.

Ma solution a été d'envelopper l'image avec un

...

2 votes

Il s'agit cependant de flexbox.

0 votes

Voici une solution pour flexbox. L'image et la div sont à l'intérieur d'un conteneur flexbox.

2voto

Akash Points 5697

Ajouter marge pour aligner les images:

Comme nous voulions que l'image soit alignée à gauche, nous avons ajouté :

img {
  margin-right: auto;
}

De même pour que l'image soit alignée à droite, nous pouvons ajouter margin-right: auto;. L'extrait montre une démo pour les deux types d'alignement.

Bonne chance...

div {
  display:flex; 
  flex-direction:column;
  border: 2px black solid;
}

h1 {
  text-align: center;
}
hr {
  border: 1px black solid;
  width: 100%
}
img.one {
  margin-right: auto;
}

img.two {
  margin-left: auto;
}

  Boîte flexible

-2voto

Utilisez display block pour l'image qui se trouve à l'intérieur d'un conteneur flex

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X