CSS design v pohledu do budoucnosti: workaround versus hack

04.09.2005 12:22

V dnešní době již existuje poměrně hodně stránek pro webmastery, na kterých se dozvědí nejrůznější hacky pro opravu té které chyby v CSS pro konkrétní prohlížeč. Ovšem stránek, které by poskytovaly informace ohledně workaroundů (neznám vhodný český výraz, proto používám „obejití chyby“) si myslím, že je opravdu poskromnu, takže se pokusím vhrnout trochu světla na dobré praktiky při kódování CSS.

Každý kdo je nějakým způsobem zapleten do webdesignu, speciálně tedy do kódování CSS tak ví, že nutně musí ovládat teorii, aby byl schopen odhalit, zda je jedná o chybu člověka nebo prohlížeče. Teorie je základ, ale nestačí, protože každý den musíme čelit rozdílům mezi prohlížeči, vykreslovacími a všemožnými chybami. Tyto překážky jsou velmi obtížné, avšak můžeme je brát jako výzvu :)

Pokud narazím na problém (chybu) v CSS, postupuji následovně:

  1. Pokud vím, že se jedná o chybu, mohu ji občas předejít
  2. Pokud to není možné, mohu ji obejít
  3. Pokud ani toto nezabere, tak mohu použít hack

Tím chci říct, že použití hacku by měla být vždy až ta poslední možnost.

Ale předtím, než se dostaneme ke konkrétnímu příkladu, pojďme se pokusit definovat co je hack a co je workaround (obejití chyby).

  • Hack je způsob, jak oklamat prohlížeč.
  • Workaround je způsob, jak oklamat vykreslovací chybu s minimálním vlivem na prohlížeč.

Jinak řečeno, hack řeší problém konkrétního prohlížeče zatímco workaround řeší problém obecně pomocí principů CSS. Základní problém s hacky je ten, že v dané chvíli nemůžeme říct, jak se budou chovat v nových prohlížečích, ovšem můžeme si být celkem jisti, že správný a logický CSS workaround nám bude fungovat tak jak chceme i v budoucnu.

Měli bychom vytvářet kód pro dnešek, ale myslet i na budoucnost. Kód by se měl vždy vytvářet pro co největší množství aktuálních prohlížečů a jedno perfektní doporučení zní takto: “code for the best, fix for the rest" (v češtině se to nerýmuje, ale znamená to: kóduj pro nejlepší, opravuj pro zbytek). Toto doporučení vám pomůže udržet vaše CSS malé, čisté, přehledné a umožní vám ho přizpůsobit pro slabší prohlížeče.

Podívejme se na asi nejznámější vykreslovací chybu v CSS: IE 5.x a jeho chybný box model. Myslím si, že toto je jeden z nejvíce otravných problemů, kterému musíme čelit den co den, při nastavování rozměrů u blokových prvků. Této chybě je možné se vyvarovat tak, že prvku zadáme pouze rozměr a rámeček nebo výplň (padding) zadáme na podřízený prvek, např:

#container { width:500px; }
#container #content { padding:10px; }

Stejný problém lze vyřešit i pomocí hacku:

#content { width:480 !important; width /**/:500px; padding:10px; }

Použití tohoto hacku je ještě relativně bezpečné, ale přesto je jedná o jasný hack konkrétního prohlížeče.

Podívejme se na jiný příklad:

/* Hides from IE5-mac \*/
* html #content { height:1%; }
/* End hide from IE5-mac */

Toto je krásný příklad hacku (dokonce dvojnásobného hacku). Ovšem tento hack lze vyřešit obejitím chyby minimálně dvěma způsoby:

#content { height:1%; }
#container > #content { height:auto; }

a řešení číslo dvě s jedním pravidlem:

#content{ height:auto !important; height:1%; }

V IE6 se při používání float můžete často setkat s chybami jako je 3px mezera textu nebo peekaboo. Nicméně můžeme se těmto chybám vyvarovat bez použití hacků? Ano, můžeme se pokusit vyřešit chybu ve floatu samotným floatem. Z toho co vím, lze řadu vykreslovacích problémů v IE vyřešit opačnými floaty.

Základní definice pravidel CSS pro dvousloupcový layout s pevnou šířkou:

#container { width:760px; }
#content { float:left; width:500px; }
#sidebar { float:right; width:160px; }
#footer { clear:both; }

Pro třísloupcový layout uvažujme následující HTML:

<div id="container">
    <div id="header">Header</div>
    <div id="main">
        <div id="content">Content</div>
        <div id="nav">Navigation</div>
    </div>
    <div id="extra">Extra column</div>
    <div id="footer">Footer</div>
</div>

Jedinou nevýhodou tohoto kódu je navíc jeden obalovací prvek pro prostřední sloupec a navigaci, nicméně pořadí sloupců v kódu je ideální pro přístupnost a vyhledávače. K tomuto HTML ještě potřebujeme CSS:

#container { width:760px; }
#main { float:left; width:540px;  }
#content { float:right; width:400px; background:#aaa; }
#nav { float:left; width:140px; background:#bbb; }
#extra { float:right; width:220px; background:#ccc; }
#footer { clear:both; }

A zde to máme. Základní sadu pravidel CSS, pomocí kterých získáme robusní cross-browser CSS layout pro moderní, a také pro ne až tak moderní prohlížeče bez jediného hacku.

Doufám, že vás tento trošku delší článek nenudil, že byl alespoň trošku užitečný a svůj názor na toto téma můžete vyjádřit v komentářích.


Poznámka: Jedná se o volný překlad článku CSS design for the future: workaround vs hacks od Alessandra s jehož názorem se ztotožňuji.

Komentáře k příspěvku 'CSS design v pohledu do budoucnosti: workaround versus hack'

  1. Pavel Šrubař:

    Hacky a workaroundy by nebyly potřebné, kdyby byla CSS specifikace jasnější a jednoznačnější. Ke každé nové referenci by měl její vydavatel povinně zveřejnit referenční implementaci renderovacího algoritmu, třeba pomalou a neoptimalizovanou, ale funkční. Každá odchylka od zobrazení v této referenci by se považovala za závažnou chybu a dotyčný prohlížeč by se pak nesměl honosit logem CSS x.x compatible. No a pak by stačilo vychovat uživatele, aby toto logo vyžadovali.

  2. Štěpán Svoboda:

    Mně například trvalo dost dlouho než jsem se “najel” používání nekonfliktních CSS konstrukcí - a mohu říci, že asi jako všude (oblast kódování obecně) i tady platí:

    Čím jednodušší a čistší konstrukce tím méně problémů.

    Začal jsem teorií, kterou jsem chtěl postupně uvádět do praxe - a tady jsem právě narazil. Spousta věcí vůbec nefungovala nebo dělala něco naprosto neočekávaného. Prostě praxe je holt praxe. Časem člověk okouká to nebo ono - no a prostě si to zažije.

    Nicméně se mi líbí zmiňované pravidlo. Sám to tak dělám - vytvořím CSS předpis, který funguje bezchybně v Gecku, no a pro IE jej pak doladím pomocí podtržítek. Nevím nakolik je to profesionální přístup, ale v praxi se osvědčil.


    Pavel Šrubař

    Bylo by to skvělé kdyby byly prohlížeče takto označené - jako nálepka na monitoru ohledně normy vyzařování.

  3. Petr Václavek:

    Tak mi tento * * * formulář právě sežral můj dlouhý komentář jen pro to, že jsem neuvedl email… takoé formuláře fakt miluju :(

    Takže stručně: V životě jsem nepoužil hack a jsem tomu rád. Vždy jsem si našel nějakou kličku či čistější konstrukci. Pravda byly problémy, které mi zabrali trochu více času, ale nakonec se to vždy vyplatilo. Třeba s 3px bugem jsem se trápil asi týden než jsem našel správné a čisté řešení a používám jej dodnes - pro jistotu jsem jsem o něm tenkrát sepsal článek na svůj blog a taky jsem tam přidal několik odkazů na různé články řešící css chyby prohlížečů, které by se čtenářům tohoto článku mohly hodit.

    Tak a teď se pokusím tento komentář odeslat, držte palce aby to vyšlo, protože pokud mi zase bude něco chybět, už to znovu psát nehodlám…

  4. Chose:

    2 Petr Václavek:
    Dekuji za prispevek, tohle uz se mi take stalo :(

    Tohle ma system WordPress opravdu spatne. Zrejme doplnim sablonu o kontrolu odeslani formulare javascriptikem :) Pokud to bude malo, tak sahnu i do PHP, ale to bych opravdu nerad :)

  5. Alex:

    2 Petr Václavek: Opera si odesílaný text pamatuje a stačí dát zpět. :) Ale do tohoto se pouštět nehci

    2 Chose: Díky za překlad - nedokonalost Internet Exploreru krásně podněcuje spoustu lidí jako tebe a Alessandra k tvůrčímu psaní - není to přece jenom plus jeho nedokonalosti? :)

  6. Jan Brašna:

    Petr Václavek) Podobný post vidím už poněkolikáté, a poněkolikáté odpovídám, že dle RFC by si to měl browser pamatovat v historii…

    Pavel Šrubař) W3C se naopak velkým obloukem vyhýbá jakémukoliv náznaku popisu implementace či chování, jen popisuje výsledek a případné kolize a ošetření chyb. Těžko říci, jestli je to špatně, či nikoliv.

  7. Petr Václavek:

    Jan Brasna) No je hezke, ze by si to mel browser pamatovat, ale skutecnost je proste u meho prohlizece jina (MSIE 6, nebo spise MyIE2 nad MSIE6). A myslim, ze prave v takovych pripadech by se mel JavaScript pouzivat. Vzdyt na to staci 2 radky kodu, je to pristupne, nicemu to nebrani a hlavne je to pak POUZITELNE!

  8. dusoft:

    je to chyba MSIE xxx, takze odporucate namiesto opravy kodu pouzit hack?

  9. dusoft:

    Firefox a Opera si samozrejme po stlaceni tlacitko Back a Forward zadane veci pamataju. Firefox dokonca aj pri refreshi stranky na formulari v urcitych pripadoch.

  10. Petr:

    Já hacky moc nepoužívám.. vesměs raději tomu předcházím nebo ty chyby obcházím. Jinak např. IE 5, a horší 5.5 .. už úplně ignoruju.
    Pro weby s pár desítkama návštěv denně nemá cenu se tím trápit.
    Ovšem pokud jde o projekty s vysokou návštěvností, tak tam se vyplatí věnovat moc času na odladění chyb v zobrazení.

  11. Jiří:

    Je sice pěkné, ze opera a firefox si toto pamatují po stlačení “back” ale je třeba si uvědomit, že jsou to stale minoritní prohližeče, mainstreamovi uživatelé používají MSIE xxx

  12. In-počasí:

    Už se těším na IE 7 vše bude doufám jednodušší

  13. Jakub Hejda:

    IE7 je z mého pohledu už dávno mrtvý :) ) Jen se objevil a už všechny ser..

    IE7 nepoužívají ani laici ani profesionálové, protože nefunguje tak jak by potřebovali.
    Od MS čekám spíš už jen na IE8.

  14. dota:

    [*map/mapcn4g25_mordy.txt||10||r||1|| @]

Zanechte komentář k příspěvku

XHTML: Můžete použít následující tagy: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>