sibling-index() — герой анимаций завтрашнего дня

11.12.2025 • css

Типичные анимации

Даже 10 лет назад типичные демки, которые можно было найти на просторах интернета со всевозможными анимациями и эффектами, в 50% случаев состояли из большого числа элементов, циклов SASS или просто использовали :nth-child(). Они использовались для задания уникальной позиции для каждого элемента, поворота, задержки анимации. Да и в своей практике я встречал подобное не один раз.

В современном CSS всё ещё нет циклов из SASS, а простыни :nth-child() писать не очень хочется:

.particle {
    left: calc(var(--index) * 20px);
}
 
.particle:nth-child(1) {
    --index: 1;
}
.particle:nth-child(2) {
    --index: 2;
}
...

Если посмотреть на фичи из SASS, которые как-либо закрыты в CSS, то от SASS почти ничего не останется. Единственная жирная фича, которой мне до сих пор не хватало — именно циклы! Я думаю, многие авторы демок до сих пор могут использовать SASS именно из-за циклов.

sibling-index() выходит на сцену

И в 2025м году появляется новое предложение в спеке — sibling-index() и sibling-count().

.particle {
    left: calc(sibling-index() * 20px);
}

Вот так просто. Это, конечно, не полноценная замена циклам, но на большую часть случаев этого хватит. И конструкция получается максимально простая!

Особенности

sibling-index() возвращает integer. Это разительно отличается от counter(), который можно было бы использовать для подобной цели, но он возвращает string и не заработает в таком выражении.

Сейчас есть предложение в спеку для добавления функций конвертации типов в CSS, но даже с ними sibling-index() выглядит куда нагляднее и короче.

А нумерация начинается с 1, не с 0.

Что по браузерам?

Сейчас sibling-index() и sibling-count() есть в стабильном хроме, начиная с 138й версии.

Также реализация подъехала в будущий Safari 26.2.

Остаётся дело только за Файерфоксом. Очень ждём. И ждём достаточно свежие браузеры у пользователей, конечно же)

Обсудить в Telegram