Развитие CSS: представление в четыре поколения

Большинство технологических спецификаций, определяющих функционирование самой популярной службы Интернета, разрабатывается при непосредственном участии Консорциума Всемирной паутины — W3C, основанного сэром Тимом Бернерсом-Ли в октябре 1994 года. Каскадные таблицы стилей, CSS — одна из важнейших для индустрии разработок консорциума.

Природа стандартов W3C

Финальные версии спецификаций, публикуемых W3C, имеют статус рекомендаций. Иными словами, веб-разработчики, разработчики браузеров, производители мобильных устройств и другие действующие лица отрасли могут выбирать на свое усмотрение, как им поступать в рамках своей повседневной практики: строго следовать букве спецификаций; придерживаться их лишь частично, в той или иной значимой для себя мере; игнорировать вовсе. Рекомендации W3C сами по себе не являются аналогами стандартов ISO или ГОСТ (в то же время, стандарты ISO, основанные на некоторых спецификациях W3C, существуют — но это уже несколько другая история). Консорциум не предусматривает никаких механизмов сертификации. Несоблюдение рекомендаций W3C кем бы то ни было не может повлечь за собой никаких санкций для «нарушителя».

С одной стороны, такая вот картина является одной из причин порой, мягко говоря, не слишком внимательного отношения некоторых веб-разработчиков и производителей браузеров к букве технологических спецификаций. С другой стороны, вот эта демократичность в сочетании с готовностью W3C к сотрудничеству со всеми заинтересованными организациями и частными лицами и, особенно, открытостью (свободностью от любых патентных ограничений) внедряемых консорциумом стандартов обуславливает их повсеместное распространение и непререкаемый авторитет W3C. Тех, для кого беспрекословное соблюдение рекомендаций W3C — дело принципа и чести, немного среди нас; но все же и тех, кто вообще ничего не слышал о W3C или же демонстративно плюет на его рекомендации, еще меньше. Наличие общепризнанных правил удобнее для всех и каждого, нежели их отсутствие, и откровенное пренебрежение рекомендациями W3C сегодня, в разгар второго десятилетия XXI века — это, вне всякого сомнения, маргинальная позиция, чуждая профессионализму.

Несмотря на отмеченный демократизм, спецификации, внедряемые консорциумом W3C — это вполне зрелые стандарты, рождающиеся на свет в ходе длительной многоступенчатой процедуры разработки, обсуждения, согласования и утверждения.

Стадии прожарки

Первоначально спецификация каждого будущего технологического стандарта публикуется в статусе рабочего черновика (Working Draft). На этой стадии проект может находиться весьма длительное время (иногда процесс затягивается на многие годы), претерпевая множество существенных изменений (вплоть до слияния с другими спецификациями или, напротив, дробления на отдельные проекты). Когда становится ясно, что спецификация в общих чертах «вызрела», рабочий черновик переходит в фазу «последнего звонка» — Last Call, для которой устанавливаются четкие сроки обсуждений. На этом этапе в проект спецификации еще могут вноситься заметные изменения по существу.

По завершении стадии Last Call спецификация может перейти в статус возможной рекомендации — Candidate Recommendation. На данном этапе в проект стандарта вносятся стилистические правки, исправляются ошибки и неточности. Следующая стадия — предлагаемая рекомендация (Proposed Recommendation) — фактически готовая спецификация, которая, тем не менее, должна еще некоторое время «выдержаться» перед тем, как, наконец, будет утверждена в статусе рекомендации (Recommendation).

Рекомендация — это финальный статус спецификации W3C, но, тем не менее, и в уже утвержденных стандартах (право же, их создают не боги) могут обнаруживаться неточности и откровенные ошибки, список которых (errata) публикуется в виде дополнения к каждой спецификации. Накопление некоей «критической массы» несовершенств — повод для выпуска новой редакции (edition) или переработанной версии (revision) спецификации. В исключительных случаях утвержденная рекомендация может быть отозвана консорциумом для серьезного пересмотра.

Перечисленные выше стадии разработки спецификаций сохраняются с первых лет деятельности W3C, но ведь Москва не сразу строилась, и современный смысл каждого этапа сложился не одномоментно.

CSS в доисторическую эпоху

Если рассматривать развитие CSS, то спецификации CSS1 и CSS2 были утверждены в качестве рекомендаций W3C в весьма короткие по нынешним меркам сроки. CSS1 — рекомендация W3C с декабря 1996 года; на тот момент прошло чуть более двух лет с момента основания консорциума. А еще через полтора года, в мае 1998 года, W3C уже утвердил в качестве рекомендации спецификацию CSS2.

Эта поспешность была жизненно необходимой для отрасли в целом. Вторая половина 1990-х — это, если кто не помнит, захватывающая своей зрелищностью, но тут же обескураживающая дикостью и абсурдностью эпоха гонки браузеров Netscape Navigator и Microsoft Internet Explorer. В отчаянных попытках перетянуть одеяло на себя обе стороны напрочь забыли об изначальном предназначении HTML как языка структурной разметки, наплевали на совместимость друг с другом, похоронили любые мало-мальски конструктивные намерения подумать о будущем. Сиюминутным смыслом существования соперников стало втюхивание не успевавшим опомниться веб-разработчикам и интернет-пользователям очередной порции разного рода «расширений» синтаксиса HTML, позволяющих реализовать те или иные визуальные эффекты, в каждой новой версии конкурировавших браузеров. Ситуацию требовалось незамедлительно спасать, и соответствующие инициативы W3C, несмотря на всю свою кажущуюся «экстренность», все же ощутимо запоздали. На протяжении еще почти всей второй половины «нулевых» нельзя было пренебречь распространенностью браузеров, качество поддержки CSS2 в которых трудно назвать даже сносным. А пропагандируемые W3C принципы разделения содержания и представления, семантической разметки, валидности кода еще чуть ли не с десяток лет после утверждения спецификации CSS2 в качестве рекомендации продолжали оставаться пустым звуком для подавляющего большинства HTML-верстальщиков средней руки.

Строительство надежного фундамента

На фоне всего сказанного может показаться странным, что спецификация CSS2.1, принципиально отличающаяся от CSS2, прямо скажем, немногим, так долго ждала своей очереди. В качестве рекомендации W3C этот стандарт был утвержден только в июне 2011 года — спустя 12 лет (!) после того, как такой статус получила спецификация CSS2. История была долгой и запутанной — скажем, в 2004 и 2007 годах проекту спецификации CSS2.1 дважды присваивался статус Candidate Recommendation, тогда как затем (в 2005 и 2010 годах) многострадальную спецификацию дважды же «низвергали» до состояния Working Draft.

Можно осуждать или оправдывать W3C — аргументов в запасе предостаточно у приверженцев обеих позиций. Но история не знает сослагательного наклонения, и разумнее всего просто попытаться беспристрастно проанализировать происходившее.

Упомянутые 12 лет — почти вдвое больший срок, чем возраст веба как такового к моменту утверждения спецификации CSS2 в качестве рекомендации W3C. За эти годы мир сильно, очень сильно, очень-очень сильно изменился. Интернет в целом из забавной игрушки для технарей превратился в массовое явление. На порядки возросли вычислительные мощности аппаратуры и пропускная способность каналов связи. Появился целый зоопарк мобильных устройств, по своим возможностям зачастую превосходящих «полноценные» настольные компьютеры, распространенные пресловутые 12 лет тому назад — при этом границы между настольными, портативными и мобильными устройствами продолжают неуклонно размываться (по крайней мере, с точки зрения особенностей отображения веб-страниц). Веб-технологии изрядно усложнились и разнообразились. Отрасль успела повзрослеть и окрепнуть, надежно излечившись от детских болезней.

W3C, конечно же, не стоял на месте. Многое, очень многое было фундаментально переосмыслено за эти 12 лет — вспомнить хотя бы поиски истины, связанные с не оправдавшимися надеждами на XHTML как будущую основу веба. Переосмыслению подверглось и развитие CSS.

Так, спецификация CSS2 фактически вобрала в себя стандарт CSS1, заменив его собой. Не совсем корректно говорить, будто бы CSS1 является подмножеством CSS2 — в строгом смысле это не так. Но CSS2 заново определяет все свойства, ранее определенные в CSS1, плюс ряд новых. Таблица стилей, соответствующая спецификации CSS1, будет валидной и с точки зрения спецификации CSS2 — с точностью до немногих экзотических исключений. Таким образом обеспечивается сохранение обратной совместимости между разными поколениями стандарта.

В ситуации лавинообразно возраставших требований к точности описания представления (прежде всего визуального) тех или иных элементов веб-страниц и умножения их разнообразия в какой-то момент стало очевидным, что развивать CSS по прежнему сценарию и впредь было бы слишком накладно. В итоге выработался новый механизм. Следующее поколение группы стандартов каскадных таблиц стилей, CSS3, отличается от CSS2 двумя ключевыми особенностями. Во-первых, не существует единой спецификации CSS3 — технология описывается несколькими десятками параллельно развивающихся независимых модулей, каждый из которых являет собой самостоятельную спецификацию, в достаточной мере краткую и компактную. Во-вторых, никакие модули CSS3 не определяют заново того же, что уже было описано в спецификации CSS2.1 — они строятся на твердой основе последней.

Спецификации CSS2.1, таким образом, досталась весьма ответственная роль — выступить в качестве выверенного, непротиворечивого и, что крайне желательно, свободного от ошибок, прочного и надежного фундамента для всех будущих спецификаций CSS. Если принять этот факт во внимание, то 12 лет сомнений, правок, обсуждений, вновь сомнений сразу перестают выглядеть совсем уж необоснованными.

CSS2.1 по сути своей — это тщательная ревизия спецификации CSS2. Ряд разделов CSS2 перекочевал в CSS2.1 совсем без изменений, значительная часть других подверглась в той или иной мере существенным исправлениям и дополнениям, а некоторые немногие пункты и вовсе были исключены до лучших времен, то есть до неторопливого переосмысления и последующего отражения в спецификациях следующего поколения, CSS3. Де-факто спецификация CSS2.1 призвана заменить собой CSS2 — W3C прямо указывает на то, что CSS2 не будет более сопровождаться и рекомендует производителям браузеров и веб-разработчикам ориентироваться в предпочтительном порядке именно на CSS2.1, нежели на CSS2.

На пути к светлому будущему

Вернемся к CSS3. На момент написания этой статьи большинство модулей третьего уровня CSS находились в стадии рабочих проектов. Впрочем, утверждение CSS2.1 в качестве рекомендации позволило переключить внимание рабочей группы W3C с насущных вопросов укрепления фундамента на ускорение дальнейшего развития CSS. В один день со спецификацией CSS2.1 в качестве рекомендации W3C был утвержден модуль Color третьего уровня CSS, а чуть позже, осенью 2011 года, такой статус получили модули Namespaces и Selectors. Заметное количество важных модулей CSS3 находятся в стадиях Candidate Recommendation и Last Call. В то же самое время, пока невозможно спрогнозировать, что получится в итоге — из какого общего количества модулей будет состоять семейство спецификаций CSS3 и в какие сроки в финальную стадию перейдет последний из них. Несмотря на это, уже началась разработка CSS4 — в частности, опубликован черновик модуля Selectors четвертого уровня CSS. Не исключено, что со временем какие-то из модулей CSS4 получат статус рекомендаций W3C даже раньше некоторых модулей CSS3 — какие конкретно это будут спецификации, прогнозировать пока очень трудно, но сам модульный принцип, положенный в основу современного подхода к развитию CSS, делает такой сценарий развития событий вполне себе вероятным.

В отношении спецификаций различных модулей CSS, разрабатываемых в настоящее время, W3C выработал следующую тактику: модуль может быть наделен статусом Candidate Recommendation при условии наличия двух его полных и непротиворечивых реализаций в основных браузерах. С этого момента соответствующие свойства и значения могут использоваться без префиксов. (Непосредственно о префиксах читайте русскоязычный перевод статьи Эрика Мейера, раскладывающей все по полочкам, и слушайте весьма полезный для практиков доклад Вадима Макеева.)

Артемий Ломов, WebHiTech