0
votes

Quelqu'un peut-il m'expliquer ce problème de Flexbox CSS?

Demo: https://codesandbox.io/s/confidid-bash-55v3z

Je suivais le long du tutoriel et j'ai rencontré ce problème. Le code est simple

j'ai un conteneur flex appelé images xxx

et pour la feuille de style que j'ai < Pré> xxx

Le look prévu est comme celui-ci

Entrez la description de l'image ici

Cependant, lorsque j'ai commenté le Hauteur: 111px; ligne, la mise en page est éteinte Entrez la description de l'image ici

Je suis nouveau à Flexbox et CSS en général et je sais que flex-base est doux de min -Width . Sans la hauteur étant 111px , l'image se développera pour occuper plus d'espace que son min-width (ou flex-base

Donc, ma question est de réaliser la mise en page correcte, comment l'auteur d'origine de la feuille de style savait-il que la hauteur doit être 111px ? Pouvons-nous atteindre cette disposition à l'aide de «max-largeur» ou d'autres techniques qui auraient plus de sens pour moi?


1 commentaires

Il suffit de créer un exemple avec elle et dans les deux cas (avec hauteur: 111px ou sans), il est brisé: jsfiddle.net/fqtye7dv


3 Réponses :


0
votes

au lieu de flex-base code>, essayez d'ajouter largeur code>. Cela gardera 2 images dans une ligne. Flex-Base Code> D'autre part est pour la taille initiale de l'image.

img.sub1, img.sub2 {
    width: 50%;
    padding: 0;
}


0 commentaires

0
votes

Vous ne définissez aucune largeur ou une hauteur à vos images, alors par défaut, ils prennent leurs véritables dimensions. Dans ce cas, vos images "sous" sont plus larges que la largeur que vous définissez à votre conteneur, par ainsi que, par flex-flow: enveloppe de rangée; Les images ne peuvent pas être sur la même ligne. Vous devez définir une largeur de 50% sur vos sous-images ou définir une plus grande largeur sur le conteneur.

Je l'ai réparé ici


2 commentaires

Votre solution ressemble exactement à la même chose que le problème que le PO parle de moi.


Vous avez raison, je n'ai pas enregistré les changements. Les a sauvés maintenant



1
votes

Tout d'abord, sur le numéro magique.

Vous avez un conteneur de 234px de large et deux images plus petites ayant des dimensions naturelles de 150px de 150px. Leur largeur combinée est de 300px, qui est plus grande que la largeur du conteneur, de sorte qu'elles ne correspondent pas dans la même rangée. P>

Nous pouvons résoudre ce problème en les rendant plus petit. Mais à quel point faut-il être petit? Il y a un rembourrage 1Px autour de chaque image, pour deux images de 4 pixels. Nous devons soustrayer cela de la largeur du conteneur. Quelles feuilles 234 - 4 = 230 pixels pour deux images, ou 230/2 = 115 pixels pour chaque image. P>

Dans votre exemple, la taille des images est contrôlée à l'aide de la hauteur code> et Flex-Base Code>. L'utilisation des deux en même temps peut conduire à des proportions déformées. Cela arrive effectivement à l'image supérieure de votre exemple "Look". Si vous le comparez à l'image d'origine, vous pouvez voir qu'il est écrasé verticalement. P>

aussi l'interaction de hauteur code> et flex-base code> est tout à fait non intuitif. Pour atteindre la mise en page souhaitée, nous n'avons pas réellement besoin des deux, alors placons flex-base code> de côté. P>

Lorsque vous définissez la hauteur de l'image sans régler sa largeur, l'image va Écheler automatiquement proportionnellement. Étant donné que nos images sont carrées, en définissant la hauteur à 111px, nous réglons implicitement la largeur sur 111px. Et puisque 111 est inférieur à 115 deux images en forme dans la même rangée. Il n'y a rien de magie sur le nombre 111, tout nombre inférieur à 115 fonctionnera. P>

Nous pouvons simplifier le code un peu: p>

.images {
  width: 234px;
  display: flex;
  flex-wrap: wrap; /* allow wrapping, otherwise all 3 images would be in the same row */
  border: 1px solid red;
}

.images > * {
  align-self: flex-start; /* prevent flexbox from stretching items vertically to fill the row */
  box-sizing: border-box; /* include padding into the image width */
  padding: 1px;
}

img.main {
  width: 100%; /* occupy entire row */
}

img.sub1,
img.sub2 {
  width: 50%; /* occupy half of the row */
}


2 commentaires

Merci pour votre réponse! Une question rapide, un didacticiel a déclaré qu'il est préférable d'utiliser flex-base que d'utiliser la largeur pour flex. Est-ce vrai?


@Joji pour les images qui ne sont définitivement pas vraies, Voici ce qui se passe si vous essayez d'utiliser Flex -basis au lieu de la largeur. Mais les images sont un peu spéciales, ainsi que d'autres Éléments remplacés . Pour des éléments de bloc normaux tels que DIVS, j'utiliserais probablement flex-base au lieu de largeur car il respecte la direction flexible, et il peut également être combiné avec flex- rétrécissez et flex-poussser dans une seule propriété CSS, qui semble simplement un peu plus agréable.