Angenommen, Sie haben ein sehr einfaches CSS-Grid-Layout mit einer Spalte, die auf 300px fixiert ist, und einer weiteren, die den Rest des Platzes mit 1fr einnimmt.
.grid {
display: grid;
grid-template-columns: 1fr 300px;
}
Das ist einigermaßen robust. Diese 1fr-Spalte nimmt den gesamten verbleibenden Platz ein, der von der fixierten 300px-Spalte übrig bleibt. Es stimmt, dass der Wert auto dasselbe tun würde, aber auto ist nicht ganz so robust, da seine Größe vom Inhalt abhängt. Wenn Sie also zu wenig Inhalt hätten, würde Ihre Spalte möglicherweise nicht den gesamten gewünschten Platz ausfüllen. Aber obwohl 1fr etwas robuster ist, schützt es Sie nicht vor zu großem Inhalt!
Hier verhält sich das Grid mit etwas Textinhalt einwandfrei

Beobachten Sie nun, wie die rechte Spalte von der Seite gedrängt wird, wenn wir ein riesiges Bild in diese Spalte einfügen

Das lässt sich leicht beheben – und vielleicht passiert es Ihnen nie, weil dieser Ausschnitt in unseren Stylesheets so üblich ist
img {
max-width: 100%;
}

Aber einige Elemente sind nicht so freundlich. Nehmen wir das berüchtigte <pre>-Tag. Nehmen wir an, wir werfen eines davon in unsere 1fr-Spalte mit einer langen Textzeile. Wir sind wieder am Ende

Diesmal sind die Dinge nicht so einfach zu beheben! Selbst der Versuch, die Breite zu begrenzen und den Überlauf von <pre> zu verbergen, hilft nicht
pre {
max-width: 100%;
overflow: hidden;
}
Die eigentliche Lösung ist nicht allzu schwierig – wir müssen nur verstehen, was passiert. Ich kann nicht versprechen, dass ich das 100%ig genau erkläre, aber so wie ich es verstehe, **beträgt die minimale Breite einer Grid-Spalte auto**. (Das Gleiche gilt übrigens auch für Flex-Items.)
Und da auto vollständig vom Inhalt abhängt, können wir sagen, dass es "unbegrenzt" dimensioniert ist und seine Abmessungen flexibel sind. Wenn wir der Spalte eine explizite Breite geben würden, wie z. B. 50% oder 400px, dann würden wir sagen, dass sie "definitiv" dimensioniert ist.
Um unsere Lösung anzuwenden, müssen wir sicherstellen, dass die Spalte eine **definitive** Mindestbreite anstelle von auto hat.
Wir können es also entweder so beheben
.grid {
/* auto minimum width, causing problem */
grid-template-columns: 1fr 300px;
/* fix: minimum width of 0 */
grid-template-columns: minmax(0, 1fr) 300px;
}
Oder wir **geben dem Element, das diese Grid-Spalte belegt, eine tatsächliche min-width.** In unserer einfachen Demo platziert sich das <main>-Element automatisch in der ersten Spalte, da es das erste Kind des Grids ist.
Das ergibt dieses Ergebnis
main {
min-width: 0;
}
Ich denke, es ist etwas robuster, dies auf der Ebene der Grid-Definition zu tun. Jedenfalls funktioniert es! Sehen Sie, wie das <pre>-Tag nun die Breite der Spalte respektiert und wie erwartet überlaufen kann?

Schön.
Danke, dass Sie als Erster die Grenzen ausgetestet haben, damit wir das nicht tun müssen
Ich liebe das und ich liebe CSS Grid, aber was machen wir mit den IE 11-Nutzern? Ich weiß… ich weiß, aber solange Microsoft es noch unterstützt, muss ich es auch unterstützen.
Haben Sie unsere gesamte Serie dazu gesehen?
Die Erklärung hier ist, dass die Mindestgröße einer
fr-Einheitautoist. Grid betrachtet dann diemin-content-Größe des Elements. Wenn das Element eine Größe hat (Sie haben ihm eine Breite gegeben) oder etwas enthält, das eine Größe hat (wie ein Bild), kann diemin-content-Größe viel größer sein als der Anteil des verfügbaren Platzes, den Sie sich von 1fr vorstellen. Es ist leicht zu denken, dass 1fr "ein Teil des Platzes im Grid-Container" ist, wenn es eigentlich ein Teil des übrig gebliebenen Platzes ist.Wenn Platz zum Wachsen vorhanden ist, wachsen die Tracks von dieser
min-content-Größe und weisen Platz zu.Die Verwendung von
minmax, wie Sie darauf hingewiesen haben, ist das Beste, wenn Sie gleich breite Tracks erzwingen möchten, da dies besagt: "Ich möchte, dass dieser Track einemin-content-Größe von 0 hat", Sie könnten in dieser Situation möglicherweise mit Überläufen rechnen, da Sie die Flexibilität verlieren.Danke für die Mühe und das Erarbeiten dieses interessanten Anwendungsfalls…
Großartig! Danke, dass Sie uns die Mühe ersparen ;D
Sie haben die Spalten von "300px 1fr" auf "1fr 300px" vertauscht. Was ist die Bedeutung / der Unterschied davon?
Danke dafür!
Das hat uns geholfen, einen Flexbox-Bug zu beheben, bei dem die Höhe von flex: 1 berechnet werden sollte, stattdessen aber die gesamte Höhe einer verdeckten Scroll-Komponente einnahm.
Das passierte nur in Firefox.