Начинаем работать с CSS-счётчиками

Самуэль Олорунтоба

Оригинал: scotch.io/tutorials/getting-started-with-css-counters
Перевод: Влад Мержевич

Для веб-разработчиков правильное представление информации стоит на первом месте. Одним из способов соответственного отображения информации — обозначить иерархию, отвечая на вопрос «что идёт первым?».

Верный путь для обозначения иерархии — через нумерацию объектов. Кроме нумерованного списка в CSS нет другого элемента, который позволяет нам увеличивать порядок. Если бы мы хотели отобразить числа, то должны были сделать некоторую подготовку. Слежение за индексом, его автоинкремент и др. Что-то вроде этого.

PHP

<ul class="numbered-list">
  <?php for ($i = 1; $i <= $posts->total_count; $i++): ?>
  <li class="numbered-list__item">
  <span class="numbered-list__counter">
  <?php echo $i ?>
  </span>
  <!-- Остальная разметка -->
  </li>
  <?php endfor ?>
</ul>

Это хорошо до определённой степени, но здесь имеются свои ограничения. Что, если мы хотим использовать буквы, римские цифры, греческие символы и др. Реализация чего-либо потребует использования пользовательских библиотек.

К счастью, в CSS мы можем реализовать подобные вещи, не прилагая особых усилий.

Сброс и инкремент счётчика

Прежде чем делать счётчики на CSS, вы должны знать, что счётчик включает в себя две вещи: сброс и инкремент. Сброс — это то, где мы сбрасываем счётчик или даём ему начальную точку. Инкремент фактически увеличивает счётчик. Давайте быстро набросаем нашу разметку.

Всё, что нам нужно — это базовая, но простая для понимания разметка. В нашем CSS-файле нужно определить сброс и инкремент.

HTML

<ul class="numbered-list">
  <li class="numbered-list__item">
  <span class="numbered-list__counter"></span>
  <span class="numbered-list__text">Minion ipsum</span>
  </li>
</ul>

Установим <li class="numbered-list"></li> в качестве точки сброса. Для этого мы просто делаем следующее.

CSS

.numbered-list {
  counter-reset: counter-name;
}

Замечание: counter-name может быть произвольным.

Поскольку мы установили нашу точку сброса, то должны сообщить <span class="numbered-list__counter"></ span> увеличивать его значение. Для этого мы используем следующее.

CSS

.numbered-list__counter {
  counter-increment: counter-name;
}

Обращаясь к указанной выше точке сброса, мы говорим счётчику через counter-increment начинать считать. В таком виде наш пример пока не работает.

Поскольку счётчик является генерируемым контентом, вроде :before и :after, нам нужно вставлять счётчики с помощью свойства content в :after, либо в :before. Кроме того, CSS-функция counter позволяет идеально сбросить значение счётчика.

CSS

.numbered-list__counter:before {
  counter-increment: counter-name;
  content: counter(counter-name);
}

Примечание. Я опустил стиль содержимого, чтобы свести наш CSS к минимуму.

Смещение индекса инкремента

counter-increment также может принимать положительное или отрицательное значение для изменения шага инкремента.

CSS

counter-increment: counter-name 2;
/* counter-increment: counter-name +2; */

Это увеличит инкремент на множитель 2. Чтобы поменять инкремент на обратный, вы можете использовать отрицательное значение, что уменьшит значение индекса на указанный множитель.

CSS

counter-increment: counter-name -2;

Изменение начальной точки счётчика

Передача целого числа после объявления counter-reset говорит браузеру изменить смещение начального значения.

CSS

.numbered-list {
  counter-reset: counter-name 2;
}

Задав значение равным 2, мы начинаем счётчик с 3, вроде этого. Вы также должны знать, что значение counter-reset по умолчанию равно 0.

Обратная нумерация

Обратная нумерация использует отрицательный индекс для counter-increment. Но это также может привести к сложностям, потому что если список генерируется динамически, пользователь должен найти способ отслеживать индекс.

Сам видел, что люди делают нечто вроде этого.

PHP

<ul class="numbered-list" style="counter-reset: name {{{PHP1}}};">
  <?php for ($i = 1; $i <= $posts->total_count; $i++): ?>
  <li class="numbered-list__item">
  <span class="numbered-list__counter">
  <?php echo $i ?>
  </span>
  <!-- Остальная разметка -->
  </li>
  <?php endfor ?>
</ul>

Счётчик сбрасывается строчно через генерацию в PHP значения counter-reset. В CSS-файле мы можем затем установить отрицательное значение для counter-increment.

Использование других форматов

Кроме увеличения счётчика с числами, мы можем также использовать инкремент с буквами, греческими символами, римскими цифрами и др.

Если вы являетесь поклонником римских цифр (как я), то для использования римских цифр всё, что вам нужно сделать, это просто передать второй параметр (lower-roman) в функцию counter.

CSS

content: content(counter-name, lower-roman);

Другие варианты включают: decimal, decimal-leading-zero, lower-roman, upper-roman, lower-greek, lower-latin, upper-latin, armenian, georgian, lower-alpha, upper-alpha.

Поддержка браузерами

Как говорится, «одна картинка стоит тысячи слов». Этот график от CanIUse иллюстрирует, насколько широко поддерживаются счётчики в CSS. Они хорошо поддерживаются в Internet Explorer и Safari, что говорит о многом. Поэтому вам не стоит беспокоиться об использовании счётчиков, они массово поддерживаются браузерами.

Лично я считаю, что CSS-счётчики — это круто. Некоторым людям подсчёт с помощью CSS кажется непонятным и они продолжают использовать имеющийся у них метод.

Не выкладывайте свой код напрямую в комментариях, он отображается некорректно. Воспользуйтесь сервисом cssdeck.com или jsfiddle.net, сохраните код и в комментариях дайте на него ссылку. Так и результат сразу увидят.