Ako horizontálne vycentrovať obsah – DIV na stred v CSS?

Veľmi často vidím na fórach stále tú istú otázku ohľadom CSS a centrovania a to: "Ako mám vycentrovať DIV?". Tento článoček je o tom ako to docieliť, primárne sú 2 spôsoby ako to spraviť.

Uvedieme si dva spôsoby ako centrovať obsah ktoré sa od seba dosť líšia. V praxi ale nieje úplne ideálne riešenie ktoré by všade fungovalo bez problémov. Hlavne kvôli IE6 (najlepšiemu prehliadaču na svete) je potreba byť opatrnejší pretože ohľadom centrovania je IE6 častokrát ťažko zlúčiteľné.

Spôsob horizontálneho centrovania pomocou position: absolute

Jeden zo spôsobov horizontálneho vycentrovania obsahu je , že celý obsah je obalený DIVom ktorý má určenú pevnú šírku v pixeloch. Obalovací DIV je pritom najvrchnejší obalovací element. Pre jeho vycentrovanie zadefinujeme takéto CSS:

#container {
<strong>  width: 500px;</strong>
  background: red;<strong>
  position: absolute;
  left: 50%;
  margin-left: -250px;</strong>
}

Centrovanie obsahu je možné iba ak má obsah pevne danú šírku obaľovacieho DIVu. Cez position: absolute určíme, že umiestnenie z ľava 50% čo spôsobí, že DIV s červeným pozadím a šírkou 500px bude umiestnený v strede obrazovky. Do stredu ho dostaneme tak, že nastavíme ľavé odsadenie o hodnotu -250px čo náš DIV umiestni presne do stredu. Toto riešenie je síce ľahké a rýchle ale ja osobne ho nepoužívam a snažím sa centrovať pomocou margin: auto.

Spôsob horizontálneho centrovania pomocou margin: auto

Centrovanie obsahu pomocou margin: auto je ten vhodnejší spôsob centrovania ktorého by som sa držal i keď si to vyžaduje možno viac písania a optimalizovania. Tu budeme ale okrem jedného obaľovacieho DIVu používať dva obaľovacie DIVy. Prečo? Preto, že niektoré prehliadače pri centrovaní obsahu pomocou margin: auto sa nerozoztiahnu po celej výške - neobtečú a neroztiahnu DIV a teda ak má tento DIV farebné pozadie prípadne ako pozadie obrázok tak ho nemáme po celej výške.

Znie to divne? Možno ale my s tým nič nespravíme a ak budeme chcieť aby to bolo rovnaké vo všetkých browsroch tak sa s tým budeme musieť zmieriť. Urobíme tzv. matriošku čo sú naše dva obaľovacie DIVy.

Jeden bude centrovať pomocou margin: auto a text-align: center na stred a druhý ktorý je vnorený dovnútra bude obsahovať float a prípadné pozadie. CSSsko by mohlo vyzerat nejak takto:

body {
  text-align: center;
}

#obsah-vonku {
  display: block;
  <strong>width: 500px;
  margin: 0 auto;</strong>
}

#obsah-dnu {
  <strong>float: left;</strong>
  width: 100%;
  margin: 0;
  background: red;
  text-align: left;
}

Prečo používame na centrovanie dva DIVy?

Ako som písal vyššie robíme to kvôli riešeniu problému zobrazovania farebného pozadia. Problém je v tom, že ak centrujeme div pomocou margin: auto tak nemusí obsah obtekať. To sa dá ľahko vyriešiť pomocou float: left ale použiť naraz float a margin: auto nejde pretože float by náš obsah zarovnal k nejakému rohu a to predsa nechceme lebo centrujeme na stred.

Proste a jednoducho... dva DIVy. Jeden má definované margin: 0 auto; (ide hlavne o margin left a right aby bol auto) s danou šírkou. Toto nám to dá na stred. Druhý div má float: left aby prípadné pozadie sa roztiahlo podľa obsahu na celú výšku. Celá veda :-)



Podobné články

Pridať komentár

12 Komentárov

  1. zobak hovorí:

    Skvělý. díky za vysvětlení.

  2. Benny hovorí:

    Dobře napsaný článek, i když tuto problematiku znám, nebaví mě to pořád dokola psát na foru, takže budu odkazovat. Jinak překlep
    widthn: 500px;

  3. tiso hovorí:

    "niektoré prehliadače pri centrovaní obsahu pomocou margin: auto sa nerozoztiahnu po celej výške..."

    Ktoré konkrétne prehliadače máš na mysli? Alebo myslíš to, že ak obalovací obsahuje na konci float prvky, tak sa pozadie pod nimi nezobrazuje?

  4. Peter Oravec hovorí:

    ano, neroztiahnu sa po celej vyske, ja som to casto videl u FF, prave preto to vzriesia tie 2 DIVy

  5. tiso hovorí:

    Ale to nemá s centrovaním nič spoločné, to je normálne správanie. Nepleť dokopy nesúvisiace veci!

  6. Peter Oravec hovorí:

    s centrovanim priamo nie ale ak chces mat obrzkove pozadie tak to musis riesit takto

  7. lewro hovorí:

    Tiez pouzivam ten druhy sposob. Len taky detail (otazka) Preco zadavas pri #obsah-vonku display: block? Div je predsa block-element, alebo to tam mas za nejakym inym ucelom (browser? Som len zvedavy, neber to ako poucanie. :o )

  8. Peter Oravec hovorí:

    ja to pouzivam zo zvyku.. DIV je implicitne block ale neviem ci to aj IE6 vzdy dochadza... :-)

  9. lump hovorí:

    Ahoj, ako si prosim Ta dosiahol rovnaku velkost stlpcov na svojom blogu? myslim ten s clankami a ten s rubrikami, komentarmi a podobne...

  10. Peter Oravec hovorí:

    tie stlpce su obrazok ktory sa opakuje v hlavnom dive a preto to vyzera ze je to rovnako vysoke

  11. Pjotr hovorí:

    Ešte by som dodal, že keď použiješ margin:auto (margin:0 auto), tak IE to nevezme, preto text-align:center, že?

    Skúš vyhodiť centrovaný text a použiť na DIV, ktorý má byť na strede:

    margin-left:auto;
    margin-right:auto

    ;)

  12. soccref hovorí:

    Vynikajuca preca peter, dakujem!

Facebook komentáre ()

Napíš komentár