CSS: raspored pomoću flexbox-a i grid-a

Lekcija 7 od 17 · HTML, CSS i JavaScript

Meni u jednom redu, kartice jedna pored druge, zaglavlje–sadržaj–podnožje: za raspoređivanje elemenata danas se koriste dva alata. Flexbox ređa elemente u jednom pravcu (red ili kolona), a grid u mreži redova i kolona.

Pre nego što počneš: potrebno predznanje – box model.
Kako da učiš: zadatke na kraju prvo uradi sam/a u svom editoru; uputstvo i rešenje otvori tek posle toga. Svaki primer ima kod i živi rezultat ispod njega; kod prekucaj u svoj fajl i menjaj ga.

Flexbox: elementi u redu

Roditelj dobija display: flex, a njegova deca postaju „fleks elementi“ poređani u red:

<style>
  .meni {
    display: flex;
    gap: 10px;                       /* razmak između elemenata */
    justify-content: space-between;  /* raspored po glavnoj osi (horizontalno) */
    align-items: center;             /* poravnanje po poprečnoj osi (vertikalno) */
    background: #1f5f91;
    padding: 10px;
  }
  .meni a { color: white; text-decoration: none; padding: 6px 10px; }
  .logo { font-weight: bold; font-size: 1.4rem; color: #ffd166 !important; }
</style>
<nav class="meni">
  <a class="logo" href="#">LOGO</a>
  <div>
    <a href="#">Početna</a>
    <a href="#">Projekti</a>
    <a href="#">Kontakt</a>
  </div>
</nav>

Rezultat:

Svojstvo (roditelj)Vrednosti
flex-directionrow (red, osnovno), column (kolona)
justify-contentflex-start, center, flex-end, space-between, space-around – po glavnoj osi
align-itemsstretch, center, flex-start, flex-end – po poprečnoj osi
flex-wrap: wrapelementi prelaze u novi red kada nema mesta
gaprazmak između elemenata
Svojstvo (dete)Značenje
flex: 1element zauzima preostali prostor; dva elementa sa flex: 1 i flex: 2 dele prostor 1 : 2
flex: 0 0 200pxfiksna širina 200px – ne raste i ne smanjuje se
Klasični problem rešen u 3 reda – centriranje u sredinu: display: flex; justify-content: center; align-items: center; na roditelju koji ima visinu.

Flexbox: kartice koje prelaze u novi red

<style>
  .kartice { display: flex; flex-wrap: wrap; gap: 12px; }
  .kartica {
    flex: 1 1 140px;          /* raste, smanjuje se, početna širina 140px */
    background: #eef6fc;
    border-radius: 10px;
    padding: 12px;
  }
</style>
<div class="kartice">
  <div class="kartica">HTML</div>
  <div class="kartica">CSS</div>
  <div class="kartica">JavaScript</div>
  <div class="kartica">Python</div>
  <div class="kartica">C++</div>
</div>

Rezultat:

Smanji prozor pregledača: kartice same prelaze u novi red kada ne staju. Tako se bez ijednog dodatnog pravila dobija raspored koji radi i na telefonu.

Grid: mreža redova i kolona

<style>
  .galerija {
    display: grid;
    grid-template-columns: repeat(3, 1fr);   /* 3 jednake kolone */
    gap: 8px;
  }
  .galerija div { background: #2b7bb9; color: white; padding: 20px; text-align: center; border-radius: 6px; }
  .siroka { grid-column: span 2; background: #1f5f91 !important; }   /* zauzima 2 kolone */
</style>
<div class="galerija">
  <div>1</div><div>2</div><div>3</div>
  <div class="siroka">4 (dve kolone)</div><div>5</div>
  <div>6</div><div>7</div><div>8</div>
</div>

Rezultat:

SvojstvoPrimer
grid-template-columns200px 1fr – prva kolona 200px, druga ostatak; repeat(4, 1fr) – 4 jednake
frdeo slobodnog prostora (fraction)
repeat(auto-fill, minmax(150px, 1fr))onoliko kolona od bar 150px koliko stane – automatski prilagodljiva galerija
grid-column: span 2element zauzima dve kolone
grid-template-areasraspored zadat imenima oblasti (primer ispod)

Grid: raspored cele stranice

<style>
  .stranica {
    display: grid;
    grid-template-columns: 1fr 3fr;
    grid-template-areas:
      "zaglavlje zaglavlje"
      "meni      sadrzaj"
      "podnozje  podnozje";
    gap: 6px;
    min-height: 220px;
  }
  header { grid-area: zaglavlje; background: #1f5f91; color: white; }
  nav    { grid-area: meni;      background: #cfe3f3; }
  main   { grid-area: sadrzaj;   background: #eef6fc; }
  footer { grid-area: podnozje;  background: #ddd; }
  header, nav, main, footer { padding: 10px; }
</style>
<div class="stranica">
  <header>Zaglavlje</header>
  <nav>Meni</nav>
  <main>Glavni sadržaj</main>
  <footer>Podnožje</footer>
</div>

Rezultat:

Oblasti se „crtaju“ tekstom u grid-template-areas, a svaki element dobija svoje mesto preko grid-area. Promena rasporeda (npr. za telefon) svodi se na drugačiji crtež.

Flexbox ili grid?

SituacijaAlat
meni, red dugmadi, centriranje jednog elementaflexbox
kartice nepoznatog broja koje prelaze u novi redflexbox (wrap) ili grid (auto-fill)
galerija sa jednakim kolonamagrid
raspored cele stranice (zaglavlje, meni, sadržaj, podnožje)grid

Često se kombinuju: grid za celu stranicu, flexbox unutar zaglavlja. Za vežbu postoje igre Flexbox Froggy (ima i srpski jezik) i Grid Garden.

Zadaci za vežbu

Za svaki zadatak postoji primer, uputstvo i rešenje. Rešenja su provereno ispravna u pregledaču.

ZADATAK 01Težina: srednje

Prilagodljiva galerija

Napravi galeriju od 8 slika koja na širokom ekranu ima 4 kolone, a na užim sama smanjuje broj kolona (najmanja širina slike 160px). Slike su iste visine (150px) i ne razvlače se.

Česte greške i saveti
  • display: flex ili grid se piše na roditelju, a ne na elementima koje raspoređuješ.
  • U flexbox-u justify-content radi po glavnoj osi – kod flex-direction: column to je vertikala.
  • Za razmake između elemenata koristi gap umesto margine na svakom elementu.
  • Firefox i Chrome u F12 imaju alat koji crta mrežu grid-a i ose flexbox-a – klikni oznaku „grid“/„flex“ u Elements.

Proveri znanje

Otvori kviz

Flexbox i grid

1. Kojim svojstvom elementi u flexbox-u prelaze u novi red?




2. Kako centrirati element horizontalno i vertikalno u flex roditelju?




3. Šta znači grid-template-columns: 1fr 2fr?




4. Šta je bolje za raspored cele stranice sa zaglavljem, menijem i sadržajem?