Selectors Level 4 – попередній огляд

22 Січня 2013

Поки компанії-розробники браузерів напружено працюють, щоб реалізувати можливості, надані CSS3, а розробники інтерфейсів створюють все більше відповідних інструментів для більш ефективної роботи з таблицями стилів, вже з’явився малюнок 4 версії стандарту.

Selectors Level 4 — предварительный обзор

Публікація документа “Selectors Level 4” зовсім не означає, що CSS3 застарів, а швидше свідчить про природний процес еволюції CSS загалом. До того ж він ще не набув статусу офіційної рекомендації і є лише чорновим начерком, на який не можна розраховувати, адже в документ неодмінно будуть внесені значні зміни.

В даний час CSS-специфікації можуть розроблятися незалежно один від одного, що є величезною перевагою: швидке завершення документа та усунення поточних проблем просуває Web вперед, дозволяючи відразу задіяти нові специфікації.

Більшість селекторів 4 рівня є псевдокласами, багато з яких отримали нові цікаві доповнення.

Логіко-комбінаторні селектори: :matches, :not

Деяким псевдоклас :matches може бути знайомий по :moz-any(), колись реалізованому в Mozilla Firefox 4. Завдяки йому можна згрупувати велику кількість схожих селекторів, наприклад, об’єднати численні значення html-якорів в одне. Тобто натомість:

<p dir="ltr">ul.menu li a:link,</p>
<p dir="ltr">ul.menu li a:hover,</p>
<p dir="ltr">ul.menu li a:visited,</p>
<p dir="ltr">ul.menu li a:focus {</p>
<p dir="ltr">color: red;</p>
<p dir="ltr">}</p>

Можна одразу зробити це:

<p dir="ltr">ul.menu li a:matches(:link, :hover, :visited, :focus) {</p>
<p dir="ltr">color: red;</p>
<p dir="ltr">}</p>

Простий псевдоклас заперечення: not був представлений і в специфікації CSS3, але в CSS4 він став набагато потужнішим: тепер його можна застосовувати як до складних селекторів, так і до списку селекторів. Наприклад, можна виділити червоним усі параграфи, яким не призначено активний чи видимий клас:

<p dir="ltr">p:not(.active, .visible) {</p>
<p dir="ltr">color: red;</p>
<p dir="ltr">}</p>

Локаційні псевдокласи: :any-link, :local-link

Завдяки цим псевдокласам краще контролювати стиль посилань.

Псевдоклас :any-link (у документі вказано, що назва є тимчасовою і її можна змінити) дозволяє об’єднати значення a:link і a:vizited і вказує на посилання незалежно від того, чи здійснювався за ними перехід:

<p dir="ltr">a:any-link {</p>
<p dir="ltr">color: red;</p>
<p dir="ltr">}</p>

:local-link вказує на локальні посилання та допомагає виділити посилання, що веде на домашню сторінку, іншим стилем, не торкаючись інших. Крім того, є можливість використовувати :local-link з параметром: число, вказане у дужках, вказує на відповідний рівень URL-шляху:

<p dir="ltr">nav :local-link(0) {</p>
<p dir="ltr">color: red;</p>
<p dir="ltr">}</p>
<p dir="ltr">nav :local-link(1) {</p>
<p dir="ltr">color: green;</p>
<p dir="ltr">}</p>
<p dir="ltr">nav :local-link(2) {</p>
<p dir="ltr">color: blue;</p>
<p dir="ltr">}</p>
<p dir="ltr">nav :local-link(3) {</p>
<p dir="ltr">color: yellow;</p>
<p dir="ltr">}</p>
<p dir="ltr">nav :local-link(4) {</p>
<p dir="ltr">color: gray;</p>
<p dir="ltr">}</p>

Тимчасові псевдокласи: :past, :current, :future

Ці псевдокласи особливо стануть у нагоді при створенні програм-суфлерів і програм для читання субтитрів: за допомогою однієї команди можна призначити власний стиль елементам кожного тимчасового відрізка: :past для обробленого елемента, :current для оброблюваного і т.п.:

<p dir="ltr">p:current {</p>
<p dir="ltr">background: yellow;</p>
<p dir="ltr">}</p>

Псевдоклас інтерфейсу користувача

Крім вже відомих ¦:enabled, :disabled або :checked у 4 специфікації з’явився новий псевдоклас :indeterminate, призначений для елементів, що мають невизначений статус. Таким чином, можна створювати стиль для тих елементів, які ще не були використані:

<p dir="ltr">input.checkbox:indeterminate {</p>
<p dir="ltr">background: #ccc;</p>
<p dir="ltr">}</p>

Псевдокласи структури дерева: :nth-match, :nth-last-match

Псевдоклас :nth-match поєднує можливості :nth-child та :matches.

Наприклад, у вас є список посилань, деяким з яких надано активний клас, і ви хочете виділити лише парні активні посилання. Якщо використовувати :nth-child(even), ви зможете вибрати усі парні посилання зі списку, але не зможете обмежитись лише активними. Якщо ж застосувати: matches (. active), результатом стане виділення всіх активних елементів, що теж не є вашою метою. Завдяки :nth-match, ви зможете за допомогою всього 1 команди виділити парні активні посилання зі списку:

<p dir="ltr">li a:nth-match(even of .active) {</p>
<p dir="ltr">color: red;</p>
<p dir="ltr">}</p>

:nth-last-match працює за таким самим принципом, але починає виділення з кінця DOM-структури.

Псевдокласи структури сітки: :column, :nth-column, :nth-last-column

Html-таблиці орієнтовані на роботу з рядками: створити таблицю для роботи з колонками можна, але одночасно працювати з рядками і колонками не вдасться. Нові псевдокласи дозволяють створювати стиль клітини на основі її приналежності до колонки, а не до рядка:

<p dir="ltr">:column(.total) {</p>
<p dir="ltr">background: red;</p>
<p dir="ltr">}</p>
<p dir="ltr">:nth-column(even) {</p>
<p dir="ltr">background: blue;</p>
<p dir="ltr">}</p>

Втім, :column, :nth-column, :nth-last-column призначені не тільки для роботи з таблицями, але і вертикально орієнтованими шаблонами.

Parent selector

Довгоочікуваний багатофункціональний селектор, що дозволяє працювати з елементами, не використовуючи звичні селектори і створювати стиль для всього списку.

Таким чином, специфікація селекторів 4 рівня пропонує багато цікавих рішень. Залишається лише дочекатися того часу, коли вони будуть реалізовані у браузерах.