Веселощі з CSS лічильниками

27 липня 2015 12:50 Q-Bart 1197 5

CSS лічильники – це одна з тих цікавих можливостей про, які аж хочеться сказати: «Ого, не знав, що на CSS можна таке зробити». Простіше кажучи, вони дозволяють вам рахувати елементи по-порядку – без JavaScript.

Базовий лічильник

Ось це – простий приклад пагінації сторінки:

Цифри, які ви бачите, не прописані в HTML. Вони генеруються, за допомогою CSS:

body {
    counter-reset: pages; /* ініціалізація лічильника */
}
a {
    counter-increment: pages; /* збільшення лічильника */
}
a::before {
    content: counter(pages); /* відображення лічильника */
}

Властивості лічильника застосовуються по мірі того, як зустрічається відповідний елемент(в даному випадку a) в документі. Спершу зустрічається елемент body – відбувається ініціалізація лічильника(pages). Тоді зустрічаються a елементи – кожен один збільшується і виводиться.

Множинні лічильники

Можна використовувати кілька лічильників, застосовуючи унікальні назви для них. Цей приклад демонструє два різних лічильники: sections та boxes.

Відповідний CSS:

body {
    counter-reset: sections boxes;
}
section {
    counter-increment: sections;
}
section::before {
    content: 'Section ' counter(sections);
}
.box {
    counter-increment: boxes;
}
.box::before {
    content: counter(boxes, upper-roman);
}

Тут ви можете побачити синтаксис для ініціалізації двох лічильників в одному рядку(2). І для того, щоб виглядало особливо стильно, лічильник для boxes виводиться у вигляді римських цифр(upper-roman - рядок 18). Повний список варіантів відображення лічильника є такий самий, як і list-style-type (детальніше)

Підрахунок вибраних елементів

Зараз ми підійшли до найцікавішого. Властивості лічильника можуть міститися у псевдо-елементі, наприклад :checked. Це дозволяє лічильникам реагувати на вибір користувача через прапорці. Приклад, що показує кількість елементів, вибраних користувачем:

Цей CSS майже не відрізняється від наших попередніх прикладів. Єдиною відмінністю є збільшення лічильника в псевдо-елементі (input:checked) і відображення лічильника у виділеному для цього елементі( .total )

body {
    counter-reset: characters;
}
input:checked {
    counter-increment: characters;
}
.total::after {
    content: counter(characters);
}

Контроль збільшення лічильника

Лічильники можуть збільшуватися не лише на одну одиницю, вони можуть додавати будь-яке ціле число. Більше того, вони можуть зменшуватися на ціле від’ємне число. Ґрунтуючись на нашому попередньому прикладі, цей – встановлює окреме значення для збільшення для кожного одного елемента.

Синтаксис достатньо простий:

body {
    counter-reset: sum;
}
#a:checked { counter-increment: sum 64; }
#b:checked { counter-increment: sum 16; }
#c:checked { counter-increment: sum -32; }
#d:checked { counter-increment: sum 128; }
#e:checked { counter-increment: sum 4; }
#f:checked { counter-increment: sum -8; }
.sum::before {
    content: '= ' counter(sum);
}

Коли ми ініціалізуємо лічильник, ми можемо додати йому початкове значення:

body {
    counter-reset: kittens 41; /* початкове значення 41 */
}

Обережно, не попадіться!

Мабуть ви помітили, в двох останніх прикладах ми використовуємо <input type="checkbox" > для можливості вибору певних елементів. Проте прапорців немає – вони приховані:

input {
    position: absolute;
    left: -9999px;
}

Якщо ж ви будете використовувати display: none, то підрахунок вибраних елементів не буде працювати (детальніше тут)

Заключне слово

Браузери підтримують CSS лічильники чудово. Зелене світло на всіх напрямках :).

Звісно CSS лічильники красиві, але не забувайте про старих друзів <ol> та <li>. Вони й досі чудово підходять для нумерованого списку. В більш хитрих ситуація можна отримати користь з CSS лічильників.

Я повинен згадати про доступність. CSS лічильники залежать від згенерованого вмісту у псевдо-елементах. Деякі читачі екрану(screen reader) розпізнають контент, деякі – ні. Тож краще не покладатись на псевдо-елементи для важливих даних.

Джерело перекладу

1197 9

Схожі матеріали:

Коментарі:

mike.bond

28 Лип 2015 13:30

Дійсно.І не підозрював, що таке можно зробити на CSS...

mike.bond

30 Лип 2015 12:43

можна*, пардон

karmeljuk

29 Лип 2015 11:34

Дякую, дуже цікаво

Костя Третяк

10 Сер 2015 01:42
Цей коментар прихований автором

Костя Третяк

10 Сер 2015 01:45

Замість

input {
position: absolute;
left: -9999px;
}
Можна використовувати

input {
position: absolute;
visibility: hidden;
}
І все працюватиме

Авторизуйтесь, щоб залишити коментар.