👋 Nový obsah na borekb.cz

Info Tento blog je v "read-only módu" a nový obsah již nebude přibývat. O vývoji píšu na DevBlog.

Obrázkový submit button pomocí CSS

Pro některé formuláře se výborně hodí obrázkové odesílací tlačítko – vedle vyhledávacího políčka se často místo textu „Hledat“ umisťuje obrázek s lupou apod. Pokud máte přístup k HTML kódu stránky, nejjednodušší je použít <input type="image">, ale pokud třeba používáte nějaký redakční systém, nemusí být vůbec snadné se do zdrojového kódu dostat. Jak tedy celou záležitost zařídit čistě pomocí CSS?

Základem je použití metody image replacement, o které toho na netu můžete najít opravdu hodně. Problémem je, že konkrétních implementací je kupa a zatím jsem neviděl žádnou „dokonalou“. Situace se navíc u formulářů ještě víc komplikuje, protože INPUT je in-line element a s tím je vždycky trochu potíž (uvidíte sami). Přináším tedy vlastní pokus o řešení tohoto problému, ačkoliv ani tentokrát není dokonalý.

HTML kód:

<form action="#" method="get">
  <input type="text" id="TextField" />
  <input type="submit" value="Search" id="Button" />Další text
</form>

CSS kód (předpokládá přítomnost 15×15 px obrázku):

#Button {
  background: url(search-button.png) top left no-repeat;
  width: 15px; height: 15px;
  border: 0px;
  text-indent: -2000px;
  line-height: 0px;
  cursor: pointer; cursor: hand;
}

Věnujte pozornost všem řádkům, všechny jsou důležité.

  1. Background nastavuje obrázek na pozadí. To je celkem jasné.
  2. Výška a šířka elementu jsou nastaveny na rozměry obrázku.
  3. Je potřeba se zbavit rámečku, který se u tlačítek standardně vykresluje.
  4. Vlastnost text-indent schovává obsah mimo viditelnou oblast. CSS specifikace sice nepovoluje použití této vlastnosti na inline elementy, ale v IE a v Gecku to prostě funguje. O Opeře se zmíním na závěr.
  5. Vlastnost line-height je potřeba pro IE. Bez ní se text nadále zobrazuje.
  6. Pro uživatele je vhodné nastavit kurzor na packu, aby tušil, co se stane po kliknutí.

A nyní k Opeře. Při mém experimentování se mi nepodařilo najít žádný způsob, ať už validní nebo nevalidní, kterým se u ní dá text schovat. Brutální fintou je nastavit font-size na 200px nebo něco takového a tuto velikost podsunout pouze Opeře (Gecku to rozhodí layout). Je to fuj, ale jinak se mi to prostě nepovedlo.

Za jakékoliv připomínky budu velmi vděčný.

Update 1: Jan Brašna upozornil, že uvedený postup nefunguje v Safari. To je nepříjemné, ale Safari nemám, takže nemůžu zkoušet. Třeba někdo z čtenářů poradí…

Update 2: Jan Bien upozornil na to, že formuláře by se neměly stylovat. V tomto případě se ani tak nejedná o stylování formuláře, jako spíš o snahu nahradit obdélník s textem za nějaký obrázek, problémy se však vyskytly i tentokrát. Můj názor na tuto problematiku si můžete přečíst v článku Stylovat či nestylovat formuláře?

Ukázka:

Další text
Zařazeno do kategorií |
Jan Brašna (Po, 2006-05-08 17:11):

A v Safari bude vidět jen prázdný čudlík :)

Oswald (Po, 2006-05-08 18:43):

…stejně tak při nedostupnosti obrázku.

Filosof (Út, 2006-05-09 05:13):

Zdar, zkousels overflow: hidden? Je mozne, ze to nebude fachat ani tak, ale co už…

Jan Bien (Út, 2006-05-09 05:33):

Jakkoliv mám články o možnostech CSS rád, tak bych určitě pod tento článek, kdybych byl jeho autorem, ještě přidal poznámku, že stylovat jakékoliv formulářové prvky, odesílací tlačítka nevyjímaje, vřele NEDOPORUČUJI.

Šaman (Út, 2006-05-09 05:51):

Zdar, co tohle?

#button span { display: none; }

Mozna by to fungovalo i bez spanu, ted nemam cas to zkouset..

Borek (Út, 2006-05-09 06:23):

2 Oswald: To nepovažuji za problém, obrázek prostě bude dustupný.

2 Filosof: To jsem zkoušel, nefunguje.

2 Šaman: Základním východiskem článku je předpoklad, že nemáme přístup ke zdrojovému textu formuláře.

2 Jan Bien & Jan Brašna: Díky za postřehy, aktualizuji článek.

*Čvachta* (Út, 2006-05-09 10:55):

Myslím si, že formuláře by se stylovat opravdu neměli. Několikrát jsem to již řešil, ale vždycky jsem došel ke stejnému názoru. Nemá to cenu. Nestylovat.

zimmi (Út, 2006-05-09 11:44):

Není někde nějaká ukázka? Jak to bude vypadat? IMHO u každého spotu s kódem by měla být ukázka.

Borek (Út, 2006-05-09 11:48):

2 zimmi: Omlouvám se, ukázka tu být měla, ale včera jsem už spěchal do hospody :) Dostanu se k tomu večer.

Jan Brašna (Út, 2006-05-09 13:13):

Onu „nefunkčnost“ v Safari (a G4/G5/Cocoa sestaveních Firefoxu) způsobuje to, že právě nedovolují stylování formulářových prvků pro celkovou konzistenci uživatelského rozhraní. Nevadí to, dokud neschováš vlastní text, kdy zůstane jen prázdné tlačítko (dá se většinou pochopit význam, ale není to moc user friendly). Takže řešení zní nestylovat :)

Tvrzení „obrázek prostě bude dustupný“ je poměrně neplatné, protože to ovlivňuje uživatel/UA, tzn. nejde o absenci obrázku na serveru, ale jejich vypnutí/nedos­tupnost v cílovém zařízení. Proto bych se nějak pokusil použít Šamanův záměr, ale generovaně, nějako to používá Anatolyho DIR.

Borek (Út, 2006-05-09 13:58):

2 Martin Kopta: Znám, ale článek vycházel z předpokladu, že designer nemá přístup k HTML kódu (jak opakuji už podruhé). Nakonec to ale skončí tak, že se radši pohrabu ve zdrojovém kódu Drupalu než bych vyřešil tenhle CSS rébus :)

Jan Brašna (Út, 2006-05-09 14:15):

Jinak takhle to vypadá:

Jan Brašna (Út, 2006-05-09 14:15):

Aha, nepovolené IMG :) Tak takhle: http://tmp.anum­.biz/Image58.png

Borek (Út, 2006-05-09 14:27):

Díky za obrázek, to je opravdu špatné.

Petr (Út, 2006-05-09 17:17):

Zajímavé řešení. Ale osobně bych taky moc nestyloval

Eskel (Po, 2006-05-29 18:35):

Není chyba nastavovat inline elementu width a height? Možná se pletu…

Borek (Po, 2006-05-29 19:59):

2 Eskel: Input patří mezi tzv. replaced elementy, u kterých nastavovat výšku a šířku lze.

Komentáře jsou uzavřeny (blog je v read-only módu). Pokud mě chcete kontaktovat, můžete mailem.