Úvodem » Malisův blok » O webdesignování » Vertikální a horizontální centrování

Vertikální a horizontální centrování

Není to tak dávno, co jsem potřeboval umístit obsah stránek na střed okna. Samozřejmě, že mě napadlo podívat se po nějakém rozumném řešení na internetu. Bohužel vše, co jsem našel, mělo nějaké mouchy. Nezbylo než řešení vymyslet sám.

Sám jsem sice zastáncem toho, že okno prohlížeče nebá být bráno jako celková pracovní plocha stránek, nicméně občas narazíte na požadavek, případně sami uznáte za vhodné umístit obsah doprostřed obrazovky. Může jít například o případ, kdy pracujete s poměrně malým textovým obsahem a zobrazení stránek klasicky, tzn. odshora obrazovky dolů by na větších monitorech nevypadalo příliš dobře.

Na podobný problém jsem před relativně nedávnou dobou narazil. Tvořil jsem stránky Kadeřnictví LaVida a potýkal jsem se s problémem, že sice disponuji poměrně dost velkým množstvím nejrůznějších ilustračních obrázků, ale se skoro žádným textem. Z toho důvodu jsem se rozhodl pro toto kontroverzní (i když poměrně efektní) řešení.

Problém nabízených řešení

Možná Vás to překvapí, ale nikde jsem nenarazil na řešení, které by stoprocentně fungovalo. Našel jsem sice několik řešení, které se jako funkční tvářily, ale problém nastal v okamžiku, kdy jste začali zmenšovat okno.

Všechna řešení, která jsem objevil totiž počítají s tím, že okno prohlížeče je větší, než box, který se má centrovat. To je sice ve většině případů pravda, ale není to jisté. Pokud se okno zmenší pod velikost boxu, přestane být přístupný levý horní roh (viz např. řešení Marka Prokopa ze Sovy v síti)

Mé níže uvedené řešení tento problém řeší pomocí několika vnořených boxů:

<div id="container">
 <div id="container-horizontal">
  <div id="container-in">
   <div id="content"> ... vlastní obsah ...</div>
  </div>
 </div>
</div>

Výpis XHTML kódu je poměrně jednoduchý

Dá se říct, že container se stará o to, aby byl vždy viditelný i levý horní roh, container-horizontal umístí levý horní roh boxu doprostřed obrazovky a container-in posune levý horní roh o poloviční šířku a výšku nahoru a doleva, tozn. že provede vlastní vycentrování. Div content už nemá pro náš příklad význam, stará se jen o dodatečné zformátování.

CSS kód potom vypadá následovně. Méně zkušení kodéři nechť si laskavě povšimnou berličky, která simuluje vlastnosti min-width a min-height, které MSIE nezná.

body, html {
  height:100%;
  border:0;
  padding:0;
  margin:0;
  text-align:center;
}
#container {
  min-width:600px;
  min-height:400px;
  width:100%;
  height:100%;
  width:expression(document.body.clientWidth < 600?
    "600px": "100%" ); /* pro IE */
  height:expression(document.body.clientHeight < 400?
    "400px": "100%" ); /* pro IE */
  position:absolute;
  top:0;
  left:0;
}
#container-horizontal {
  text-align:left;
  margin:auto;
  position:absolute;
  top:50%;
  left:50%;
}
#container-in {
  position:absolute; 
  top:-200px;
  left:-300px;
  width:600px;
  height:400px;
  background:black;
  overflow:auto;
}

CSS kód, který se postará o rozložení stránky

 A je to...

Na závěr snad zbývá dodat jen odkaz na funkční příklad. Můžete libovolně měnit velikost okna, celý obsah boxu bude stále přístupný. Testováno v prohlížečích MSIE, Mozilla Firefox a Opera.

Samozřejmě doporučuji se nejraději blokům centrovaným na střed stránky vyhýbat. Možná ale budete řešit stejné dilema jako já a toto řešení Vám snad ušetří několik perných chvilek, které budete moci věnovat příjemnější zábavě. Pozdravujte ji ode mě.

| Nahoru

Komentáře

Pěkné, leč...

... s fixními rozměry je to sranda. Zkuste si to ale s rozměry obecnými - třeba vycentrovat takhle obecný obrázek (u kterého nevím předem, jak je velký) nebo nějaký obecný blok.

Přidáno: 6.7.2006 21:20
Obecné rozměry

To je samozřejmě pravda, pixy. Toto řešení je určitě taky nedokonalé, neznámé rozměry nedává, ale na nic lepšího jsem zatím nepřišel.
Pokud ale někdo nějaké univerzální řešení (bez js) znáte, rád se poučím. Moc často se to nevyužije, ale zrovna na ty obrázky by se to celkem hodilo.
P.S.: Díky Plavče za link, až takovéto celebrity to sem přitáhlo, až se červenám Smile

Přidáno: 9.7.2006 17:38
Jez do polosyta, pyj do celbryta

Právě že obecné řešení taky neznám, a tohle naopak znám dlouho. Taky bych se rád přiučil Smile

A ty celebryty bych si odpustil, dík.

Přidáno: 9.7.2006 23:04
[4] crazy - crazy[zavináč]ontheroad.cz

No jo, centrovat stránku to by ještě šlo, ale jak vycentrovat rozbalovací menu tak, aby bylo se stránkou na stejném místě???

Přidáno: 9.11.2006 15:48
inak

#prvek {min-height: 100px;
height: expression(this.scrollHeight < 100? "100px" : "auto" );
overflow: visible;}

Přidáno: 22.1.2007 16:37
[6] nakashi
Hezky pěkně

Toto řešení je rozhodně fajn, vyřešil si za mě problém se schováváním oněch 50ti procent. Pevná výška je však poměrně velký handicap, nakonec asi stejně skončím u jednoduché tabulky s jednou celou a vertikálním centrováním. Taky je v kódu nemám rád, ale občas je to asi to nejjednodušší řešení fungující bezpečně všude.

Přidáno: 4.2.2008 12:07
[7] Jiří - tryler[zavináč]centrum.cz
prosím o pomoc s obsahem na hl. stránce

Ahoj. Přečetl jsem spousty meteriálu a stále se nemohu dočíst jak pracovat s menu a obsahem-lépe řečeno jejich propojením-chci to udělat bez rámu a iframe. U iframe je vidět stín a to vypadé nepěkně nevím jak nahnat odkazy z menu do nějakého pole na pravo od menu hlavní stránky. Ctěl bych aby se mi text se zobrazoval hned vedle munu asi jako tady-http://seznamfs.sourceforge.net/. děkuji moc za odpověď. S pozdravem Jiří

Přidáno: 11.1.2010 2:05
[8] Malis

[7] Abych řekl pravdu, tak ne zcela chápu otázku. Jak má být menu propojeno s obsahem? Na uvedené stránce je klasice vodorovné jednoúrovňové menu.

Přidáno: 20.1.2010 11:11

Nový komentář

Při komentování se snažte zachovat alespoň určitou minimální míru slušnosti a pište pokud možno s diakritikou. Komentáře naprosto mimo mísu, popřípadě komentáře urážlivé, protizákonné a podobně budou vymazány.

Internetové adresy začínající http://, https:// a ftp:// budou převedeny na odkazy.

Tučné písmo můžete vložit pomocí [b]text[/b], pro kurzívu použijte [i]text[/i].

Kolik je jedna mínus jedna (slovem)?

 

Vyhledávání

Mapa stránek

Poslední reference

Hospodský zpravodaj

Poslední komentáře

  • ludvik: Liki: proč? Je jasné, že jsou místa kde jsou lepší… 5.3.2010 23:42
  • el GeKoN: Já ci tkýýý!! - Já chci taky KH net :-( . Nevíte o… 5.3.2010 1:28
  • Liki: Wifi - Optika na sídlišti je opravdu "bomba… 23.1.2010 21:45
  • Malis: [7] Abych řekl pravdu, tak ne zcela chápu otázku.… 20.1.2010 11:11
  • Jiří: prosím o pomoc s obsahem na hl. stránce - Ahoj. Př… 11.1.2010 2:05

Kontakt

  • Malének webdesign
    Michal Malének
    Terronská 58
    Praha 6
    160 00
  • tel.: +420 777 162 547
  • michal@malenek.cz