<<Grid>>

    Grid-Layout

    CSS Grid Layout, vanligtvis kallad bara "Grid," är ett tvådimensionellt layoutsystem för webben som gör det möjligt att skapa komplexa och responsiva webbdesigns på ett enkelt och rent sätt. Med Grid kan du definiera kolumner och rader i dina layouter, placera element var du vill inom dessa rader och kolumner och skapa responsiva webbsidor utan att vara beroende av externa ramverk.

    Jag började skriva en tutorial om grid för några år sedan som ni kan titta på här. Den är inte riktigt färdig, men läs igenom den snabbt och titta på animationen på slutet, den ger en bra indikation på hur gridlinjerna fungerar.

    Grundläggande Användning av CSS Grid

    För att använda CSS Grid behöver du definiera en container och göra den till en grid container. Därefter kan du styra layouten av de element (kallade grid items) som är barn till denna container.

    HTML-kod
    <div class="container">
      <div class="item item1">1</div>
      <div class="item item2">2</div>
      <div class="item item3">3</div>
      <div class="item item4">4</div>
    </div>
    					

    Definiera en Grid Container

    För att definiera en container som en grid container, använder du egenskapen `display` med värdet `grid` eller `inline-grid`.

    CSS-kod
    .container {
      display: grid;
      grid-gap: 10px;
      background-color: rgba(171,174,205,0.70);
    }
    
    .item {
      background-color: #6A7341;
      text-align: center;
      padding: 20px;
      border-radius: 1rem;
    }
    					
    1
    2
    3
    4

    Definiera Rader och Kolumner

    Du kan bestämma storleken på dina rader och kolumner med `grid-template-rows` och `grid-template-columns`.

    CSS-kod
    .container {
      display: grid;
      grid-template-columns: 150px 120px 120px; /* tre kolumner */
      grid-template-rows: 60px 120px; /* två rader */
    }
    					
    1
    2
    3
    4

    Placera Grid Items

    Du kan påverka var dina grid items ska placeras med hjälp av `grid-column` och `grid-row`.

    CSS-kod
    .item1 {
      grid-column: 1 / 3; /* Tar upp första och andra kolumnen */
      grid-row: 1; /* Första raden */
    }
    
    .item2 {
      grid-column: 3; /* Tredje kolumnen */
      grid-row: 1 / 3; /* Tar upp första och andra raden */
    }
    					
    1
    2
    3
    4

    Flexibelt grid

    Enheten fraction, fr, använd som en flexibel enhet som försöker fördela det befintliga utrymmet mellan de items som finns i containern. Den försöker att ta upp det maximala utrymmet som den kan ta och detta fördelas utifrån det nummer som man anger framför enheten. Så om t.ex. anger två kolumner en med 1fr och den andra med 2fr så kommer hela det horisontella utrymmet att fyllas med dessa kolumner. Den kolumnen som har 2fr kommer att vara ungefär dubbelt så stor som kolumnen med 1fr. Denna inbördes storlek växer och minskar om fönstret ändrar storlek, men förhållandet mellan dem kommer att förbli detsamma.

    Ta en titt på denna korta filmsnutt som förklarar hur enheten fr fungerar.

    Med kommandot repeat så kan man skapa flera lika stora kolumner eller rader på ett snabbt sätt.

    CSS-kod
    .container {
      display: grid;
      grid-template-columns: repeat(3, 1fr); 
      grid-template-rows: auto;
    }
    					
    1
    2
    3
    4

    I exemplet ovan har vi skapat en grid container med tre flexibla kolumner (varje kolumn tar lika mycket plats). Vi har också använt `gap` för att skapa lite avstånd mellan varje grid item. Varje item har en enkel styling för att göra exempelt mer visuellt.

    Flytta items

    Ditt innehåll kan placeras på valfri plats i ditt grid. Man behöver inte visa innehållet i den ordning som de skrivs i HTML. Detta gör att grid är väldigt användbart i en flexibel design då man kan välja att helt flytta om materialet till exempel beroende på vilken skärmbredd man använder.

    Här gör jag bara ett enkelt exempel då item3 får ta upp en tredje rad helt av sig själv.

    CSS-kod
    .item3{
      grid-column: 1 / -1;
      grid-row: 3;
    }
    					
    1
    2
    3
    4

    Notera att item4 som är oformaterat endast tar upp en position i vårt grid och den tar också item3's plats eftersom det är den närmaste platsen den kan placera sig i.

    Gör följande uppgifter:

  1. Enkel Grid-layout

    Skapa en enkel rutnätslayout med tre kolumner av lika bredd och två rader. Varje rutnätselement(item) ska innehålla en färgad bakgrund och lite text. Använd denna övning för att öva på att sätta upp ett grundläggande rutnät med grid-template-columns, grid-template-rows och grid-gap. Förklara kort hur du har definierat din container och dina items.

  2. Responsivt Fotogalleri

    Bygg ett responsivt fotogalleri som visar bilder i en tre-kolumnslayout på en bred skärm och byter till en en-kolumnslayout på mobila enheter(smalare skärm). Använd dig av minst 7st items för att se hur dessa placeras. För att underlätta så väljer du bilder i samma storlek. Men du kan också experimentera med hur du kan anpassa ditt grid så att breda bilder tar upp två kollumner och höga bilder tar upp två rader genom att ge dessa bilder separata klasser och använda dig av t.ex. grid-column: auto / span 2; för de bilder som ska vara extra breda (se det nedre exemplet på den här sidan).

    Denna övning är tänkt att hjälpa dig att experimentera med och förstå CSS-rutnätets kraft för responsiv design och kanske även öva på att använda mediaquerys. Förklara kort vad du ändrar i din mediaquery för att byta layout.

  3. Nu är en bra tid att titta på hur de i kapitel 15 Layout (sid 359+) anväder sig av grid. Notera speciellt sidorna 381- 404. Det är en designfilosofi som kan vara bra att ha i åtanke när man designar webbsidor.

    Grid-area

    grid-area är en kraftfull CSS-egenskap som gör det möjligt att namnge och positionera element inom en CSS Grid på ett mer lättöverskådligt sätt. Med grid-area kan du antingen specificera var ett element ska placeras inom vårt grid eller deklarera ett namngivet område som kan användas i grid-template-areas.

    Den första användningen av grid-area är som ett kortare sätt att definiera upp utrymmet som ett item ska ta upp i din container. Man kan då direkt ange ett elements position och storlek inom rutnätet med en kortnotation för grid-row-start, grid-column-start, grid-row-end, och grid-column-end.

    CSS-kod
    --nollställer först alla items till grundformatering--
    
    .container{
      display: grid;
      grid-gap: 10px;	
      grid-template-columns: repeat(3, 1fr); /* Skapar tre kolumner */
      grid-template-rows: 100px 80px 50px;/* Skapar tre rader */
    }
    
    .item2 {
      grid-area: 1 / 1 / 3 / 3; 
      /* Startrad / Startkolumn / Slutrad / Slutkolumn */
    }
    					
    1
    2
    3
    4

    Först så tar vi bort all formatering på våra items sedan tidigare för att visa det här exemplet. Sedan skapas ett nytt grid som består av 9 rutor (3 kolumner och 3 rader). Därefter så defineras ett område för .item2 som gör att det tar upp både 2 kolumner och 2 rader med början på den första linjen.

    Namngivna områden

    Vi kan skapa en layout genom att namnge områden för att tydligt visa vilken typ av innehåll vi förväntar oss att ett område ska ha. Genom att kombinera namngivna områden med egenskapen grid-template-areas på vårt grid-container, kan vi enkelt skapa komplexa layouter. Varje värde inom grid-template-areas representerar en cell i vårt rutnät och motsvarar namnet på det område vi definierat för våra element.

    CSS-kod
    .container {
      display: grid;
      grid-template-areas: 
        "header header header"
        "sidebar content content"
        "footer footer footer";
    }
    
    .header {
      grid-area: header;
    }
    
    .sidebar {
      grid-area: sidebar;
    }
    
    .content {
      grid-area: content;
    }
    
    .footer {
      grid-area: footer;
    }
    					
    header
    content

    Här fördelar vi upp våra grid-items (observera namnbytet för att lättare identifiera områdena i CSS-filen) och sedan tilldelas de ett specifikt område. Namnen på klasserna och områdena kan vara samma om så önskas.

    HTML-kod
    <div id="seven" class="des-container">
      <div class="item header">header</div>
      <div class="item sidebar">sidebar</div>
      <div class="item content">
        <div class="item in-cont">content1</div>
        <div class="item in-cont">content2</div>
        <div class="item in-cont">content3</div>
      </div>
      <div class="item footer">footer</div>
    </div>		
    
    .in-content{
      background-color: darkslategray;
      margin: 0.5rem;
    }
    					
    header
    content1
    content2
    content3

    Området för vårt innehåll kan nu fyllas med allt vi vill ska synas där, och detta gäller ju alla andra områden också.

    När man designar en responsiv sida och använder sig av namngivna grid-areas så är det ofta enkelt att bara rita om sitt grid area med hur man vill att layouten ska se ut vid en viss skärmbredd. Titta på det här exemplet och notera hur de gjort inuti @media-selektorerna.

    Gör en sida enligt följande instruktioner:

  4. Design med grid-area

    Gör en sidlayout som inkluderar ett rubrik-, fot-, sidofält- och huvudinnehålls-område. Tilldela varje sektion ett specifikt område på rutnätet med hjälp av egenskapen grid-area. Experimentera med olika grid-template-areas-värden för att se hur de påverkar layouten. Fyll sidan med något innehåll och visa hur man kan formatera upp innehållet på en sida genom att använda sig av grid-template-areas. Denna övning befäster konceptet med rutnätsområden och visar hur de kan förenkla din layoutdesign.

  5. Läs mer om hur grid fungerar på exempelvis css-tricks som ger en bra överblick över hur grid fungerar generellt. Vill du ha mer tips på hur man kan använda grid på olika sätt så finns till exempel Grid by example som har en massa tips på olika layouter med grid. Är du mer intresserad av hur definitionen av grid ser ut så är mdn web docs en bra sida.

    Titta igenom

    Förståelsen av CSS Grid låter dig skapa invecklade layouter med mindre kod och mer flexibilitet. CSS Grid är också utformad för att fungera tillsammans med andra layouttekniker som Flexbox, vilket ger dig ett kraftfullt verktyg för att skapa responsiva webbsidor.

Tillbaka till startsidan.
© Andreas Bergsten
Malgomajskolan 2023-24