Back

Изучаем CSS-функцию random()

Изучаем CSS-функцию random()

CSS всегда полагался на JavaScript, когда требовалась случайность — разброс позиций, вариативные задержки анимации, непредсказуемые цветовые сдвиги. Эта зависимость может скоро уменьшиться. CSS-функция random(), часть спецификации CSS Values and Units Module Level 5, позволяет таблицам стилей генерировать случайные числовые значения напрямую, без необходимости в скриптах.

Это экспериментальная функция. Поддержка браузерами ограничена. Но её стоит понять уже сейчас.

Ключевые моменты

  • CSS-функция random() генерирует случайные числовые значения нативно в таблицах стилей, устраняя необходимость в JavaScript во многих сценариях визуальной случайности.
  • Синтаксис принимает минимальное, максимальное и опциональное значение шага — все аргументы должны использовать один и тот же тип единиц измерения.
  • Система кэширования контролирует, будут ли случайные значения общими для совпадающих элементов, уникальными для каждого элемента или общими для конкретных свойств, давая вам детальный контроль над распределением случайности.
  • Поддержка браузерами в настоящее время ограничена, стабильная поддержка теперь доступна в Safari 26.2. Всегда предусматривайте запасные варианты с помощью @supports.

Что на самом деле делает CSS-функция random()

Основная идея проста: вы определяете минимальное значение, максимальное значение и опционально шаг приращения. CSS выбирает число из этого диапазона и применяет его.

.card {
  top: random(5rem, 20rem);        /* любое значение между 5rem и 20rem */
  rotate: random(0deg, 360deg);    /* случайный поворот */
  animation-delay: random(0s, 3s); /* ступенчатое время анимации */
}

Вот и всё. Никакого Math.random(), никаких инлайн-стилей, никаких JavaScript-циклов, генерирующих сотни правил :nth-child().

Одно важное ограничение: все аргументы должны использовать один и тот же тип единиц измерения. Нельзя смешивать rem с px или % с em. Выберите единицу измерения и придерживайтесь её.

Синтаксис

random(<caching-options>?, <min>, <max>, [by <step>]?)

Текущий черновик спецификации определяет функцию более формально, но эта упрощённая форма — самый простой способ понять её на практике.

Параметр by управляет шагом. Без него вы можете получить десятичные значения вроде 13.47px. С ним вы ограничиваете вывод предсказуемой последовательностью:

/* Возможные значения: 10px, 20px, 30px, 40px, 50px */
padding: random(10px, 50px, by 10px);

Примечание: максимальное значение не всегда достижимо при использовании шагов. random(100px, 200px, by 30px) может выдать только 100px, 130px, 160px или 190px — никогда 200px.

Управление тем, как распределяется случайность

Здесь CSS-функция random() становится по-настоящему интересной. По умолчанию каждый экземпляр random() в таблице стилей разрешается в одно кэшированное значение, общее для всех элементов, использующих этот стиль.

Чтобы дать каждому элементу своё уникальное значение, используйте ключевое слово per-element или идентификатор с дефисом:

/* Каждый элемент получает своё случайное значение */
.item {
  top: random(per-element, 2rem, 15rem);
}

/* Оба свойства используют одно и то же значение внутри одного элемента */
.box {
  width: random(--size, 100px, 200px);
  height: random(--size, 100px, 200px); /* совпадает с width */
}

/* Все совпадающие элементы используют одно и то же именованное значение глобально */
.badge {
  width: random(--element-shared, 50px, 150px);
}

Ключевое слово per-element — это встроенная опция кэширования, которая указывает браузеру разрешить отдельное случайное значение для каждого элемента, соответствующего селектору. Идентификатор с дефисом вроде --size связывает несколько вызовов random() вместе, чтобы они разрешались в одно и то же значение внутри данного элемента — полезно, когда вы хотите квадрат со случайной, но согласованной шириной и высотой. Идентификатор с дефисом вроде --element-shared также может выступать в качестве именованного ключа кэша для совпадающих элементов.

Эта система кэширования продумана и хорошо спроектирована — но именно здесь обычно возникает путаница. Понимание её на раннем этапе сэкономит время на отладке позже.

CSS random() против SCSS random()

Если вы использовали random() в Sass, поведение отличается в нескольких ключевых аспектах:

ХарактеристикаCSS random()SCSS random()
Когда выполняетсяПри загрузке страницыВо время компиляции
Диапазон min/maxОба определеныТолько max (начинается с 1)
Поддержка шагаДа (by)Нет
Обновляется при перезагрузкеДаНет

CSS random() генерирует новое значение при каждой загрузке страницы. SCSS фиксирует значение во время сборки. Они служат разным целям.

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

По состоянию на начало 2026 года random() в CSS поставляется в Safari 26.2. Более широкая кросс-браузерная поддержка пока не гарантирована, поэтому вам всё ещё следует рассматривать это как экспериментальную функцию и использовать @supports для прогрессивного улучшения с разумным запасным вариантом:

.element {
  top: 10rem; /* запасной вариант */
}

@supports (top: random(1rem, 5rem)) {
  .element {
    top: random(5rem, 20rem);
  }
}

Рабочая группа CSS приняла эту функцию в 2022 году, и спецификация продолжает развиваться. Остаются открытые вопросы, и окончательный синтаксис может ещё измениться до широкой реализации.

Заключение

CSS-функция random() не заменит JavaScript для случайности, управляемой логикой, или чего-либо, требующего криптографической непредсказуемости. Но для чисто визуальных вариаций — разбросанных макетов, органичного тайминга анимации, генеративных фонов — это чистое, декларативное решение, которому место в таблице стилей.

Попробуйте её в Safari 26.2, держите запасные варианты на месте и следите за развитием спецификации. Разрыв между экспериментальным и широко доступным сокращается.

Часто задаваемые вопросы

Не надёжно для всех браузеров. По состоянию на начало 2026 года Safari 26.2 поставляется с этой функцией, но более широкая кросс-браузерная поддержка всё ещё ограничена. Вы можете экспериментировать с ней сейчас, но любое использование в продакшене должно включать надёжное запасное значение и проверку @supports, чтобы избежать сломанных макетов в неподдерживаемых браузерах.

Функция будет недействительной, и декларация будет проигнорирована браузером. Все аргументы, переданные в random(), включая min, max и опциональное значение шага, должны использовать один и тот же тип единиц измерения. Нельзя комбинировать rem с px или проценты с em. Выберите одну единицу измерения и используйте её последовательно во всех параметрах.

По умолчанию экземпляр random() разрешается в кэшированное значение, общее для всех элементов, использующих этот стиль. Чтобы получить уникальное значение для каждого элемента, используйте ключевое слово per-element. Чтобы разделить значение между конкретными свойствами, используйте идентификатор с дефисом вроде --size. Понимание кэширования критически важно для получения ожидаемой визуальной вариативности.

Да. В отличие от SCSS random(), которая фиксирует значение во время компиляции и встраивает его в выходной CSS, нативная CSS-функция random() разрешает свежее значение при каждой загрузке страницы. Это делает её подходящей для создания визуального разнообразия, которое меняется между посещениями без какого-либо участия JavaScript.

Complete picture for complete understanding

Capture every clue your frontend is leaving so you can instantly get to the root cause of any issue with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data.

Check our GitHub repo and join the thousands of developers in our community.

OpenReplay