Dave und ich hatten neulich Jen Simmons zu Gast bei ShopTalk. Jen sprach über Intrinsic Web Design und wie eine der Kernideen davon Grids mit Zeilen und Spalten sind, die sich nicht unbedingt gleich schnell ändern, oder die im Grunde unterschiedliche Regeln für ihr Verhalten haben.
Nehmen wir zum Beispiel dieses (erfundene) Grid-Setup
.grid {
display: grid;
grid-template-columns: 1fr minmax(50px, 100px) 20% auto;
}
Jede dieser Spalten wird sich anders verhalten.
Ich versuche gerade erst, das zu verstehen, und verstehe es definitiv noch nicht vollständig. Hier ist, was mir dazu einfällt, nummeriert von 1-4 basierend auf der „Stärke“ (vermute ich?) der Breite.
.grid {
display: grid;
grid-template-columns:
1fr /* #4 - Weakest, will fill remaining space */
minmax(50px, 100px) /* #3 - Will only start changing when other columns force it */
20% /* #1 - Definite size, steady */
auto /* #2 - Indefinite size, entirely based on content, pushy */
;
}
Das unterscheidet sich stark von der Art und Weise, wie wir in der Vergangenheit Grid-Spalten eingerichtet haben. Float-basierte Grids verwenden typischerweise Prozentsätze (eine feste Größe), um Spalten festzulegen. Dasselbe gilt typischerweise für Inline-Block-basierte Grids.
Selbst mit Grid, wenn Sie alle Ihre Spalten mit *nur* Prozentangaben oder *nur* Bruchteilen einrichten, hätten Sie wahrscheinlich ein gleichmäßiges Grid, bei dem der Inhalt die Größe nicht beeinträchtigt. Aber Jen sagt, dass es interessant ist, Grids zu haben, *bei denen der Inhalt eine Rolle bei der Größenbestimmung spielt*. Nehmen Sie es an. Klingt für mich spaßig.
Aber egal, nehmen wir an, Sie richten ein Grid ein, das gemischte Werte für die Spaltenbreiten wie diese verwendet. Tun Sie das nicht mit völlig leeren Spalten, sonst bekommen Sie einen falschen Eindruck davon, wie sich diese Spalten verhalten werden.
Schauen Sie sich nur diese Demo an, in der diese vier Grids exakt das gleiche Setup haben und sich nur die Menge an Text in jeder Spalte unterscheidet.
Siehe den Pen Different Collapse Rates of Different Column Width Values von Chris Coyier (@chriscoyier) auf CodePen.
Cool und seltsam.
Das ist ein sehr ähnliches Problem wie das, das Sie in Ihrem 3-Spalten-Beispiel auf Ihrer (sehr nützlichen) Flexbox-Seite haben (https://css-tricks.de/snippets/css/a-guide-to-flexbox/) :) Wenn Sie mehr Inhalt in die Seitenleiste dieses 3-Spalten-Beispiels einfügen, bricht das Ganze zusammen.
Es ist sehr wichtig, bei der Erstellung von Demos „extravaganten“ Inhalt zu verwenden, da dieser schnell Fehler im Konzept aufzeigt :)
Wow, das ist so nützlich, da viele Tutorials nicht darauf eingehen, was man erwarten kann, wenn man Grid-Zellen unterschiedlich einrichtet. Eine Frage: Warum geht die Zelle, die auf „minmax(50px, 100px)“ gesetzt ist, nie unter 100px?
Warum drängt die Spalte
autoim ersten Grid (deren Text bereits umgebrochen ist) die zweite Spalte nicht auf50px? Wenn sich die Ansichtsfenstergröße verkleinert, verkleinert sich die zweite Spalte schließlich auf50px. Warum erst dann? Was bestimmt, wann dies geschieht? Sollte sie nicht auf50pxverkleinert werden, *bevor* der Text in der vierten Spalte umgebrochen wird?Es gibt definitiv einen Algorithmus dahinter. Ich dachte, es wäre so etwas wie, dass Spalten, die sich gleichzeitig verkleinern, so konzipiert sind, dass sie gleichzeitig ihre Minimalwerte erreichen ... aber das scheint hier nicht ganz der Fall zu sein.
Ich denke, es hat etwas mit intrinsischer/extrinsischer Größenbestimmung zu tun, über die Rachel Andrew kürzlich in Smashing Mag geschrieben hat: https://www.smashingmagazine.com/2018/09/flexbox-sizing-flexible-box/#the-css-intrinsic-and-extrinsic-sizing-specification
Ich glaube, ich habe es herausgefunden. Browser verkleinern die
minmax()-Spalte basierend auf der Breite derauto-Spalte. Der Algorithmus dafür lautet wie folgt:Bestimmen Sie die kleinste Breite der
auto-Spalte (89pxin der Demo).Berechnen Sie die Differenz zwischen
minundmaxin derminmax()-Spalte (100px–50px=50px).Addieren Sie diese beiden Werte:
89px+50px=139px.Wenn sich die
auto-Spalte auf139pxverkleinert, beginnt dieminmax()-Spalte zu schrumpfen. Beide Spalten schrumpfen für50pxim gleichen Tempo, bis sie ihre Minimalwerte erreichen.Das ist wirklich interessant. Ich habe eine Gabelung des Codepen erstellt, um die Spalteneigenschaften anzuzeigen. (Ich fand es auf diese Weise einfacher zu vergleichen/kontrastieren)
Ich würde gerne sehen, dass diese Art von Beispielen immer mindestens ein extra langes Wort enthalten. Ich denke, das sollte eine grundlegende Regel des Webdesigns sein.
In diesem Fall kann es leicht mit einem `overflow-wrap` behoben werden, aber der Unwissende wird immer auf den klassischen Fehler des nicht umbrechenden Wortes hereinfallen (besonders mit dem verfluchten Tabellenrendering).
Beste Grüße
Das ist eine großartige Idee. Das Aufblähen von Grids, weil der Inhalt zu groß ist, ist genauso ein Problem wie wenig Inhalt, der für Merkwürdigkeiten sorgt.
Sie können immer das hier verwenden: Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch. Und ja, das ist wirklich ein echtes Wort (längster Städtename der Welt)
Aus der Spezifikation
https://www.w3.org/TR/css-grid-1/#min-size-auto
„Beachten Sie, dass, obwohl eine inhaltsbasierte Mindestgröße oft angemessen ist und verhindert, dass Inhalte sich überlappen oder außerhalb ihres Containers hinausgehen, dies in einigen Fällen nicht der Fall ist.
Insbesondere, wenn das Grid-Layout für einen Hauptinhaltsbereich eines Dokuments verwendet wird, ist es besser, eine explizite schriftartrelative Mindestbreite festzulegen, z. B. `min-width: 12em`. Eine inhaltsbasierte Mindestbreite könnte dazu führen, dass eine große Tabelle oder ein großes Bild die Größe des gesamten Inhaltsbereichs ausdehnt, möglicherweise in eine Überlaufzone, und dadurch Textzeilen unnötig lang und schwer zu lesen macht.
Beachten Sie auch, dass bei Verwendung einer inhaltsbasierten Größenbestimmung für ein Element mit großen Inhaltsmengen die Layout-Engine all diesen Inhalt durchlaufen muss, bevor sie seine Mindestgröße findet, während dies bei expliziter Festlegung durch den Autor nicht erforderlich ist. (Bei Elementen mit geringen Inhaltsmengen ist dieser Durchlauf jedoch trivial und daher kein Leistungsproblem.)“