Devel.cz Lupa Měšec Podnikatel Root Zdroják.cz DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Podmíněná pravidla v CSS

Předvedeme si běžné strategie, jimiž se webdesigneři při kódování designu vypořádávají s rozdíly v implementaci kaskádových stylů mezi webovými prohlížeči. Seznámíme vás i s možností méně známou, a tou jsou podmíněná pravidla v kaskádových stylech. Představíme vám její dvě ukázkové implementace.

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

Než vysvětlím hlavní téma článku, kterým jsou podmíněná pravidla v kaskádových stylech, dovolím si trochu delší obecný úvod. Svět webdesignu není ideální. Ideální nebyl a pravděpodobně ani nebude. Asi vždy tu bude řada webových prohlížečů, které ne vždy budou podporovat stejné vlastnosti kaskádových stylů. Navíc občas ty stejné vlastnosti budou podporovat trochu odlišným způsobem.

Postupně se naštěstí ustaluje (a zvětšuje) podmnožina kaskádových stylů, na které se implementace v prohlížečích shodnou (říkáme tomu interoperabilita), ale současně se objevují nové zajímavé vlastnosti, které zatím ustálené nejsou.

WWW na cestě

Zajímavost

Věděli jste, že během prvních 5 let od vzniku Webu se objevilo okolo 40 různých webových prohlížečů? Myslíte, že pokud by časem nezačalo několik z nich dominovat a ovládat celý trh (původně Netscape, pak Internet Explorer a později i Firefox), tak by dnešní situace vypadala stejně? Nebo by naopak byl list webových standardů a interoperability neposkvrněn, protože ve všech 40 prohlížečích by žádný webdesigner nikdy netestoval a prohlížeče by se neodvážily příliš odlišovat?

Jak webdesigneři problémům čelí?

Webdesigneři vymysleli několik strategií, které používají, aby rozdíly v implementaci kaskádových stylů mezi prohlížeči vyrovnali. Jedná se zejména o:

  • podmíněné komentáře v Internet Exploreru
  • zasílání (generování) odlišných stylů po různé prohlížeče
  • CSS filtry (hacky)

Podmíněné komentáře v Internet Exploreru

Internet Explorer podporuje tzv. podmíněné komentáře v (X)HTML. Jsou populární nejspíš proto, že vyrovnání se s různými verzemi Internet Exploreru je častým úkolem webdesignerů. Webdesigner připraví stylopis společný pro všechny prohlížeče a vedle něj připraví jeden, resp. více stylopisů pro Internet Explorer, resp. jeho různé verze. Výsledek může vypadat takto:

<link rel="stylesheet" media="screen" type="text/css" href="main.css" />
<!--[if lt IE 7]><link rel="stylesheet" media="screen" type="text/css" href="ie.css" /><![endif]--> 

Zápis if lt IE 7 určuje, že daný stylopis se použije pouze u Internet Exploreru nižší verze než 7 (IE6, IE5.5, IE5 atd.). Prohlížeče jiné než Internet Explorer druhý stylopis vůbec nevidí (vidí jej jako součást HTML komentáře a komentáře se ignorují).

Nevýhody:

  • jiné prohlížeče podmíněné komentáře nepodporují
  • podmíněné komentáře existují na úrovni HTML a nikoliv CSS, což stěžuje tvorbu snadno udržovatelných stylopisů (související pravidla totiž umisťujeme do odlišných souborů)

Zasílání (generování) odlišných stylů po různé prohlížeče

Dalším řešením je detekovat již na serveru, který prohlížeč ke stránce přistupuje a zaslat mu kaskádové styly připravené přímo pro něj. Jedná se o úkol mnohem náročnější, než se může zdát. Už jen správná detekce prohlížečů, všech jejich verzí a variant je velmi složitá věc, kterou málokdo umí.

Autor článku za celou svou praxi nenarazil na detekci, o které by si troufl prohlásit, že je 100% bezproblémová. Detekce často fungují pro běžné prohlížeče, pokud ale používáte méně obvyklý prohlížeč, můžete mít smůlu.

S ohledem na komplexnost problematiky detekce prohlížečů neprovádí detekci často přímo tvůrce stránky, ale svěří ji nástrojům, např. platforma ASP.NET sama o sobě generuje pro řadu svých prvků odlišné vlastnosti kaskádových stylů pro různé prohlížeče.

Nevýhody:

  • nespolehlivost detekce pro méně obvyklé prohlížeče
  • závislost na detekčních nástrojích (s vydáváním nových prohlížečů je nutné průběžně aktualizovat i detekční nástroje)

CSS filtry (hacky)

CSS filtry (nespisovně „hacky“) jsou konstrukce, které způsobí, že ačkoliv všechny prohlížeče dostanou stejný stylopis, interpretují jej odlišně, protože některé vlastnosti před nimi skryjeme. Příkladem budiž tzv. podtržítkový hack:

.box {
  width:  150px;
  _width: 160px;
} 

V tomto příkladu provádíme korekci na odlišný box model IE. Většina prohlížečů vidí zápis:

.box {
  width: 150px;
} 

Internet Explorer verze 6 a níže vidí zápis:

.box {
  width: 150px;
  width: 160px;
} 

a podle pravidla „poslední hodnota převažuje“ nastaví width na 160px.

Použití podtržítka v našem případě zafungovalo jako filtr – některé prohlížeče tuto vlastnost „vidí“, jiné ji ignorují (odfiltrují). Filtrů existuje celá řada a objevují se nové a nové. Nemusí se vztahovat jen na jednotlivé vlastnosti, ale i na celé stylopisy.

Nevýhody:

  • jedná se o „hacky“ – využití obezliček prohlížečů (často oficiálně nezdokumentovaných)
  • nebývají vždy validní
  • čas od času způsobí zmatení prohlížeče (např. starší verze prohlížeče Safari v některých případech zahodila zbytek stylopisu, jakmile narazila na hack používající na začátku názvu vlastnosti pomlčku nebo dvojtečku)
  • jsou pro nezasvěceného nečitelné (pokud daný CSS filtr neznáte, nemůžete si být jisti, zda se jedná o záměr nebo překlep, ani které prohlížeče filtruje)

Pozn.: Existují i další strategie, např. zcela se vyhnout používání problematických vlastností a konstrukcí (sem patří i matrjoška hack).

Kde je ideální cesta? Podmíněná pravidla v CSS?

Nyní se dostáváme k jádru našeho článku. Každá z uvedených strategií má totiž své nevýhody. Ideální cestou by se (pokud vynecháme ideál, že se prohlížeče začnou chovat stejně) mohly stát podmíněné sekce přímo v kaskádových stylech, po kterých někteří webdesigneři volají. Vypadat by mohly například takto (jedná se o výše uvedený příklad v box modelem přepsaný do podmíněné podoby):

.box { 
  width: 150;
  /*[if IE]*/ width:160;
} 

Je to také CSS filtr, ale postavený na jiném základě. Proč by byl takový přístup lepší než strategie uvedené výše?

  • syntaxe je samovysvětlující (pouhým přečtením zápisu vidíme, co znamená, nemusíme mít nastudované informace o CSS filtru)
  • zápis je validní
  • vede k tvorbě snadno udržovatelných stylopisů (související informace máme u sebe, jednotlivé filtry jsou snadno dohledatelné ručně i automatickými nástroji)

Autor článku nebyl schopen objevit nevýhody tohoto řešení. Pokud vás napadnou, podělte se s námi v komentářích.

Zmíněné řešení je ovšem jen návrhem, neexistuje ani ve specifikaci, ani jej prohlížeče nepodporují. Přesto je implementace možná (byť již zdaleka ne ideálním způsobem) a to jak na klientovi, tak na serveru.

Implementace pomocí JavaScriptu

Na klientovi můžeme podmíněná pravidla implementovat pomocí JavaScriptu (tím jsme sice závislí na JavaScriptu, ale pamatujte, že se to netýká našeho celého designu, ale jen podmíněných pravidel).

Na implementaci jsem narazil u Rafaela Lima pod názvem CSS Browser Selector. Do hlavičky stránky je třeba vložit:

<script src="css_browser_selector.js" type="text/javascript"></script> 

Následně můžete ve stylopisu používat tento zápis:

.ie .box {
  width: 160;
}

.ie7 .box {
  width: 160;
}

.gecko .box {
  width: 150;
} 

Skript podle detekovaného prohlížeče nastaví kořenovému elementu dokumentu příslušné třídy a my je můžeme využívat v našich stylopisech (třída „ie“ platí pro Internet Explorer, třída „ie7“ jen pro jeho sedmou verzi atd.). Oproti příkladu uvedenému výše nejsou podmínky vyjádřené v komentáři, ale další třídou, z praktického hlediska v tom ale není velký rozdíl.

Nevýhody:

  • závislost na JavaScriptu
  • závislost na detekci prohlížeče (která je ne vždy spolehlivá)

Implementace na serveru

Druhou možností je implementovat podmíněná pravidla na serveru a zpracovat je skriptem (preprocesorem), který pošle prohlížeči již přefiltrovanou podobu. V takovém případě jsme vlastně elegantně zkombinovali metodu generování odlišných stylů pro různé prohlížeče s CSS filtry.

Našel jsem hned dvě implementace. Tou první je plugin pro Ruby on Rails, který je serverovým rozšířením výše zmíněného CSS browser selectoru a tou druhou je projekt Conditional CSS pro PHP a ASP.NET. Zastavme se u druhé z nich.

Conditional CSS

Projekt nabízí  bohatou syntaxi, umožňuje podmiňovat jak celá pravidla:

[if IE] .box {
  width: 250px;
  padding: 10px;
} 

tak jednotlivé vlastnosti:

.box {
  [if Gecko] -moz-border-radius:15px;
  [if ! Webkit] float: left;
  [if lte IE 6.0] margin-top: -1px; 
} 

Všimněte si, že obsahuje jak pozitivní ( [if Gecko]), tak negativní podmínky ( [if ! Webkit]) a omezení verzí ( [if lte IE 6.0]). Detekuje všechny běžné prohlížeče včetně Safari pro iPhone, více viz dokumentace.

Stylopis se zapsanými podmínkami neposíláme prohlížeči přímo, ale pomocí jednoduchého PHP nebo ASP.NET skriptu, který napřed detekuje připojený prohlížeč a podle výsledku vyhodnotí podmínky a zašle prohlížeči zpracovaný výsledek. Ten zároveň i trochu zoptimalizuje (odstraní nadbytečné bílé znaky a provede sloučení importovaných stylopisů).

Nevýhody:

  • závislost na detekci prohlížeče (která je ne vždy spolehlivá)

Disclaimer: Autor článku nástroj Conditional CSS zatím v praxi nikdy nepoužil, ale vážně uvažuje o jeho využití při dalším kódování webů, kdy je potřeba web rychle odladit pro všechny prohlížeče. Dokonce si myslí, že se jedná o ideální řešení, který jak urychlí vývoj (nakódování stránky), tak usnadní následující údržbu stylopisů. Přesto, jelikož má k detekci prohlížečů nepřekonatelnou skepsi, by po dokončení webu přešel na některou jinou metodu, např. CSS filtry. Převod by provedl nahrazením podmínek za adekvátní CSS filtry (pokud takové existují) a jelikož se jedná o rutinní přepis, pokusil by se nalézt automatické řešení, které by náhradu provedlo automaticky. Tím by si mohl uchovat stylopis s podmínkami vhodný pro údržbu a vývoj, ale na produkční server dávat jeho vyexportovanou podobu.

Závěr

Pokud nyní přemýšlíte, kterou z možností si vybrat, tak dnes pro vás milí čtenáři jednoduchou odpověď nemáme. Žádný z uvedených způsobů totiž není bez problémů.

Je na vás, pro který ze způsobů se rozhodnete. A pokud některý z nich preferujete a máte pro to své důvody, podělte se o ně s námi v komentářích.

Odkazy

Anketa

Co používáte nejčastěji?

       

Martin Hassman

Martin Hassman

Martin Hassman vymyslel a založil projekt Zdroják. Absolvoval Vysokou školu chemicko-technologickou v Praze. Přednáší, školí. Pracoval jako webový vývojář.

Školení Google Analytics pro pokročilé

DW - Školení Google Analytics
  • Jak využít nové funkce Google Analytics
  • Vyhodnocování kampaní díky používání Multichannel funnels
  • Kde návštěvníci vašeho webu utíkají z objednávacího procesu.
  • Nebudete opakovat časté chyby při vyhodnocování dat o návštěvnosti.

Detailní informace o školení Google Analytics pro pokročilé »

Přehled názorů

pouziti podminenych komentaru
yen yacht 16. 10. 2008 08:09
Nový
├ 
Re: pouziti podminenych komentaru
Martin Hassman 16. 10. 2008 08:21
Nový
│
├ 
Re: pouziti podminenych komentaru
Hoween 16. 10. 2008 09:50
Nový
│
│
└ 
Re: pouziti podminenych komentaru
Lukáš Váňa 16. 10. 2008 11:58
Nový
│
│
 
└ 
Re: pouziti podminenych komentaru
Daniel Milde 16. 10. 2008 18:22
Nový
│
└ 
Re: pouziti podminenych komentaru
Plaváček 16. 10. 2008 17:03
Nový
│
 
├ 
Re: pouziti podminenych komentaru
Jirka Kosek 16. 10. 2008 17:45
Nový
│
 
│
└ 
Re: pouziti podminenych komentaru
Plaváček 16. 10. 2008 18:03
Nový
│
 
└ 
Re: pouziti podminenych komentaru
Marv 16. 10. 2008 18:05
Nový
│
 
 
└ 
Re: pouziti podminenych komentaru
Jirka Kosek 16. 10. 2008 21:49
Nový
├ 
Re: pouziti podminenych komentaru
anonymní uživatel 16. 10. 2008 19:10
Nový
└ 
Re: pouziti podminenych komentaru
Radek Hulán 17. 10. 2008 00:23
Nový
 
├ 
Re: pouziti podminenych komentaru
Hoween 17. 10. 2008 12:12
Nový
 
└ 
Re: pouziti podminenych komentaru
anonymní uživatel 30. 10. 2008 20:21
Nový
Muj nazor
Tomáš Macek 16. 10. 2008 08:18
Nový
Dobry
Michal Kandráč 16. 10. 2008 09:24
Nový
"Hacky" v dnešní době?
Hoween 16. 10. 2008 09:26
Nový
├ 
Re: "Hacky" v dnešní době?
Martin Hassman 16. 10. 2008 09:43
Nový
│
└ 
Re: "Hacky" v dnešní době?
pcs 16. 10. 2008 10:12
Nový
│
 
└ 
Re: "Hacky" v dnešní době?
Hoween 16. 10. 2008 10:21
Nový
│
 
 
└ 
Re: "Hacky" v dnešní době?
mofo 16. 10. 2008 11:28
Nový
│
 
 
 
└ 
Re: "Hacky" v dnešní době?
Marv 16. 10. 2008 18:11
Nový
│
 
 
 
 
└ 
Re: "Hacky" v dnešní době?
Plaváček 16. 10. 2008 18:23
Nový
│
 
 
 
 
 
└ 
Re: "Hacky" v dnešní době?
Marv 17. 10. 2008 14:42
Nový
├ 
Re: "Hacky" v dnešní době?
Láďa 16. 10. 2008 10:07
Nový
├ 
Re: "Hacky" v dnešní době?
Granda Urso 16. 10. 2008 10:25
Nový
│
├ 
Re: "Hacky" v dnešní době?
M. 16. 10. 2008 10:32
Nový
│
├ 
Re: "Hacky" v dnešní době?
Hnidopich 16. 10. 2008 11:16
Nový
│
└ 
Podminena pravidla v CSS + podminene bloky v JS
--==[FReeZ]==-- 16. 10. 2008 11:58
Nový
│
 
└ 
Re: Podminena pravidla v CSS + podminene bloky v JS
Hnidopich 16. 10. 2008 13:43
Nový
│
 
 
└ 
Re: Podminena pravidla v CSS + podminene bloky v JS
--==[FReeZ]==-- 16. 10. 2008 15:45
Nový
│
 
 
 
└ 
Re: Podminena pravidla v CSS + podminene bloky v JS
Hnidopich 16. 10. 2008 22:37
Nový
└ 
Re: "Hacky" v dnešní době?
Jan Obrátil 16. 10. 2008 11:26
Nový
 
├ 
Re: "Hacky" v dnešní době?
Hoween 16. 10. 2008 11:36
Nový
 
└ 
Re: "Hacky" v dnešní době?
karf 16. 10. 2008 12:03
Nový
 
 
├ 
Re: "Hacky" v dnešní době?
Hoween 16. 10. 2008 12:53
Nový
 
 
│
└ 
Re: "Hacky" v dnešní době?
karf 17. 10. 2008 08:58
Nový
 
 
│
 
└ 
Re: "Hacky" v dnešní době?
M. 29. 10. 2008 14:56
Nový
 
 
└ 
Re: "Hacky" v dnešní době?
Jan Obrátil 18. 10. 2008 10:56
Nový
 
 
 
└ 
Re: "Hacky" v dnešní době?
karf 20. 10. 2008 11:35
Nový
 
 
 
 
└ 
Re: "Hacky" v dnešní době?
Hoween 21. 10. 2008 21:01
Nový
 
 
 
 
 
└ 
Re: "Hacky" v dnešní době?
Jan Obrátil 22. 10. 2008 08:40
Nový
hack x css filtr
mofo 16. 10. 2008 11:31
Nový
RE: Podmíněná pravidla v CSS
anonymní uživatel 16. 10. 2008 11:52
Nový
├ 
RE: Podmíněná pravidla v CSS
BigLama 16. 10. 2008 14:56
Nový
└ 
RE: Podmíněná pravidla v CSS
Marv 16. 10. 2008 18:19
Nový
Podmíněné zabalení do
petík 16. 10. 2008 14:23
Nový
└ 
Re: Podmíněné zabalení do
Hoween 16. 10. 2008 14:42
Nový
RE: Podmíněná pravidla v CSS
MD 16. 10. 2008 14:24
Nový
├ 
RE: Podmíněná pravidla v CSS
Hoween 16. 10. 2008 14:47
Nový
├ 
RE: Podmíněná pravidla v CSS
anonymní uživatel 16. 10. 2008 15:30
Nový
└ 
RE: Podmíněná pravidla v CSS
Radek Hulán 17. 10. 2008 00:34
Nový
 
└ 
RE: Podmíněná pravidla v CSS
Hoween 17. 10. 2008 09:55
Nový
 
 
└ 
RE: Podmíněná pravidla v CSS
Radek Hulán 20. 10. 2008 14:07
Nový
Web není prostředí pro jediné správné řešení
Martin Michálek 17. 10. 2008 06:48
Nový
└ 
Re: Web není prostředí pro jediné správné řešení
Hoween 17. 10. 2008 09:53
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem