1
votes

L'élément Flex ne rétrécira pas avec le débordement - il reste toujours aussi élevé que le contenu

Je veux que l'un des enfants de display: flex; ajuste la hauteur aux autres. Si le contenu de cet enfant est plus grand que celui des autres enfants, alors overflow: scroll; doit être appliqué à ce contenu.

En d'autres termes: J'attends que le div du milieu (fond jaune) du code suivant ajuste sa hauteur aux autres div avec un débordement de .tabl .

Je sais que la question est comme beaucoup d'autres . J'ai déjà lu de nombreux fils et je n'ai toujours pas réussi à résoudre le problème. Je m'excuse pour ce message, mais je n'ai pas la force de le résoudre.

<div class="parent">
  <div class="child1">
    <p>Some element one</p>
    <p>Some element two</p>
    <p>Some element three</p>
    <p>Some element four</p>
  </div>
  
  <div class="child2">
    <div class="info">
      <h2>Element</h2>
    </div>
    <div class="tabl">
      <p>Some element one</p>
      <p>Some element two</p>
      <p>Some element three</p>
      <p>Some element four</p>
      <p>Some element one</p>
      <p>Some element two</p>
      <p>Some element three</p>
      <p>Some element four</p>
      <p>Some element one</p>
      <p>Some element two</p>
      <p>Some element three</p>
      <p>Some element four</p>
      <p>Some element one</p>
      <p>Some element two</p>
      <p>Some element three</p>
      <p>Some element four</p>
    </div>
    <div class="footer">
      <button class="btn">Some button</button>
    </div>
  </div>
  
  <div class="child3">
      <p>Some element one</p>
      <p>Some element two</p>
      <p>Some element three</p>
      <p>Some element four</p>
      <p>Some element one</p>
      <p>Some element two</p>
      <p>Some element three</p>
      <p>Some element four</p>
  </div>
</div>
.parent {
  display: flex;
  flex-direction: row;
  flex-wrap: nowrap;
  align-items: baseline;
}

.child1 {
  background-color: red;
  align-self: stretch;
  width: 25%;
  min-width: 25%;
  max-width: 25%;
}

.child2 {
  background-color: yellow;
  min-height: 0;
  min-width: 0;
  overflow: auto;
  margin: 0 15px;
  width: calc(50% - 30px);
  max-width: calc(50% - 30px);
  display: flex;
  flex-direction: column;
  flex-shrink: 1;
}

.child3 {
  background-color: green;
  width: 25%;
  min-width: 25%;
  max-width: 25%;
}

.child2 .tabl {
  flex-shrink: 1;
  min-height: 0;
  overflow: scroll;
}


1 commentaires

cela vous aidera probablement: stackoverflow.com/q/48943233/8620333


4 Réponses :


0
votes

Le débordement dans ce contexte ne signifie rien sans définir une hauteur après laquelle le contenu doit déborder . Le problème ( ou avantage, dans la plupart des cas ) avec flex est que les boîtes vont grossir pour correspondre au contenu "plus gros", ou plutôt flex (d'où le nom). Vous aurez probablement besoin de Javascript pour cela, ou vous devrez définir une hauteur maximale sur les enfants.

Voici un exemple de votre code avec un hauteur-max appliqué aux enfants;

<div class="parent">
  <div class="child1">
    <p>Some element one</p>
    <p>Some element two</p>
    <p>Some element three</p>
    <p>Some element four</p>
  </div>
  
  <div class="child2">
    <div class="info">
      <h2>Element</h2>
    </div>
    <div class="tabl">
      <p>Some element one</p>
      <p>Some element two</p>
      <p>Some element three</p>
      <p>Some element four</p>
      <p>Some element one</p>
      <p>Some element two</p>
      <p>Some element three</p>
      <p>Some element four</p>
      <p>Some element one</p>
      <p>Some element two</p>
      <p>Some element three</p>
      <p>Some element four</p>
      <p>Some element one</p>
      <p>Some element two</p>
      <p>Some element three</p>
      <p>Some element four</p>
    </div>
    <div class="footer">
      <button class="btn">Some button</button>
    </div>
  </div>
  
  <div class="child3">
      <p>Some element one</p>
      <p>Some element two</p>
      <p>Some element three</p>
      <p>Some element four</p>
      <p>Some element one</p>
      <p>Some element two</p>
      <p>Some element three</p>
      <p>Some element four</p>
  </div>
</div>
.parent {
  display: flex;
  flex-direction: row;
  flex-wrap: nowrap;
  align-items: baseline;
}

.child1 {
  background-color: red;
  align-self: stretch;
  width: 25%;
  min-width: 25%;
  max-width: 25%;
}

.child2 {
  background-color: yellow;
  min-height: 0;
  min-width: 0;
  overflow: auto;
  margin: 0 15px;
  width: calc(50% - 30px);
  max-width: calc(50% - 30px);
  display: flex;
  flex-direction: column;
  flex-shrink: 1;
}

.child3 {
  background-color: green;
  width: 25%;
  min-width: 25%;
  max-width: 25%;
}

.child2 .tabl {
  flex-shrink: 1;
  min-height: 0;
  overflow: scroll;
}

.child1, .child2, .child3{
  max-height: 250px;
  overflow: auto;
}


1 commentaires

La vue doit être ... flexible. :) Je ne peux pas définir la hauteur maximale à aucun endroit. Parfois, les éléments de gauche ou de droite peuvent être plus hauts que ceux du milieu.



0
votes

Si vous connaissez à l'avance la hauteur souhaitée de vos enfants flexibles, l'utilisation de la propriété max-height est la solution la plus propre fournie nativement par Flexbox, comme @ Lewis l'a suggéré.

Si vous avez besoin de plus contrôle précis, pensez à utiliser le module de mise en page CSS Grid. Si vous remplacez votre code existant par l'extrait ci-dessous et que vous l'appliquez à votre balisage, vous pouvez voir une reproduction minimaliste de la mise en page que vous essayez d'obtenir.

.parent {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: repeat(4, 100px);
}

.parent > * {
  border: 2px solid black; // added for clarity
  grid-row-start: 1;
  grid-row-end: 4;
}

.child2 {
  overflow-y: scroll;
}


0 commentaires

0
votes

Vous définissez votre .parent et la hauteur de par exemple max-height: 150px;


0 commentaires

1
votes

Je veux l'un des enfants de l'affichage: flex; pour ajuster la hauteur aux autres.

Supposons que vous souhaitiez que la section verte ( enfant3 ) ait la plus grande hauteur:

  • assurez-vous que vous avez align-items: stretch (c'est la valeur par défaut, alors ne le remplacez pas) - cela garantit que chaque ligne flex child s'étend au maximum hauteur flex enfant.
  • envelopper le contenu des autres sections ( child1 et child2 ) dans un élément positionné de manière absolue .
  • faites de cet élément wrapper une boîte flexible de colonne pour obtenir le débordement directement dans la section jaune .

Voir la démo ci-dessous:

<div class="parent">
  <div class="child1">
    <p>Some element one</p>
    <p>Some element two</p>
    <p>Some element three</p>
    <p>Some element four</p>
    <p>Some element two</p>
    <p>Some element three</p>
    <p>Some element four</p>
  </div>

  <div class="child2">
    <div class="child-wrap">
      <div class="info">
        <h2>Element</h2>
      </div>
      <div class="tabl">
        <p>Some element one</p>
        <p>Some element two</p>
        <p>Some element three</p>
        <p>Some element four</p>
        <p>Some element one</p>
        <p>Some element two</p>
        <p>Some element three</p>
        <p>Some element four</p>
        <p>Some element one</p>
        <p>Some element two</p>
        <p>Some element three</p>
        <p>Some element four</p>
        <p>Some element one</p>
        <p>Some element two</p>
        <p>Some element three</p>
        <p>Some element four</p>
      </div>
      <div class="footer">
        <button class="btn">Some button</button>
      </div>
    </div>
  </div>

  <div class="child3">
    <p>Some element one</p>
    <p>Some element two</p>
    <p>Some element three</p>

  </div>
</div>
.parent {
  display: flex;
  flex-direction: row;
  flex-wrap: nowrap;
  /*align-items: baseline;*/
}

.child1 {
  background-color: red;
  align-self: stretch;
  width: 25%;
  min-width: 25%;
  max-width: 25%;
}

.child2 {
  background-color: yellow;
  min-height: 0;
  min-width: 0;
  overflow: auto;
  margin: 0 15px;
  width: calc(50% - 30px);
  max-width: calc(50% - 30px);
  display: flex;
  flex-direction: column;
  flex-shrink: 1;
}

.child3 {
  background-color: green;
  width: 25%;
  min-width: 25%;
  max-width: 25%;
}

.child2 .tabl {
  flex-shrink: 1;
  min-height: 0;
  overflow: auto; /* changed to auto */
}

.child1, .child2, .child3 { /* ADDED */
  position: relative;
}

.child-wrap { /* ADDED */
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  display: flex;
  flex-direction: column;
}

Supposons que vous souhaitiez que l'une des sections gauche ou droite ait la hauteur maximale - dans ce cas, utilisez le positionnement absolu ci-dessus uniquement pour l ' élément jaune du milieu - voir la démo ci-dessous où le plus élevé des éléments gauche ou droit définit la hauteur de l'ensemble parent wrapper :

<div class="parent">
  <div class="child1">
  <div class="child-wrap">
    <p>Some element one</p>
    <p>Some element two</p>
    <p>Some element three</p>
    <p>Some element four</p></div>
  </div>
  
  <div class="child2">
  <div class="child-wrap">
    <div class="info">
      <h2>Element</h2>
    </div>
    <div class="tabl">
      <p>Some element one</p>
      <p>Some element two</p>
      <p>Some element three</p>
      <p>Some element four</p>
      <p>Some element one</p>
      <p>Some element two</p>
      <p>Some element three</p>
      <p>Some element four</p>
      <p>Some element one</p>
      <p>Some element two</p>
      <p>Some element three</p>
      <p>Some element four</p>
      <p>Some element one</p>
      <p>Some element two</p>
      <p>Some element three</p>
      <p>Some element four</p>
    </div>
    <div class="footer">
      <button class="btn">Some button</button>
    </div>
    </div>
  </div>
  
  <div class="child3">
      <p>Some element one</p>
      <p>Some element two</p>
      <p>Some element three</p>
      <p>Some element four</p>
      <p>Some element one</p>
      <p>Some element two</p>
      <p>Some element three</p>
      <p>Some element four</p>
  </div>
</div>
.parent {
  display: flex;
  flex-direction: row;
  flex-wrap: nowrap;
  /*align-items: baseline;*/
}

.child1 {
  background-color: red;
  align-self: stretch;
  width: 25%;
  min-width: 25%;
  max-width: 25%;
}

.child2 {
  background-color: yellow;
  min-height: 0;
  min-width: 0;
  overflow: auto;
  margin: 0 15px;
  width: calc(50% - 30px);
  max-width: calc(50% - 30px);
  display: flex;
  flex-direction: column;
  flex-shrink: 1;
}

.child3 {
  background-color: green;
  width: 25%;
  min-width: 25%;
  max-width: 25%;
}

.child2 .tabl {
  flex-shrink: 1;
  min-height: 0;
  overflow: auto; /* changed to auto */
}

.child1, .child2, .child3 { /* ADDED */
  position: relative;
}

.child-wrap { /* ADDED */
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  display: flex;
  flex-direction: column;
}

3 commentaires

Malheureusement, le dernier div (vert) ne sera pas le plus élevé (ce ne sera pas forcément le plus élevé). Parfois, le premier div (rouge) peut être le plus élevé - alors la hauteur moyenne (jaune) doit également être ajustée à la plus haute.


alors utilisez le positionnement absolu uniquement pour l ' élément du milieu jaune - je suppose que cela fonctionnera dans ce cas ... essayez-le - voir la réponse mise à jour ...


Ok, c'est une très bonne idée :) J'espérais n'utiliser que flexbox à cet effet, mais cette solution fonctionne parfaitement.