Historie vás naučila, že nekompatibilní implementace CSS vlastností v prohlížečích jsou zlo. Technická evangelizace vás zase naučila, že hacky jsou zlo. A nakonec W3C vás naučilo, že vede web k plnému potenciálu neprošlapanými a příležitostně i slepými cestičkami.
Výrobci prohlížečů si z těchto lekcí vzali ponaučení a naservírovali nám prvotřídní dobro.
Mňam, mňam.
Když si před třinácti lety mladičká Mozilla usmyslela, že rozšíří CSS, chtěla dát jasně najevo, že její vynálezy jsou experimentální či pro interní potřebu. Že není jako ten zlosyn, který jí zamordoval maminku Netscapa Navigatora a který nedbale obohatil názvosloví stylovacího jazyka bez řádného standardizačního procesu.
Tenkrát vymyslela border-radius
. Respektive -moz-border-radius
. Prefix byl zamýšlen jako jasná záruka, že každý, kdo tuto vlastnost použije, chce pouze experimentovat a pouze s Mozillou. Naproti tomu hračky Microsoftu filter
, behavior
a zoom
se tvářily jako přirozená součást CSS. (Chvíli se šuškalo, že filter
bude v CSS 3, ale nenašel jsem žádný autoritativní zdroj, nejspíš to byl drb.)
Syntaxe s pomlčkou na začátku byla zpočátku trochu nebezpečná pro zbytek CSS, pokud za vlastností nenásledoval (oficiálně nepovinný) středník.
„Vlastnosti“ začínající znakem „-“ nejsou součástí CSS, ale XUL (interní jazyk jádra Mozilly) a ve veřejně přístupném CSS nemají co dělat. Je otázkou, zda (a kdy) je zde za chybu budou kromě Safari považovat i další prohlížeče (Konqueror? Opera?). Rozhodně proto doporučuji: pokud už nutně musíte definovat nějakou XUL-vlastnost, umístěte tuto definici do souboru, k němuž se dostane jenom Mozilla.
— Pixy, Pozor na -moz-vlastnosti!, Pixylophone, 14. července 2003
Trend s očůráváním patníků CSS vlastností se brzy zalíbil i strašidlu, přesněji té jeho paži, která byla odpovědná za Office a za jeho monstrózní HTML výstup. Brr. Dodnes se na internetu válejí statisíce stránek s příšerným kódem hemžícím se vlastnostmi typu mso-hyphenate
, které jsou uvnitř stylů jen proto, aby stránka při znovuotevření ve Wordu fungovala jako plnohodnotný wordovský dokument.
Popularita prefixů nakonec na podzim 2003 prosákla i do návrhu revize CSS 2.1:
Je zaručeno, že potržítko či pomlčka na záčátku jména vlastnosti či klíčového slova nebudou použity v žádné současné či budoucí verzi CSS.
— Rozšíření specifická pro výrobce, návrh CSS 2.1, 15. září 2003
V roce 2007 implementovalo Safari -webkit-border-radius
. V této chvíli už byl border-radius
v návrzích CSS 3, i když v jiné podobě, než jakou implementovala Mozilla, a v jiné, než je teď. Obyčejný kruhový border
na všech čtyřech stranách se ovšem zapisoval u obou vlastností odjakživa stejně, přesto vás i v takovém případě donutili vývojáři uvést tutéž hodnotu dvakrát: jednou pro Mozillu, podruhé pro Safari. Pokud jste dodatečně jednu z nich změnili, vznikl nežádoucí rozdíl v zobrazení.
Microsoft si také jedinou nově vymyšlenou vlastnost v Exploreru 7 oprefixoval a o verzi později dokonce oprefixoval vesměs všechno, co nebylo schválené v CSS 2.0 — naštěstí navzdory původnímu úmyslu nepovinně. Z dlouhodobě podporovaných vlastností se najednou staly -ms-
vlastnosti jen proto, aby byla uspokojena poptávka ukřičené masy po důsledném dodržování standardů. Myslíte, že tato změna skutečně zabránila nějaké kolizi v názvech?
Zejména v posledních letech vznikla ohromná spousta prefixovaných vlastností, protože se výrobci prohlížečů po předchozích top
měl raději nazývat to bottom
.
- Florian Rivoal (Opera)
- Autoři stránek už používají gradienty i odprefixované, ale ty nikde nefungují.
- Steve Zilles (Adobe)
- Jak je mohou používat odprefixované, když je syntaxe neznámá?
- Florian Rivoal (Opera)
- Ty víš, jaká je odpověď ;-)
- Steve Zilles (Adobe)
- Rozbíjejí systém.
- Bert Boss (W3C)
- Pokud to používají, je to jejich riziko, ne naše.
— Přepis jednání pracovní skupiny CSS, W3C, 8. března 2012
Prefixy tlumí ochotu prohlížečů přebírat od sebe navzájem novinky. Obecně řečeno: zavede-li prohlížeč A nějakou -a-
vlastnost a autoři stránek ji začnou spokojeně používat, prohlížeč B nebude mít žádný okamžitý přínos z toho, že tutéž vlastnost implementuje jako -b-
vlastnost (a nic ho nenutí okopírovat ji přesně) — nejprve si té nové implementace musí všimnout autoři stránek a přizpůsobit své kódy. Což může trvat déle.
Jak dlouho? To nezáleží na kvalitě implementace, ale především na síle výrobce prohlížeče. Protože většina tvůrců stránek se soustředí na omezenou množinu prohlížečů a tím tlačí všechny ostatní zapadnout do některé ze škatulek. (Obzvláště do škatulky s prefixem konkurenčního prohlížeče se zapadá nepříjemně.)
Pak je úplně jedno, co je experimentární, proprietární či rozpracované.
scrollbar-*-color
, s čímž kdysi přišel Microsoft. Pochopitelně nepodporuje -ms-scrollbar-*-color
.
-wap-
, který nebyl určený pro ní — aby se tvůrci stránek nemuseli -o-
pakovat.
zoom
. Bez jakéhokoliv prefixu.
-ms-interpolation-mode
se v jiných prohlížečích jmenuje jinak a má jiné hodnoty.
border-radius
bez prefixu hlavně proto, aby ukazovala kulaté rohy na již existujících webech, bez záruky, že (v té době čerstvé) znění specifikace přežije.
-moz-
)box-sizing
, u kterého stále není jisté, že v CSS 3 bude tak, jak je podporovaný (hodnota padding-box
je na odpis).
-webkit-
)box-sizing
u zahodit prefix, ale údajně to rozbíjelo weby.
::-moz-selection
, o mnoho let později všechny konkurenční prohlížeče skočily rovnou na ::selection
. Konsorcium pak tento pseudoelement z CSS 3 definitivně vyhodilo.
filter
. Vůbec ničemu to nevadí, verze bez prefixu je stále stejně provozuschopná.
-webkit-text-size-adjust
včetně konkurenčního prefixu, komunita mu to v čele s čelem Jean-Luca Picarda vymluvila. Kde jsou ty časy, kdy všichni naříkali, že kvůli MS musí psát do kódu něco speciálního?
transition
ů a transform
ů totálně zazdívá prostor pro konkurenci. O podpoře cizího prefixu proto vážně uvažují i vývojáři z Mozilly a Opery.
Nakonec rozhoduje popularita vlastnosti prakticky stejně, jako kdyby prefixy neexistovaly. Jako kdyby ani specifikace neexistovaly. Rizika nekompatibility jsou vesměs stejná, jako v éře před zavedením prefixů, neboť tvůrce stránky v drtivé většině případů doufá, že všechny prefixované i neprefixované vlastnosti poběží stejně.
Až na pár případů, kdy používá prefixované vlastnosti jako hacky. V podstatě stejně, jako se kdysi používal exploreří expression
. Zlobí animace v iPhonu? Žádný problém, vyměníme -webkit-transform: translate
za -webkit-transform: translate3d
a je klid. To by bez prefixů tak snadno nešlo.
Můžete namítnout, že současný stav je jen dočasný a že v budoucnu se prefixy u stávajících CSS vlastností odmažou a pak budou všichni vesele používat… — a teď vám skočím do řeči: nějaké další nové CSS vlastnosti. Opět s prefixy. Udržovanými na věčné časy a nikdy jinak. Prefixy momentálně úspěšně zamořují nejen CSS, ale i javascriptová API.
Řešení by bylo prosté:
<!--[if IE lt 7]-->
, nebo @media (-webkit-min-device-pixel-ratio: 0)
? Hacky jsou zlo, ale poptávka po nich neutichne. Je to rozhodně menší strašidlo než -ms-moz-o-webkit-
.
Potíž je v tom, že evangelizátoři prefixy dlouhodobě velebili jako ideální řešení a že novému pokolení kodérů už ani nepřipadá příliš praštěné, že na výrobu či úpravu triviálního barevného přechodu potřebují generátor CSS kódu. Nic proti inovacím, ale je vážně divné, když se nyní člověk raduje z „nových standardů“ a zcela při tom přehlíží neodmyslitelný projev standardizace — jednotnost zápisu.