Меня зовут София. Я - CSS инженер. Это мой блог.

Если вам очень больно без стилей, вы можете их.

.

Самонаследуемость счетчиков и как ее использовать

Дисклеймер: Счётчики описаны в спецификации css-lists-3. Здесь я расскажу об их "самонаcледуемости". Первую статью с основной теорией про счетчики можно прочитать здесь.

Счетчики в css являются "самонаследуемыми".

Что это такое?

Как можно узнать из предыдущей статьи про счетчики, каждый элемент наследует от родителя набор счетчиков, который дополняет своими и передает для наследования дальше вниз по дереву.

Создание на элементе счетчика с таким же именем, как у одного из наследованных, создаст не самостоятельный новый счетчик, а вложенный в наследованный.

Такие вложенные счетчики отличаются от обычных только тем, что могут быть полученные все вместе, одним списком, с помощью функции counters(), которая отдает значения всех счетчики с заданным именем. Тогда как обычная функция counter() извлекает только самый внутренний счетчик с таким именем.

Таким образом, область действия счетчика начинается с первого элемента в документе, который создает экземпляр этого счетчика, и включает в себя детей этого элемента.

Как это использовать?

Использую самонаследуемость счетчиком можно сделать нумерацию большого списка со сложной вложенностью, используя всего один счетчик!

<ul>
    <li></li>
    <li>
        <ul>
            <li></li>
            <li></li>
        </ul>
    </li>
</ul>

<style>
    ul {
        counter-reset: n;
    }

    li {
        counter-increment: n;
    }

    li::before {
        content: counters(n, '.');
    }
</style>

В демо список немного расширен список для наглядности относительно кода сверху и выглядит это так:

Как это работает?

На каждом элементе ul создается счетчик с именем n. Но на внутренних элементах ul он создается не самостоятельный, а вложенный в наследованный от родителя счетчик с таким же именем. Поэтом можно достать их всех разом с помощью функции counters() на элементе списка. Второй необязательный параметр этой функции – строка-разделитель для отображения списка счетчиков. Работает так же, как аргумент функции Array.prototype.join() в JavaScript.

Источники