úterý 13. srpna 2013

Jak udržet patičku web pořád dole

Často se mi u webů stává, že mi "lítá" patička, pokud má klient zadáno jen málo textu v obsahu. Návodů jak udržet patičku stále na úplném konci stránky nebo displeje je na internetu spousta, ale nikdy mi moc nechtěli fungovat. Nakonec jsem zjistil, že to bylo pouze mou nedostatečnou znalostí pozicování.

Jak vypadá zdrojový kód

Není nic složitého patičku dole udržet, stačí pouze dodržovat jakousi standardní strukturu základních elementů.

<body>
  <div id="wrapper">
    <div id="header"></div>
    <div id="content"></div>
    <div id="footer"></div>
  </div>
</body>

A pak přihodit správné kaskádové styly.

html,
body {
 margin:0;
 padding:0;
 height:100%;
}
#wrapper {
 min-height:100%;
 position:relative;
}
#header {
 padding:10px;
 background:#5ee;
}
#content {
 padding:10px;
 padding-bottom:80px; /* Výška patičky */
}
#footer {
 width:100%;
 height:80px;
 position:absolute;
 bottom:0;
 left:0;
 background:#ee5;
}

A od teď se patička bude vždy zobrazovat úplně dole.

Jak to funguje

Tagům "body" a "html" se musí výška nastavit na 100% aby byly vždy roztažené minimálně na celou výšku okna prohlížeče a také proto, že v některých starších prohlížečích pak nefunguje atribut "min-height" pokud není zadefinovaná výška rodičovského elementu.
Div který slouží jako kontejner (v našem případě #wrapper) má pak relativní pozici aby se dala vůči němu absolutně napozicovat patička.
Samotná patička je tedy pozicována absolutně ke spodní straně kontejneru a u elementu s obsahem je nastaven spodní padding, který se rovná výšce patičky, jinak by patička překrývala spodní část obsahu, pokud by byl vyšší než dokáže monitor vertikálně zobrazit. Pokud chceme mít obsah od patičky více odsazený, samozřejmě stačí u #content nastavit o něco větší padding-bottom.

pátek 17. května 2013

Tabulka se zaoblenými rohy pomocí CSS3

Vytvořit tabulku se zaoblenými rohy pomocí CSS3 se zdá být jednoduchý úkol, ale co když potřebujeme mít zaoblené rohy u tabulky s nastaveným parametrem border-collapse: colapse? Jednoduše to prostě nejde. Chrome, FF nebo ostatní prohlížeče s jádrem Webkit zatím neumí zakulatit rohy pokud je tento parametr nastavený a to ani v případě, že border-radius aplikujeme na vnitřní elementy tabulky.

Nicméně pokud potřebujeme ohraničit vše rámečkem širším než 1px, stačí použít border-collapse: separate a šířky orámování jednotlivých elementů nadefinovat dle libosti.

Chtěl bych se tu ale zaměřit na situaci, kdy potřebujeme orámování právě 1px. Není to nic složitého, ale co už někdo vymyslel, může ušetřit čas druhému. Tak tedy výsledek by měl vypadat nějak takto:



HTML (obyčejná tabulka vygenerovaná WYSIWYG editorem v redakčním systému) :

<table border="1" cellpadding="1" cellspacing="1" style="width: 500px;">
  <thead> 
    <tr> 
      <th scope="col">hlavička1</th> 
      <th scope="col">hlavička 2</th> 
    </tr> 
  </thead> 
  <tbody> 
    <tr> 
      <td>data tabulky</td> 
      <td>další sloupec s daty</td>
    </tr> 
    <tr> 
      <td>data v druhém řádku</td> 
      <td>poslední buňka tabulky</td> 
    </tr> 
  </tbody> 
</table>


CSS (orámování elementů pouze z některých stran):

table {
  border-collapse: separate;
  border-width: 1px 0 0 1px;
  border-color: #194103;
  border-style: solid;
  -moz-border-radius:7px;
  -webkit-border-radius:7px;
  border-radius:7px;
}
table tr {
}
table tr th {
  border-width: 0 1px 1px 0;
  border-color: #194103;
  border-style: solid;
}
table tr td {
  border-color: #194103;
  border-style: solid;
  border-width: 0 1px 1px 0;
}


Toto by mělo vyřešit všechny naše problémy, ale opak je pravdou, protože rámeček jsme nastavovali až u buněk tabulky, které zakulacené nejsou. Tady přichází už konečně na řadu to kouzlo, díky kterému dosáhneme požadovaného výsledku.

table tr:first-child th:first-child {
    -moz-border-radius-topleft:7px;
    -webkit-border-top-left-radius:7px;
    border-top-left-radius:7px;
}
table tr:first-child th:last-child {
    -moz-border-radius-topright:7px;
    -webkit-border-top-right-radius:7px;
    border-top-right-radius:7px;
}
table tr:last-child td:first-child {
    -moz-border-radius-bottomleft:7px;
    -webkit-border-bottom-left-radius:7px;
    border-bottom-left-radius:7px;
}
table tr:last-child td:last-child {
    -moz-border-radius-bottomright:7px;
    -webkit-border-bottom-right-radius:7px;
    border-bottom-right-radius:7px;
}

Doufám, že toto někomu pomůže rychleji nastylovat tabulku podle jeho představ. Případné chyby nebo vylepšení můžete dát do komentářů.