• TwitterRSS
  • Domů na Webylon
  • Kritika W3C
  • CSS, Evangelizace
  • Zafixovaný prefix

    14. května 2012

    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.

    html { background: -moz-linear-gradient(top, #CB0707 0%, #AA0505 50%, #CB0707 100%); background: -moz-linear-gradient(to bottom, #CB0707 0%, #AA0505 50%, #CB0707 100%); background: -webkit-gradient(linear, center top, center bottom, color-stop(0%, #CB0707), color-stop(50%, #AA0505), color-stop(100%, #CB0707)); background: -webkit-linear-gradient(top, #CB0707 0%, #AA0505 50%, #CB0707 100%); background: -webkit-linear-gradient(to bottom, #CB0707 0%, #AA0505 50%, #CB0707 100%); background: -o-linear-gradient(top, #CB0707 0%, #AA0505 50%, #CB0707 100%); background: -o-linear-gradient(to bottom, #CB0707 0%, #AA0505 50%, #CB0707 100%); background: -ms-linear-gradient(top, #CB0707 0%, #AA0505 50%, #CB0707 100%); background: -ms-linear-gradient(to bottom, #CB0707 0%, #AA0505 50%, #CB0707 100%); background: linear-gradient(top, #CB0707 0%, #AA0505 50%, #CB0707 100%); background: linear-gradient(to bottom, #CB0707 0%, #AA0505 50%, #CB0707 100%); }

    Mňam, mňam.

    Strašidlo z Redmontu

    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

    Nový druh pořádku

    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 [K.05] zkušenostech [K.35] bojí implementovat kousky z nedokončených specifikací. Syntaxe v úvodu zmíněného lineárního gradientu se v CSS 3 proměnila naposledy před půlrokem, když si W3C uvědomilo, že by se směr nazvaný 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

    Záviděný prefix

    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é.

    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.

    Kudy ven?

    Řešení by bylo prosté:

    Zrychlit standardizační proces.
    Vážně je zapotřebí rozmítat desetiletí o tom, jak se mají kulatit rohy, zprůhledňovat elementy či přepínat box modely? Projeví se takové čekání na kvalitě specifikace?
    Zmenšit standardizovaná sousta.
    Proč by mělo dokončení lineárního přechodu čekat na dokončení radiálního? Vidíte souvislost mezi rozdělováním slov a barvením podtržení?
    Snížit puntičkářské nároky.
    Jak moc záleží na tom, aby vizuální efekty neovlivňující rozložení prvků byly na pixel shodné? Sdílí tvůrci stránek obavy tvůrců prohlížečů z detailních nekompatibilit?
    Vyhodit zkratku výrobce z prefixů vlastností určených ke standardizaci.
    Není trochu sobecké, když si výrobci prohlížečů myslí, že kodéři chtějí ochutnávat jednu z možných budoucností výhradně s jejich produktem?
    Omezit experimentální implementace na experimentální prostředí.
    Pokud jsou skutečně prefixované vlastnosti tak strašně nestabilní, že musí mít prefix, není nezodpovědné je pouštět do světa? (Což je otázka na autory prohlížečů i webů.)
    Zavést do CSS oficiálně možnost filtrování podle prohlížeče i verze.
    Který druh hacku vyžaduje větší porci nestandardních znalostí: komentář <!--[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.