Het CSS-raster Auto-plaatsing algoritme begrijpen

In een van onze eerdere introductiehandleidingen voor CSS Grid hebben we gekeken naar vloeiende kolommen en betere dakgoten. We hebben geleerd dat het niet nodig is om precies aan te geven waar we onze rasteritems willen positioneren; als we de eigenschappen van ons raster declareren, plaatst Grid onze items volgens hun algoritme voor automatische plaatsing.

In deze tutorial bekijken we hoe dat algoritme zijn werk doet en hoe we het kunnen beïnvloeden.

Opstelling

Als uw browser niet is ingesteld om Grid te ondersteunen, moet u dat uitzoeken om het te volgen. Lees dit:

  • CSS-rasterlay-out: een snelstartgids

    Hoe we de lay-out op het web benaderen, is aan het veranderen, en in de voorhoede van die verandering is CSS Grid Layout. Deze bijgewerkte snelstartgids slaat de details over ...
    Ian Yates
    CSS-rasterlay-out

Het begon met een raster

Hier is een demo-raster om dingen uit te schakelen; het is een container die we hebben verklaard te zijn weergave: raster; en bevat achttien onderliggende elementen. We hebben aangegeven dat het vijf kolommen moet hebben, elk van gelijke breedte, minstens hetzelfde aantal rijen, en een smalle rugmarge rondom 2px.

 rooster-sjabloon-kolommen: herhaling (5, 1fr); grid-template-rows: repeat (5, 1fr); grid-gap: 2px;

Tot nu toe goed, en je kunt zien dat Grid onze achttien items heeft genomen en ze naar binnen heeft geduwd, vanuit de linkerbovenhoek werkte, naar rechts reed en vervolgens rij voor rij naar beneden ging. Dit gedrag lijkt veel op de manier waarop drijvers werken.

Notitie: het gedrag van links naar rechts zou worden omgekeerd als we te maken hadden met een richting: RTL; lay-out.

Het gooien van een roet in de werken

Dat is allemaal leuk en netjes, maar laten we eens kijken wat er gebeurt als onze items niet zo perfect passen. Naar .post-7 we voegen enkele regels toe om het groter te maken door twee kolommen en twee rijen om te leggen:

.item-7 background: # e03f3f; rasterkolom: span 2; grid-row: span 2; 

Hoe ziet dat er nu uit?

Niet slecht! .post-7 vult meer ruimte op, dus .post-8 en .post-9 zijn verder gepositioneerd. .post-10 kijkt vervolgens of er een lege ruimte naast is .post-9, en wanneer het ziet dat het niet beweegt, beweegt het naar beneden een rij en begint helemaal links. De andere items blijven op dezelfde manier instoppen. 

Maar wacht, wat als we het ook doen .post-9 een beetje overgewicht?

Nu wordt het interessant; .post-9 past niet langer in de kolom aan het einde, dus wordt het naar de volgende rij gedrukt. Omdat het nergens in past .post-7 het blijft zitten. .post-10, je zou je kunnen voorstellen, zou zichzelf erin stoppen .post-6 Nogmaals, maar als je het onthoudt, zoekt het naar een vacante kolom en faalt dan dat het beweegt in een rij en shunts opnieuw naar links. Dit is een belangrijk concept om te begrijpen.

Zeg "Hallo" tegen grid-auto-flow

Als je naar de vorige demo kijkt, zie je dat .post-18, bij het niet vinden van ruimte naast .post-17, is een rij naar beneden gegaan. We hebben eigenlijk maar vijf rijen gedefinieerd, maar Grid heeft aangenomen dat we nog een rij willen overstag gaan. Dit komt door raster-auto-flow, die bij het rasterelement hoort en waarvan de standaardwaarde is rij. We kunnen deze waarde wijzigen in kolom als we willen, wat de manier waarop ons raster eruitziet totaal zou veranderen:

Dit ziet eruit soort van vergelijkbaar, maar je zult zien dat onze items in de linkerbovenhoek zijn gesleufd, vervolgens naar beneden zijn gegaan om elke rij te vullen, vervolgens naar de tweede kolom gaan enzovoort. Dus nu, wanneer een item te groot is voor zijn laarzen, zoekt het volgende item naar de volgende lege rijruimte, dan faalt dat naar de volgende kolom.

Dense Maakt gevoel

We kunnen nog een sleutelwoord aan onze toevoegen raster-auto-flow eigendom, en het is mogelijk mijn favoriete CSS-sleutelwoord tot nu toe: dicht. De standaard tegenhanger is dun (mijn tweede favoriet). Laten we het volgende doen:

grid-auto-flow: rij dicht;

Notitie: we hoeven dit niet te vermelden rij hier is het geïmpliceerd, maar dit laat zien hoe de syntaxis werkt.

Nu onze vriend .post-10, bij het vinden dat er geen ruimte naast is .post-9, controleert eerst wat er is bovenstaande voordat u naar een andere rij gaat. 

Dankzij deze wijziging in het plaatsingsalgoritme zijn onze artikelen nu dicht opeengepakt, wat ons een efficiënter gevuld raster oplevert. Dit betekent echter dat de visuele lay-out niet noodzakelijkerwijs de volgorde van de documentbronnen weerspiegelt, wat niet altijd nuttig is voor de gebruiker.

Conclusie

Laten we samenvatten:

  1. Als we de locatie van een item niet specifiek hebben gedefinieerd, plaatst het automatische plaatsingsalgoritme van Grid het in de volgende beschikbare (en groot genoeg) slot.
  2. Waar er geen beschikbare gokkast in de huidige rij is, zal deze beginnen met het zoeken in de volgende rij, zelfs als dat gaten laat.
  3. We kunnen deze zoekvolgorde wijzigen door te wijzigen raster-auto-flow van rij naar kolom.
  4. raster-auto-flow accepteert een sleutelwoord om de "packing" -benadering te beschrijven. Standaard is deze waarde dun, maar we kunnen dit veranderen dicht die probeert alle beschikbare hiaten op te vullen.

Handige bronnen

  • grid-auto-flow op MDN
  • De specificatie van de grid-auto-flow eigenschap