Nejprve je dobré si uvědomit, že pokud se formuláře nechají víceméně úplně být, dostanou relativně funkční vzhled od prohlížeče / operačního systému.
Třeba takové tlačítko (<input type=submit>
nebo <button>
) má při ponechání výchozího vzhledu klidně 5 stavů (obrázky jsou z Google Chrome v OS Windows 7):
- Výchozí stav, kdy se nic neděje.
- Při najetí myší na tlačítko (
:hover
). - Při stlačení tlačítka (
:active
). - Pokud je tlačítko vybráno (typicky) klávesou Tab (
:focus
). - Tlačítko je zablokované (atribut
disabled
).
Jak je vidět, bez sebemenší práce a kódu navíc docela pěkné a funkční tlačítko.
Takovému tlačítku lze měnit margin
, padding
, styl a barvu písma a hromadu dalších věcí, problém ale nastane, když se formulářovému prvku sáhne na rámeček (border
) nebo pozadí (background
). To celou výše uvedenou funkčnost a styl totálně rozhází. Nezbývá tedy než si všech pět stylů nadefinovat ručně.
Vlastní styl
- Vstupní pole
Běžné
<input type=text>
nebo pole<textarea>
lze stylovat docela rozumně.Snad jediný zádrhel je v Explorerech (do IE 8 včetně) při nastavení
padding
u a přeplnění pole — IE takový text posune natěsno k levému krajipadding
nepadding
.- Tlačítka
-
Co se týče tlačítek (
<input type=submit>
nebo<button>
), zdá se bez nějakého hackování nebo bez komplikování kódu nemožné dosáhnout 100% shodného chování napříč prohlížeči.- Opera a Internet Explorer všech versí při kliknutí (
:active
) nepatrně posouvají text doprava dolů. V Opeře lze toto chování odbourat pomocíposition: relative
pro tlačítko, v Exploreru ale nejspíš možnost zbavit se tohoto efektu není. - Chrome narozdíl od ostatních prohlížečů při kliknutí a podržení myši nad tlačítkem nevyvolává
:focus
.
- Opera a Internet Explorer všech versí při kliknutí (
- Element
<select>
a<input>
ycheckbox
aradio
Zde už je situace v podstatě beznadějná. Změnou rámečku nebo pozadí se přepneme na styl Windows 95:
A puntík, zaškrtávátko nebo šipku pro rozbalení není možnost změnit.
Stylování
<select>
je podrobněji popsáno v článku Stylování<select>
u.
Řešení v JavaScriptu
Pro napříč prohlížeči shodné formuláře s vlastním vzhledem je tedy potřeba formulářové prvky nepoužívat. Přesněji řečeno je schovat a viditelné části formuláře sestavit z <div>
ů a <span>
ů.
Existují hotová řešení:
- PrettyForm
Jednoduchá a přísupná knihovna podporující i věci jako ovládání klávesnicí. Funkční i v prehistorických prohlížečích. (Vlákno na DJPW.)
- Selectmenu
Plugin do jQuery UI řešící
<select>
y. Funkční napříč prohlížeči.- Select2
Taktéž jQuery plugin pro pokročilejší
<select>
y. Funkční až od IE 8.
Na co si dát pozor
- „Nepřechytračit“ uživatele, tj. nezměnit chování formuláře v dobré víře tak, že bude pro uživatele nepředvídatelné.
- V případě použití obrázků dbát na kontrast (viditelnost) prvků i v případě, že se obrázky nenačtou.
- Pokud možno zachovat obvyklé chování, zejména možnost ovládat formulář klávesnicí (
tabindex
atd.).
Odkazy jinam
-
Native form elements – nativní vzhled formulářových prvků
Související články

Jak „focusovat“ správně díky :focus-visible
Jak správně řešit označený (:focus
) stav formulářových prvků.

Poskakování obsahu akčních tlačítek
Jak vyřešit problém s poskakováním obsahu, když se změní textace nebo tučnost tlačítka.


Různá šířka <input type=number>
s min
/max
Proč má <input type=number>
různou výchozí šířku v závislosti na min
/max
atributech.