Um zu verstehen, warum das Festlegen der flex-grow
-Eigenschaft die Elemente nicht gleichmäßig in einem Flex-Container verteilt, müssen wir in die Funktionsweise des Flex-Algorithmus eintauchen und verstehen, wie flex-grow
funktioniert.
- Standardverhalten von display:flex:
Wenn Sie einen Container auf display:flex
setzen, wird er standardmäßig auf flex-direction:row
gesetzt und seine Flex-Elemente haben Breiten basierend auf ihrem Inhalt. In diesem Szenario gilt: je größer der Inhalt eines Elements, desto breiter wird es. Das padding
und flex-grow
wurden aus Ihrem Code entfernt, um dieses Verhalten zu zeigen:
Nach dem Entfernen dieser Deklarationen aus .tabs ul li:{...}
:
flex-grow: 1;
padding: 20px 20px 20px 70px;
![Code nach Entfernen der Padding- und Flex-Grow-Eigenschaften]()
* {
font-size: 16px;
}
.tabs {
max-width: 1010px;
width: 100%;
height: 5rem;
border-bottom: solid 1px grey;
margin: 0 0 0 6.5rem;
display: table;
table-layout: fixed;
}
.tabs ul {
margin: 0;
display: flex;
flex-direction: row;
}
.tabs ul li {
/* flex-grow: 1; */
list-style: none;
text-align: center;
font-size: 1.313rem;
background: blue;
color: white;
height: inherit;
left: auto;
vertical-align: top;
text-align: left;
/* padding: 20px 20px 20px 70px; */
border-top-left-radius: 20px;
border: solid 1px blue;
cursor: pointer;
}
.tabs ul li.active {
background: white;
color: blue;
}
.tabs ul li:before {
content: "";
}
Pizza
Hühnersuppe
Erdnussbutter
Fisch
2. Die Rolle von flex-grow: Durch Anwenden von flex-grow auf ein Flex-Element wird das Element dazu angewiesen, sich auszudehnen, wenn innerhalb des Containers Platz vorhanden ist.
3. Gleichmäßige Verteilung mit flex-grow:1
: Wenn wir allen Elementen flex-grow:1
zuweisen, wie in Ihrem Beispiel, werden sie den verbleibenden Platz proportional gleichmäßig teilen. Es ist jedoch wichtig zu beachten, dass sie anfangs nicht gleicher Breite sind. Der zusätzliche Platz wird zur ursprünglichen Breite jedes Elements hinzugefügt (die Inhaltsbreite).
So sieht es aus, wenn wir flex-grow:1
wieder einfügen:
Beachten Sie, dass der rechte Platz nach jedem Flex-Element gleich ist, aber die Breite der Elemente nicht gleich ist aufgrund unterschiedlicher Inhaltsgrößen ![Nach Hinzufügen von flex-grow:1; wieder]()
4. Lösung des Problems mit ungleicher Breite: Um eine wirklich gleichmäßige Verteilung zu erreichen, können Sie die width
der Elemente auf 0 setzen, so dass der verfügbare Platz durch flex-grow genutzt werden kann, und hier ist, wie es aussieht: ![Bildbeschreibung hier eingeben]()
Beachten Sie, dass das blaue Rechteck die Grenze aller Elemente darstellt
Jetzt haben wir allen verfügbaren Platz für die Verteilung durch flex-grow
, und wir können sie gleichmäßig unter den Flex-Elementen aufteilen.
Alternativ können Sie die flex-basis-Eigenschaft verwenden, um eine gleichmäßige Verteilung sicherzustellen. Das Festlegen von flex-basis:0 führt zu einem ähnlichen Ergebnis. Eine andere Möglichkeit ist die Verwendung der Kurzschreibweise flex, bei der flex:1
gleichbedeutend mit flex-grow:1
, flex-shrink:1
und flex-basis:0
ist.
und beide Optionen erzielen dasselbe Ergebnis:
![width:0 oder flex:1]()
und hier ist das Ergebnis, nachdem wir das padding
wieder hinzugefügt haben: ![Nach erneutem Hinzufügen des Paddings]()
Es ist erwähnenswert, dass der Flex-Algorithmus eine Möglichkeit hat, die anfängliche Breite (im Fall von flex-direction:row
) und Höhe (im Fall von flex-direction:column
) mithilfe von flex-basis
zu bestimmen, die die Breiten- oder Höheneigenschaft überschreiben kann, falls sie existiert. Um potenzielle Fehler zu vermeiden, wird empfohlen, sie oder die Kurzschreibweise flex-Eigenschaft zu verwenden, um ein konsistentes und vorhersehbares Verhalten sicherzustellen.
Zusammenfassend können Sie zur gleichmäßigen Verteilung des Platzes unter den Flex-Elementen flex-basis:0
oder flex:1
mit Standardwerten verwenden, wobei Sie die Nuancen des Flex-Algorithmus im Auge behalten müssen. Mit diesem Ansatz werden die Elemente in einem Flex-Container gleichmäßig und konsistent aufgeteilt, unabhängig von ihren anfänglichen inhaltsbasierten Breiten.