Структурні псевдокласи CSS

552

Від автора: досі ми вчилися знаходити елементи по їх атрибутам і станів. У CSS3 також можна шукати елементи просто по їх положенню в розмітці. Ці селектори носять назву структурні псевдокласи CSS.

Може бути, це звучить заплутано, але все стане зрозумілим, коли ми розглянемо способи їх застосування. Ці селектори підтримуються в IE9 і вище, а також в останніх і більш старих версіях всіх інших браузерів за винятком IE8 і нижче:

:root — Кореневий елемент – в HTML-файлах це html.

E:nth-child(n) — Елемент E, який є n-вим дочірнім елементом батьків. Параметр n пояснюється в замітці нижче.

E:nth-last-child(n) — Елемент F, є n-вим дочірнім елементом батьків E при відліку із зворотного боку.

li:nth-last-child(1) – останній елемент списку, то ж саме що і li:last-child. (див. примітку нижче)

E:nth-of-type(n) — N-ий елемент даного типу всередині батьків. Різниця між :nth-child :nth-of-type пояснюється в замітці нижче.

E:nth-last-of-type(n) — Як nth-of-type(n), тільки відлік йде з останнього елемента всередині батьків.

Примітка: параметри структурних селекторів

Існує 4 псевдокласу, які в якості параметра приймають вираз an+b, odd або even. До структурних псевдоклассам відносяться :nth-child(an + b), :nth-last-child(an + b), :nth-of-type(an + b): nth-last-of-type(an + b). У виразі an+b символ a є цілим множником, b – цілий зрушення, n – змінна.

У найпростішому випадку всередину можна передати ціле число. Наприклад, E:nth-of-type(3) знайде третій E всередині одного з батьків. Можна передати одне або два ключових слова odd або even. Також можна передавати вирази типу E:nth-of-type(3n+1). 3n – кожен третій елемент (частота), +1 – зрушення. Зсув за замовчуванням дорівнює 0. Тобто :nth-of-type(3n) знайде 3-й, 6-й і 9-й елементи, а :nth-of-type(3n+1) знайде 1-й, 4-й і 7-й елементи і т. д.

Можна передавати негативні зрушення. В основі CSS лежить лінгвістичний мову, не програмний, тому відлік починається з 1, а не з 0. Між множником та змінної a n не повинно бути пробілів, зрушення йде останнім.

З допомогою цих числових псевдокласів можна визначити елементи, не додаючи до них класи. Найпоширеніший приклад – таблиця, в якій кожна наступна рядок злегка темніше, щоб було зручно читати. Раніше для цього потрібно було використовувати odd і even на тезі tr. Зараз можна просто застосувати tr:nth-of-type(odd) для вибору всіх непарних рядків і не чіпати розмітку. Можна піти ще далі і прикрасити таблицю трьома кольорами: беремо tr:nth-of-type(3n), tr:nth-of-type(3n+1) і tr:nth-of-type(3n+2) і застосовуємо різні кольори.

E:first-child — Елемент E, якщо E – перша дитина всередині батьків. Те ж саме що E:nth-child(1).

E:last-child — Елемент E, якщо E – останній дитина всередині батьків. Те ж саме що E:nth-last-child(1).

:first-of-type — Те ж що і :nth-of-type(1).

E:last-of-type — Те ж що і :nth-last-of-type(1).

E:only child — Елемент E, якщо E – єдина дитина всередині батьків.

E:only-of-type — Елемент E, якщо E – єдиний елемент типу E, який є прямим дитиною від батьків.

Замітка: child або type

Працюючи зі структурними селекторами nth-of-type і nth-child, важливо зрозуміти, що таке child і type. Child шукає всі дочірні елементи, які підпадають під вираження, а також перевіряє попередній елемент на збіг. Type шукає всі елементи, що збігаються спочатку з першою частиною селектора, після чого перевіряється вираз.

На прикладі p:nth-child(3n) браузер шукає кожен третій дочірній елемент батьків. Якщо дочірній елемент p, то збіг є, якщо ні – збігу немає. У випадку з p:nth-of-type(3n) браузер шукає всі дочірні теги p батьків, після чого знаходить кожен третій p.

Структурні псевдокласи засновані на батьків і скидають рахунок для нових батьків. Вони дивляться тільки на прямих нащадків. Текстові вузли не входять у вираз.

E:empty — Елемент без нащадків. Це можуть бути текстові вузли.

hello

і

не підійдуть під p:empty, а

і

підійдуть. Цей селектор також знаходить порожні елементи типу
і . В CSS Selectors Level 4 з’явиться p:blank, який буде знаходити

.

E:lang(en) — Елемент мови, позначений двома літерами, наприклад, en. На відміну від E:[lang|=en], де повинен бути атрибут lang, селектор E:lang(en) знайде E, якщо мова був оголошений на самому елементі або будь батька.

E:not(exception) — Дуже корисний селектор: знаходить елементи, які не підпадають під селектор в дужках.

Селектори з псевдоклассом :not знаходять все, що зліва від двокрапки і віднімають елементи праворуч від двокрапки. Спершу елементи знаходяться по лівій частині селектора. Наприклад, p:not(.copyright) знайде всі параграфи в документі і тільки потім прибере з них параграфи з класом copyright. Можна зчепити кілька псевдокласів :not. input:not([type=checkbox]):not([type=radio]) знайде всі теги inpu
t на сторінці за винятком типів checkbox і radio.