Аккуратно подобранная CSS-тень с настройками эффекта задает визуальную глубину веб-интерфейса и четко отделяет функциональные блоки от подложки без использования растровой графики. Онлайн-генератор помогает визуально настроить параметры затенения и сразу выдает готовый фрагмент кода. Основная задача этого инструмента - сформировать синтаксически корректное CSS-правило на основе заданных геометрических и цветовых характеристик для прямого переноса в каскадные таблицы стилей. Это избавляет разработчика от ручного подбора пиксельных значений и постоянной перезагрузки страницы для проверки результата.
В качестве входных данных используются пространственные координаты смещения по осям, радиусы размытия и растяжения, а также цвет с учетом прозрачности и направление падения тени.
При изменении любого ползунка или числового поля генератор мгновенно пересчитывает значения и обновляет демонстрационный блок в режиме реального времени. Пользователь видит точную форму, плотность и мягкость границ до внедрения стилей в рабочий макет. На выходе формируется готовая строка объявления свойства, полностью совместимая с современными браузерными движками и готовая к копированию в файл стилей проекта.
Синтаксис и базовые параметры CSS-теней
Правила формирования теней у элементов веб-страницы регламентируются спецификацией CSS Backgrounds and Borders Module Level 3. Базовым инструментом для создания затенения вокруг прямоугольных контейнеров выступает свойство
box-shadow
. Оно принимает упорядоченный набор параметров, разделенных пробелами, и завершается точкой с запятой.
box-shadow: [inset] <offset-x> <offset-y> [<blur-radius>] [<spread-radius>] [<color>];
Строгий порядок следования обязателен только для числовых значений длины, тогда как модификатор направления и цвет могут располагаться в начале или в конце объявления без потери валидности правила. Для корректной интерпретации кода браузером важно учитывать статус каждого аргумента в строке:
-
Первые два числовых значения (
<offset-x>и<offset-y>) являются строго обязательными. Без указания этих координат браузерный парсер посчитает правило синтаксически неверным и проигнорирует всю строку. -
Третье и четвертое числовые значения (
<blur-radius>и<spread-radius>) опциональны. Если они опущены в коде, по умолчанию им присваивается нулевое значение. Задать четвертый числовой параметр без предварительного указания третьего невозможно, так как движок считывает размеры строго последовательно. -
Значение
<color>не является обязательным с точки зрения синтаксиса, но настоятельно рекомендуется к явному указанию для предсказуемого отображения в разных браузерах. -
Модификатор
insetуказывается опционально и размещается либо самым первым токеном до числовых координат, либо самым последним - после цвета.
Внешняя и внутренняя тень: роль модификатора inset
По умолчанию свойство
box-shadow
генерирует внешнюю тень (drop shadow). В этом режиме затенение проецируется за пределы внешних границ рамки элемента, создавая визуальное ощущение, что блок приподнят над поверхностью страницы. Сама область внутри контейнера остается незатронутой.
Добавление ключевого слова
inset
в строку объявления переключает рендеринг в режим внутренней тени (inner shadow). Затенение переносится внутрь элемента: оно начинается от внутренних краев рамки (
border
) и распространяется поверх фоновой заливки или фонового изображения, но располагается строго под текстовым и графическим содержимым блока. Такой прием создает эффект вдавленности контейнера в плоскость экрана или имитирует падение света внутрь вырезанного окна.
/* Внешняя тень (поведение по умолчанию) */
.card-elevated {
box-shadow: 4px 4px 10px 0px #000000;
}
/* Внутренняя тень с модификатором inset */
.input-recessed {
box-shadow: inset 4px 4px 10px 0px #000000;
}
Системные ключевые значения
Помимо координатных и цветовых настроек, свойство
box-shadow
принимает глобальные и специфические ключевые слова CSS, которые управляют каскадностью и сбросом стилей:
-
none- исходное значение свойства по умолчанию. Полностью отменяет рендеринг любых теней на элементе. Применяется для удаления затенения при смене состояний интерфейса или при переопределении стилей базовых компонентов. -
inherit- принудительно заставляет элемент унаследовать вычисленное значениеbox-shadowот своего прямого родительского контейнера в дереве документа, хотя по стандарту тени не наследуются. -
initial- возвращает свойство к его спецификационному начальному состоянию, что для теней эквивалентно установке значенияnone. -
unset- комбинированное правило сброса. Поскольку свойство тени не относится к наследуемым характеристикам,unsetсрабатывает аналогичноinitialи полностью убирает эффект.
Разграничение box-shadow, text-shadow и filter: drop-shadow()
В верстке используются три различных механизма создания теней, выбор между которыми зависит от типа целевого объекта и структуры его границ. Применение неподходящего свойства приводит к визуальным артефактам, например, к появлению прямоугольной серой рамки вокруг иконки с прозрачным фоном.
В таблице представлено техническое сравнение трех инструментов формирования теней в CSS:
| Свойство / Функция | Целевой объект применения | Геометрия контура тени | Поддержка spread и inset |
|---|---|---|---|
box-shadow
|
Элементы блочной модели (контейнеры, карточки, кнопки) | Прямоугольная граница блока с учетом скругления углов рамки | Поддерживаются оба параметра |
text-shadow
|
Текстовые узлы и глифы шрифтов | Точный векторный контур каждого отдельного символа | Отсутствуют в спецификации |
filter: drop-shadow()
|
Изображения PNG с прозрачностью, векторная графика SVG, сложные составные блоки | Фактический контур непрозрачных участков (альфа-маска объекта) | Не поддерживаются |
Свойство
box-shadow
работает исключительно с геометрией блочной модели: оно игнорирует прозрачность внутри картинки и всегда рисует тень по внешнему прямоугольному периметру тега. Если требуется отбросить тень непосредственно от букв заголовка, применяется свойство
text-shadow
, которое повторяет очертания шрифта, но не имеет параметра растяжения и не поддерживает внутреннее затенение.
Для работы с непрямоугольной графикой, такой как логотипы в формате PNG без фона или иконки SVG, используется функция CSS-фильтра
filter: drop-shadow()
. Несмотря на схожий синтаксис передачи координат и размытия, этот фильтр анализирует альфа-канал элемента и строит тень строго вокруг видимых пикселей изображения, огибая прозрачные пустоты.
Геометрия тени: смещение, размытие и растяжение
Пространственное положение, размер и резкость границ тени в CSS определяются четырьмя числовыми параметрами типа данных
<length>
. Значения задаются в абсолютных единицах измерения, чаще всего в пикселях (
px
), либо в относительных величинах (
rem
,
em
,
vw
,
vh
), что позволяет масштабировать визуальный эффект пропорционально размеру шрифта или ширине экрана. Исключение составляют проценты (
%
) - спецификация CSS не допускает их использования для геометрических координат тени, так как привязка к габаритам контейнера нарушает равномерность отрисовки по разным осям.
Математика построения тени базируется на имитации направленного источника света (
light source
) в двумерной декартовой системе координат браузера, где точка отсчета
(0, 0)
находится в верхнем левом углу элемента. Вся геометрия начинается с создания невидимого дубликата рамки блока (маски тени), который последовательно трансформируется под действием заданных параметров перед финальной отрисовкой.
Координаты смещения по осям X и Y
Первые два обязательных значения -
offset-x
(или
x-offset
) и
offset-y
(или
y-offset
) - задают вектор сдвига маски тени относительно исходного элемента. Направление этого сдвига всегда прямо противоположно положению предполагаемого источника света.
Параметр горизонтального смещения
offset-x
управляет движением по оси абсцисс. Положительные значения сдвигают тень вправо от элемента (источник света расположен слева), а отрицательные - переместят ее влево (свет падает справа). При значении
0
горизонтальный сдвиг отсутствует, и тень располагается симметрично по ширине блока.
Параметр вертикального смещения
offset-y
отвечает за ось ординат, которая в веб-разработке направлена сверху вниз. Положительные значения опускают тень вниз под элемент, имитируя естественное верхнее освещение. Отрицательные числа сдвигают тень вверх над блоком, создавая эффект подсветки снизу.
Взаимосвязь между положением условного источника света и знаками координат смещения для внешней тени подчиняется строгой пространственной логике:
| Положение источника света | Значение offset-x | Значение offset-y | Направление падения тени | Пример CSS-кода |
|---|---|---|---|---|
| Сверху слева (стандартное освещение интерфейса) |
Положительное (
> 0
)
|
Положительное (
> 0
)
|
Вниз и вправо |
box-shadow: 8px 10px 15px black;
|
| Сверху по центру (зенитный свет) |
Нулевое (
0
)
|
Положительное (
> 0
)
|
Строго вниз |
box-shadow: 0 12px 20px black;
|
| Сверху справа |
Отрицательное (
< 0
)
|
Положительное (
> 0
)
|
Вниз и влево |
box-shadow: -8px 10px 15px black;
|
| Снизу слева |
Положительное (
> 0
)
|
Отрицательное (
< 0
)
|
Вверх и вправо |
box-shadow: 6px -6px 12px black;
|
| Прямо над элементом (фронтальный свет) |
Нулевое (
0
)
|
Нулевое (
0
)
|
Равномерно вокруг всего периметра |
box-shadow: 0 0 16px black;
|
Радиус размытия (blur-radius)
Третий числовой параметр -
blur-radius
- является необязательным и определяет степень мягкости краев тени. Если значение не указано в коде, оно по умолчанию принимается равным
0
. При нулевом радиусе размытия градиентный переход не формируется: тень рендерится с абсолютно резким, четким контуром, в точности повторяющим форму родительского блока. Отрицательные значения (например,
-5px
) для
blur-radius
невалидны с точки зрения математики растровой графики - при обнаружении минуса перед этим параметром браузер проигнорирует все правило целиком.
Алгоритм работы размытия основан на применении фильтра Гаусса к краям базовой маски тени. Важная геометрическая деталь заключается в том, что зона размытия распределяется поровну в обе стороны от исходной границы тени - наполовину внутрь контура и наполовину наружу:
-
При значении
blur-radius: 20pxобщая ширина зоны плавного затухания цвета составит20px. -
Граница перехода начнется на расстоянии
10pxвнутри базового периметра тени (уменьшая площадь полностью закрашенного ядра) и закончится на расстоянии10pxснаружи от него, где непрозрачность пикселей упадет до нуля. -
Чем выше значение
blur-radiusпри неизменных координатах смещения, тем дальше объект визуально отрывается от фоновой плоскости по оси Z и тем более рассеянным воспринимается освещение.
Радиус распространения (spread-radius)
Четвертый пространственный параметр -
spread-radius
(растяжение или сжатие) - изменяет физические габариты базовой маски тени еще до того, как к ее краям будет применен алгоритм размытия. По умолчанию этот параметр равен
0
, что означает полное совпадение начальных размеров тени с размерами самого HTML-элемента.
В отличие от размытия, радиус распространения принимает как положительные, так и отрицательные значения, напрямую прибавляя или вычитая указанную величину с каждой из четырех сторон прямоугольника. Если ширина и высота исходного контейнера составляют
W
и
H
, то фактические размеры жесткого ядра тени до размытия вычисляются как
W + 2 × spread-radius
по горизонтали и
H + 2 × spread-radius
по вертикали.
/* Расширение контура тени на 6px с каждой стороны (общий прирост ширины и высоты +12px) */
box-shadow: 0 0 0 6px black;
/* Направленная тень с уменьшением базовой ширины и высоты на 20px за счет сжатия -10px */
box-shadow: 0 20px 25px -10px black;
Положительный
spread-radius
равномерно расширяет периметр тени во все стороны. Если при этом установить нулевые смещения и нулевое размытие (как в первом примере кода выше), тень превращается в сплошную геометрическую рамку вокруг элемента, которая визуально дублирует свойство
border
, но не увеличивает физические габариты блока в потоке документа.
Отрицательный
spread-radius
сжимает маску тени, делая ее меньше размеров исходного блока. Такое сочетание параметров востребовано при проектировании карточек и выпадающих списков: если задать вертикальное смещение вниз
20px
, размытие
25px
и отрицательное растяжение
-10px
, размытые края перестанут выступать по бокам и сверху контейнера. Тень сфокусируется исключительно под нижней гранью элемента, создавая направленный эффект нависания над поверхностью страницы без лишнего визуального шума по боковому периметру.
Цветовые модели, прозрачность и контрастность
Помимо пространственных координат, реалистичность и визуальная чистота эффекта зависят от параметра цвета (Shadow Color). В CSS-правиле цветовое значение обычно указывается последним аргументом после геометрических отступов и радиусов, хотя спецификация допускает его размещение и в самом начале объявления до числовых параметров. Выбор формата записи цвета напрямую влияет на то, как тень будет взаимодействовать с фоном страницы и адаптироваться под различные цветовые схемы интерфейса.
Форматы записи цвета в CSS-коде
Для задания оттенка и плотности тени в таблицах стилей применяются несколько стандартных цветовых нотаций, каждая из которых решает свои задачи при верстке и поддержке дизайн-систем. Ниже приведено сравнение синтаксиса и особенностей используемых форматов записи цвета.
| Формат записи | Пример синтаксиса в box-shadow | Управление прозрачностью | Особенности применения |
|---|---|---|---|
| HEX |
0 10px 15px #1e293b33
|
Через 2 дополнительных символа в 8-значном коде (или 1 символ в 4-значном) | Компактная запись для статичных палитр, но неудобна для чтения и ручной корректировки процента непрозрачности в коде |
rgb()
/
rgba()
|
0 10px 15px rgba(30, 41, 59, 0.2)
|
Четвертый аргумент (от
0
до
1
) или запись через косую черту в современном синтаксисе
rgb(30 41 59 / 20%)
|
Классический формат для точного задания каналов красного, зеленого и синего спектра с наглядным контролем альфа-канала |
hsl()
/
hsla()
|
0 10px 15px hsla(217, 33%, 17%, 0.2)
|
Четвертый аргумент (от
0
до
1
) или через косую черту
hsl(217 33% 17% / 20%)
|
Удобен для подбора цветных теней в тон окружению за счет раздельного управления цветовым тоном (Hue), насыщенностью (Saturation) и светлотой (Lightness) |
| OKLCH |
0 10px 15px oklch(27% 0.04 260 / 20%)
|
Задается после косой черты в долях единицы или процентах | Перцептивно равномерное цветовое пространство, обеспечивающее предсказуемую визуальную яркость и контрастность при смене оттенка |
Шестнадцатеричный код HEX традиционно используется при переносе плоских значений из графических редакторов. Однако для теней базовый 6-значный формат (например,
#cbd5e1
) подходит плохо, так как формирует полностью непрозрачную заливку. Добавление двух шестнадцатеричных символов в конец строки (например,
33
для 20% непрозрачности) решает проблему, но требует перевода десятичных процентов в шестнадцатеричную систему счисления.
Функциональные нотации
rgb()
и
rgba()
стали отраслевым стандартом для генерации теней благодаря прямому доступу к альфа-каналу. В актуальном стандарте CSS Color Module Level 4 суффикс
a
больше не является обязательным: функция
rgb()
принимает пробелы вместо запятых и отделяет прозрачность косой чертой. Аналогичное правило действует для
hsl()
и
hsla()
. Переход к современному пространству OKLCH устраняет главную проблему старых моделей - неравномерное восприятие яркости человеческим глазом. В OKLCH изменение цветового угла (Hue) при фиксированной светлоте (Lightness) не делает тень визуально темнее или светлее, что упрощает создание согласованных цветных подложек.
Роль альфа-канала и отказ от глухих серых оттенков
Распространенная ошибка при настройке теней - использование сплошного серого цвета в формате HEX (например,
#cccccc
) вместо черного или темно-синего оттенка с высокой степенью прозрачности. На чисто белом фоне оба варианта могут выглядеть идентично, но при перемещении элемента на цветную, градиентную или текстурированную подложку разница становится очевидной.
/* Неправильно: глухой серый цвет создает эффект грязного пятна на цветном фоне */
box-shadow: 0 12px 24px #d1d5db;
/* Правильно: полупрозрачный цвет с альфа-каналом плавно смешивается с любой подложкой */
box-shadow: 0 12px 24px rgba(15, 23, 42, 0.12);
Непрозрачная серая тень перекрывает пиксели родительского контейнера, образуя вокруг карточки неестественный светлый или мутный ореол. Использование альфа-канала (alpha transparency) переводит рендеринг в режим наложения: браузер вычисляет итоговый цвет каждого пикселя, смешивая тон тени с цветом нижележащего фона. В результате тень лишь слегка затемняет подложку, сохраняя ее исходный оттенок и насыщенность.
Для достижения максимальной естественности вместо чистого черного цвета (
rgba(0, 0, 0, ...)
) часто выбирают глубокий холодный или теплый оттенок, гармонирующий с основной палитрой сайта. Добавление небольшой доли синего в тень на светлом фоне имитирует рассеянное освещение, делая интерфейс визуально чище.
Специальные ключевые слова currentColor и transparent
В ситуациях, когда цвет тени должен динамически зависеть от контекста компонента или состояния интерфейса, вместо жестко заданных цветовых кодов применяются системные ключевые слова CSS:
-
currentColor- встроенная переменная, которая заставляет тень наследовать вычисленное значение свойстваcolor(цвет текста) самого элемента. Если в правилеbox-shadowвообще не указать параметр цвета, браузер по умолчанию применит именно поведениеcurrentColor. Это свойство удобно для создания кнопок, бейджей или иконок, где цвет текста, рамки и свечения должен синхронно меняться при смене темы или модификатора класса без дублирования цветовых кодов. -
transparent- вычисляет полностью прозрачный черный цвет, что технически эквивалентно записиrgba(0, 0, 0, 0). Сама по себе такая тень невидима на экране, но ключевое слово необходимо для резервирования структуры свойства в таблицах стилей, когда нужно подготовить элемент к появлению тени при определенных условиях или сбросить видимость отдельного слоя без удаления всего правила.
/* Тень автоматически окрасится в синий цвет #2563eb вслед за текстом кнопки */
.button-primary {
color: #2563eb;
box-shadow: 0 4px 14px currentColor;
}
Контрастность границ и требования доступности WCAG
При проектировании современных интерфейсов дизайнеры часто отказываются от явных рамок (
border
) вокруг карточек, полей ввода и кнопок, возлагая функцию визуального разделения контента исключительно на мягкую тень. Такой подход создает риски для доступности интерфейса (accessibility).
Согласно руководству WCAG, пользовательские компоненты и границы интерактивных областей должны иметь достаточный контраст относительно прилегающего фона (для нетекстового контента и границ полей форм минимальный порог контрастности составляет 3:1). Чрезмерно размытая тень с низкой плотностью альфа-канала (например,
opacity
на уровне 3-5%) на мониторах с низкой калибровкой, при ярком внешнем освещении или у пользователей с ослабленным зрением полностью сливается с фоном. В результате белый блок на белой странице теряет свои габариты, и пользователь не может точно определить кликабельную область или границы текстового поля.
Чтобы сохранить читаемость границ элементов и соблюсти баланс между эстетикой и доступностью, при настройке цвета и плотности тени учитывают следующие правила:
-
Для интерактивных элементов (полей ввода, кнопок, переключателей) не следует полагаться только на рассеянную тень с большим радиусом размытия - ее необходимо дополнять плотным контуром с нулевым размытием (
blur-radius: 0иspread-radius: 1px) достаточной контрастности либо стандартным свойствомborder. - При верстке карточек товара или информационных блоков на однотонном фоне плотность альфа-канала у самого края элемента должна обеспечивать четкое считывание геометрии контейнера.
- В темных темах оформления (Dark Mode) стандартные темные тени на темно-сером фоне теряют контраст и перестают работать как разделители пространства; в таких условиях плотность тени либо существенно повышают (до 40-60% непрозрачности черного), либо заменяют внешнюю тень на тонкую полупрозрачную светлую обводку.
Многослойные тени и создание сложных дизайн-эффектов
Одиночная тень часто выглядит плоско и неестественно, поскольку при направленном освещении формируется сразу несколько светотеневых зон с разной плотностью и степенью рассеивания. Свойство
box-shadow
принимает список значений, разделенных запятыми (comma-separated list), что позволяет накладывать на один элемент неограниченное количество внешних и внутренних теней одновременно.
При обработке списка слоев браузер выстраивает их по оси Z в обратном порядке относительно записи в коде: первая указанная в правиле тень рендерится на самом верхнем уровне (ближе всего к зрителю), а каждая последующая располагается под предыдущей. Если верхний слой имеет большую площадь, нулевое размытие и непрозрачный цвет, он полностью перекроет все тени, записанные после него. Понимание этого порядка позволяет комбинировать резкие контуры, мягкие градиентные переходы и направленные блики в рамках одного CSS-объявления.
Реалистичный объем и система высот Material Design
Для имитации естественного освещения и передачи высоты элемента над поверхностью (Material Elevation) используют комбинацию из двух или трех слоев с разной геометрией и плотностью альфа-канала. Базовая модель строится на сочетании узкой контактной тени (contact shadow) и широкой рассеянной окружающей тени (ambient shadow):
- Контактная тень (ключевой свет) возникает непосредственно под объектом. Она имеет небольшое вертикальное смещение, малый радиус размытия и повышенную плотность цвета, четко обозначая отрыв элемента от фона.
-
Окружающая тень имитирует рассеянный свет. У нее крупный радиус размытия, заметное смещение вниз и часто отрицательный
spread-radius, чтобы тень не выходила далеко за боковые грани блока, а концентрировалась в нижней части с минимальной непрозрачностью.
/* Многослойная тень средней высоты (Elevation) */
box-shadow:
0 4px 6px -1px rgba(0, 0, 0, 0.1),
0 2px 4px -2px rgba(0, 0, 0, 0.06);
/* Глубокая трехслойная тень для всплывающих контейнеров */
box-shadow:
0 20px 25px -5px rgba(15, 23, 42, 0.12),
0 8px 10px -6px rgba(15, 23, 42, 0.08),
0 1px 3px 0 rgba(15, 23, 42, 0.15);
Неоморфизм и псевдорельефные поверхности
Стиль Neumorphism (Soft UI) создает иллюзию того, что элемент выдавлен из самого фона или вдавлен в него, составляя с подложкой единый монолитный материал. Для построения такого эффекта цвет фона самого элемента и цвет родительского контейнера должны строго совпадать, при этом базовый тон не может быть чисто белым или чисто черным - требуется промежуточный светло-серый, бежевый или приглушенный цветной оттенок.
Объем формируется парой противоположно направленных теней. Если источник света условно расположен в левом верхнем углу, то к левой и верхней граням привязывается светлая тень (блик с отрицательными смещениями по X и Y), а к правой и нижней - темная тень (с положительными смещениями). Для перевода элемента из выпуклого состояния во вдавленное ко всем слоям добавляется модификатор
inset
.
/* Выпуклый блок на фоне #e0e5ec */
box-shadow:
9px 9px 16px rgba(163, 177, 198, 0.6),
-9px -9px 16px rgba(255, 255, 255, 0.5);
/* Вдавленная область (inset) на том же фоне */
box-shadow:
inset 6px 6px 12px rgba(163, 177, 198, 0.6),
inset -6px -6px 12px rgba(255, 255, 255, 0.5);
Глассморфизм и брутализм
В концепции глассморфизма (эффекта матового стекла) тень работает в связке с полупрозрачным фоном элемента и размытием подложки. Задача свойства
box-shadow
здесь двоякая: отделить полупрозрачную пластину от пестрого фона с помощью мягкой внешней тени и одновременно сформировать тонкий внутренний блик по периметру стекла через параметр
inset
.
Противоположный подход используется в веб-брутализме (Neo-Brutalism). Этот стиль полностью отказывается от градиентного сглаживания: параметры размытия и растяжения устанавливаются в нулевые значения (
blur: 0
,
spread: 0
), а цвет задается стопроцентно плотным (обычно чистым черным или контрастным акцентным). В результате позади блока со смещением по диагонали формируется жесткая геометрическая проекция, визуально сочетающаяся со сплошной темной обводкой самого контейнера.
/* Тень и внутренний блик для матового стекла */
box-shadow:
0 8px 32px 0 rgba(31, 38, 135, 0.15),
inset 0 1px 1px 0 rgba(255, 255, 255, 0.4);
/* Жесткая бруталистская тень без размытия */
box-shadow: 6px 6px 0px 0px #000000;
Неоновое свечение и неинвазивные внутренние рамки
Если задать нулевые смещения по обеим осям и выбрать яркий насыщенный оттенок на темном фоне, тень перестает имитировать падение света и превращается в равномерный ореол вокруг блока. Многослойное наложение разных радиусов размытия с добавлением внутреннего свечения создает эффект неоновой трубки (glow effect). Первым слоем часто ставят узкий почти белый контур, имитирующий раскаленный центр источника света, а последующими - широкие цветные ореолы.
Другое прикладное применение нулевого смещения и нулевого размытия - создание множественных рамок внутри или снаружи элемента только за счет параметра растяжения. В отличие от стандартного свойства
border
, такая обводка не изменяет геометрии блока и позволяет в одной строке кода отрисовать сразу несколько концентрических контуров разных цветов.
/* Многослойное неоновое свечение (Glow Effect) */
box-shadow:
0 0 5px #ffffff,
0 0 15px #00ffcc,
0 0 35px rgba(0, 255, 204, 0.6),
inset 0 0 12px rgba(0, 255, 204, 0.4);
/* Двойная внутренняя обводка (1px белая и 3px синяя за ней) */
box-shadow:
inset 0 0 0 1px rgba(255, 255, 255, 0.8),
inset 0 0 0 4px #2563eb;
Сводная таблица параметров для типовых дизайн-эффектов
Выбор конкретных числовых соотношений между смещением, размытием и растяжением зависит от целевого визуального стиля интерфейса:
| Визуальный стиль | Количество слоев | Смещение (X / Y) | Размытие (Blur) и растяжение (Spread) | Особенности цвета и прозрачности |
|---|---|---|---|---|
| Material Elevation | От 2 до 3 внешних |
По X:
0px
; по Y: растет пропорционально высоте от
1px
до
24px
|
blur
превышает сдвиг по Y в 1.5-2 раза;
spread
часто отрицательный
|
Низкая плотность альфа-канала (5-15%), нейтральные или холодные темные тона |
| Neumorphism |
2 (оба внешние или оба
inset
)
|
Симметричные с противоположными знаками (например,
8px 8px
и
-8px -8px
)
|
blur
в 1.5-2 раза больше смещения;
spread: 0px
|
Один слой темнее базового фона, второй - светлее (полупрозрачный белый) |
| Брутализм | 1 внешний |
Одинаковый или близкий сдвиг по обеим осям (от
4px
до
10px
)
|
Строго нулевые значения:
blur: 0px
,
spread: 0px
|
Непрозрачный цвет (100% плотность), максимальный контраст с фоном |
| Glow Effect |
От 2 до 4 (внешние плюс
inset
)
|
Нулевое смещение по обеим осям (
0px 0px
)
|
Последовательное увеличение
blur
от слоя к слою (например,
5px
,
20px
,
40px
)
|
Яркие насыщенные оттенки; в центре плотность выше, к краям снижается |
| Внутренняя обводка |
1 или несколько со значением
inset
|
Нулевое смещение (
0px 0px
)
|
blur: 0px
; толщина линии задается положительным значением
spread
|
Любая плотность цвета; при наложении нескольких рамок каждый следующий
spread
должен быть шире предыдущего
|
Взаимодействие с блочной моделью и UI-компонентами
Сгенерированное правило
box-shadow
при переносе в рабочую верстку подчиняется строгим алгоритмам расчета геометрии DOM-узлов. Тень является исключительно визуальным эффектом отрисовки и полностью игнорируется при вычислении габаритов блочной модели (box model). Даже при задании крупных значений размытия и растяжения в десятки пикселей физические размеры элемента (ширина и высота) остаются неизменными, а соседние блоки в потоке документа не сдвигаются.
Поскольку тень не резервирует под себя место на странице, ее внешние края свободно выходят за пределы рамки элемента (border box) и накладываются на прилегающие контейнеры. Если два блока расположены вплотную или с минимальным внешним отступом (
margin
), широко рассеянная тень первого компонента окажется под фоном второго компонента, так как последующие элементы в HTML-разметке по умолчанию перекрывают предыдущие. Для принудительного вывода тени поверх соседних блоков элементу необходимо явно задать позиционирование (например,
position: relative
) и повысить его приоритет по оси аппликат с помощью свойства
z-index
.
Влияние скругления углов на контур тени
Геометрия тени жестко привязана к внешней границе рамки элемента. Если к компоненту применяется свойство
border-radius
, контур внешней и внутренней тени автоматически повторяет заданную кривизну углов без необходимости прописывать дополнительные правила.
При одновременном использовании
border-radius
и ненулевого параметра растяжения (
spread-radius
) браузер пересчитывает радиус скругления самой тени по математической формуле, чтобы сохранить визуальную пропорциональность углов. Если тень расширяется (
spread
больше нуля), к базовому радиусу скругления элемента прибавляется значение растяжения. Если тень сжимается, радиус уменьшается. Когда базовый
border-radius
равен
0px
(прямоугольный блок), даже при большом положительном
spread-radius
углы тени останутся строго прямыми до момента применения размытия.
Проблема обрезания тени родительским контейнером
Частая ошибка при интеграции теней в карточки товаров, слайдеры и списки - жесткое обрезание размытого края границей родительского блока. Это происходит, когда у обертки установлено свойство
overflow: hidden
,
overflow: scroll
или
overflow: auto
, а дочерний элемент с тенью прилегает вплотную к краям этого контейнера. Поскольку тень не имеет физического веса в потоке, контейнер не учитывает ее вылет за рамки дочернего узла и отсекает все пиксели, вышедшие за пределы области просмотра (scrollport).
Для предотвращения обрезания контура тени в верстке применяются следующие структурные приемы:
-
Замена правила обтекания у родительской обертки на
overflow: visible, если архитектура макета не требует принудительного скрытия выпадающего контента или создания полос прокрутки. -
Добавление внутренних отступов (
padding) родительскому контейнеру со значением, равным или превышающим сумму смещения, размытия и растяжения тени на соответствующей стороне (например,padding-bottom: 24pxпри суммарном нижнем вылете тени на20px). -
Использование внешних отступов (
margin) на самом дочернем элементе внутри прокручиваемых списков или сеток (Flexbox, CSS Grid), чтобы отодвинуть границу карточки от края области отсечения. -
Перенос свойства
overflow: hiddenс внешней обертки непосредственно на внутренний контейнер изображения или текста внутри самой карточки, оставляя внешний блок со скруглением и тенью свободным от ограничений обрезки.
Специфика применения в типовых компонентах интерфейса
Выбор параметров тени и способ ее внедрения в CSS-код напрямую зависят от функциональной роли элемента в пользовательском интерфейсе и его положения в визуальной иерархии экрана. В таблице приведены технические особенности интеграции теней для основных категорий UI-компонентов.
| Компонент интерфейса | Роль тени и тип позиционирования | Рекомендуемая конфигурация и особенности верстки |
|---|---|---|
| Карточки (Cards) и виджеты |
Визуальное отделение контентного блока от фона страницы без использования жестких рамок
border
|
Внешняя тень с мягким размытием и небольшим смещением вниз. При размещении в сетках CSS Grid шаг отступа
gap
должен превышать радиус вылета тени во избежание наложения на соседние ячейки
|
| Кнопки (Buttons) | Индикация кликабельности и объема элемента управления |
Компактная внешняя тень (часто с оттенком основного цвета кнопки) для обычного состояния или внутренняя тень
inset
в верхней части блока для имитации физического вдавливания
|
| Модальные окна (Modals) и выпадающие меню | Изоляция всплывающего слоя от заблокированного или фонового контента на максимальной высоте по оси Z |
Крупномасштабная многослойная тень с большим
blur-radius
и высоким значением
z-index
у самого контейнера для перекрытия всех нижележащих элементов страницы
|
| Фиксированные панели (Sticky Headers, Sidebars) | Обозначение границы прокрутки, под которую уходит основной контент страницы |
Направленная внешняя тень со смещением только по одной оси (например,
0px 4px 12px -2px
для верхней шапки). Отрицательный
spread
убирает лишнее свечение по бокам панели
|
| Поля ввода форм (Inputs, Textareas) | Создание эффекта углубления текстового поля в поверхность формы или отрисовка контура фокуса |
Использование
inset
с минимальным смещением сверху для эффекта ниши либо внешняя тень с
blur: 0px
и положительным
spread
для замены стандартного браузерного
outline
с сохранением
border-radius
|
Ниже представлен пример CSS-кода для верстки текстового поля ввода, где одновременно задействованы внутренняя тень для создания легкого углубления и внешняя неразмытая тень, выполняющая роль дополнительной внешней рамки без изменения размеров самого поля в блочной модели:
.form-input {
box-sizing: border-box;
width: 100%;
padding: 10px 14px;
border: 1px solid #cbd5e1;
border-radius: 6px;
background-color: #ffffff;
box-shadow:
inset 0px 2px 4px 0px rgba(15, 23, 42, 0.06),
0px 0px 0px 3px rgba(59, 130, 246, 0.15);
}
В данной конфигурации внутренняя тень рендерится строго внутри границы
border
, подчеркивая верхний край поля, а второй слой формирует плотное кольцо шириной
3px
снаружи элемента, плавно огибая скругление в
6px
и не сдвигая расположенные ниже подписи или кнопки формы.
Анимация теней в интерактивных состояниях и оптимизация рендеринга
В статичном виде тени задают базовую глубину интерфейса, однако при взаимодействии пользователя с элементами - карточками, кнопками или полями ввода - параметры тени часто изменяют для создания визуального отклика. Сгенерированные конфигурации
box-shadow
привязывают к псевдоклассам состояний, чтобы имитировать приближение объекта к источнику света или его физическое нажатие.
Применение теней в псевдоклассах состояний
Для каждого интерактивного сценария подбирают отдельные наборы значений смещения, размытия и растяжения, которые последовательно сменяют друг друга при действиях пользователя:
-
Состояние
:hover(наведение курсора): используется для создания эффекта подъема элемента над плоскостью страницы. В этом состоянии увеличивают вертикальное смещение и радиус размытия, одновременно снижая плотность альфа-канала для имитации рассеивания света на большей высоте. -
Состояние
:focusи:focus-visible(фокус с клавиатуры или при вводе): применяется для четкой индикации активного элемента. Стандартную тень дополняют или заменяют неразмытым контуром с положительным радиусом распространения, который играет роль заметного кольца фокуса. -
Состояние
:active(момент клика или нажатия): передает ощущение физического вдавливания кнопки. Здесь внешнюю тень резко сокращают до минимальных значений вплотную к границам блока либо заменяют на внутреннюю с помощью ключевого словаinset.
Плавные переходы через transition и анимация по ключевым кадрам
Чтобы смена состояний не происходила скачкообразно, в базовом классе элемента объявляют свойство
transition
. Для естественной динамики движения вместо линейных функций времени задают пользовательскую кривую Безье через функцию
cubic-bezier()
, обеспечивающую быстрое начало и плавное замедление анимации в конце.
Ниже показан пример кода для интерактивной кнопки, которая при наведении плавно приподнимается за счет одновременного изменения тени и смещения по вертикали, а при клике опускается в исходную плоскость:
.interactive-btn {
background-color: #2563eb;
color: #ffffff;
padding: 12px 24px;
border-radius: 8px;
border: none;
box-shadow: 0px 2px 4px 0px rgba(15, 23, 42, 0.1);
transition:
box-shadow 0.25s cubic-bezier(0.4, 0, 0.2, 1),
transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
}
.interactive-btn:hover {
transform: translateY(-2px);
box-shadow: 0px 10px 20px -2px rgba(15, 23, 42, 0.18);
}
.interactive-btn:active {
transform: translateY(0px);
box-shadow: 0px 1px 2px 0px rgba(15, 23, 42, 0.15);
}
Критическое правило при интерполяции многослойных теней: количество слоев и наличие ключевого слова
inset
в начальном и конечном состояниях должны строго совпадать. Если в базовом состоянии задана одна тень, а в состоянии
:hover
указаны два слоя через запятую, браузер не сможет рассчитать промежуточные значения и переключит эффект рывком. Для плавного появления дополнительного слоя его заранее прописывают в исходном состоянии с нулевыми параметрами смещения и полностью прозрачным цветом
rgba(0, 0, 0, 0)
.
Для циклических эффектов, не требующих участия курсора (например, пульсирующего индикатора уведомлений или подсветки целевого действия), используют правило
@keyframes
:
@keyframes pulse-glow {
0% {
box-shadow: 0px 0px 0px 0px rgba(59, 130, 246, 0.5);
}
70% {
box-shadow: 0px 0px 0px 12px rgba(59, 130, 246, 0);
}
100% {
box-shadow: 0px 0px 0px 0px rgba(59, 130, 246, 0);
}
}
.status-badge {
border-radius: 50%;
animation: pulse-glow 2s infinite cubic-bezier(0.66, 0, 0, 1);
}
Механика браузерного рендеринга и нагрузка на процессор
Несмотря на простоту написания, прямая анимация свойства
box-shadow
является ресурсоемкой операцией для конвейера пикселей браузера. Поскольку тень не влияет на геомeтрию блочной модели и не сдвигает соседние узлы, браузер пропускает этап пересчета макета (Layout). Однако при изменении радиуса размытия или смещения на каждом шаге анимации запускается процесс перерисовки - Repaint.
В ходе Repaint центральный процессор (CPU) вынужден заново вычислять матрицу размытия по Гауссу для каждого кадра и обновлять растровую карту слоя перед отправкой ее на композицию. При наличии сложных многослойных теней с большим радиусом размытия или при одновременной анимации десятков карточек в сетке каталога это приводит к просадке частоты кадров и визуальным подергиваниям интерфейса, особенно на мобильных устройствах и экранах с высокой плотностью пикселей.
В таблице представлено сравнение двух подходов к созданию анимированных теней с точки зрения этапов рендеринга:
| Критерий сравнения | Прямая анимация box-shadow | Анимация через псевдоэлемент и opacity |
|---|---|---|
| Задействованные этапы конвейера | Paint (перерисовка пикселей) + Composite (сборка слоев) | Только Composite (композиция готовых текстур) |
| Основной вычислительный узел | CPU (программный пересчет растровой маски размытия в каждом кадре) | GPU (аппаратное изменение прозрачности готового слоя) |
| Риск потери плавности (падения FPS) | Высокий при больших значениях размытия и множестве элементов | Минимальный, стабильная кадровая частота |
| Сложность структуры CSS-кода | Низкая (одно правило в селекторе элемента) | Средняя (требуется позиционирование псевдоэлемента) |
Паттерн аппаратной оптимизации через псевдоэлементы и GPU-ускорение
Чтобы полностью исключить этап Repaint и перенести задачу на графический процессор (GPU), применяют технику разделения состояний. Браузеры способны анимировать на уровне композиции слоев без перерисовки только два свойства:
transform
и
opacity
. Суть оптимизации заключается в том, чтобы отрисовать тяжелую финальную тень один раз на скрытом псевдоэлементе
::after
или
::before
, а при наведении плавно проявлять этот псевдоэлемент через изменение его прозрачности.
Пошаговая реализация оптимизированного паттерна включает следующие действия:
-
Базовому контейнеру задают
position: relativeи легкую начальную тень, которая остается статичной. -
Создают псевдоэлемент
::afterс абсолютным позиционированием (inset: 0), который полностью повторяет габариты иborder-radiusродительского блока. -
На псевдоэлемент вешают финальную глубокую тень, полученную в генераторе, и скрывают его с помощью
opacity: 0. -
Добавляют свойство
will-change: opacity, transform, которое заранее сообщает браузеру о необходимости выделить элемент в отдельный композитный слой в видеопамяти. -
В состоянии
:hoverизменяют масштаб или положение самой карточки черезtransform: scale()илиtranslateY(), а у псевдоэлемента меняют значениеopacityна1.
Пример готового CSS-кода с аппаратным ускорением для карточки товара:
.card-optimized {
position: relative;
border-radius: 12px;
background-color: #ffffff;
box-shadow: 0px 2px 6px 0px rgba(15, 23, 42, 0.06);
transition: transform 0.3s cubic-bezier(0.22, 1, 0.36, 1);
will-change: transform;
}
.card-optimized::after {
content: "";
position: absolute;
inset: 0;
border-radius: inherit;
box-shadow: 0px 20px 30px -10px rgba(15, 23, 42, 0.2);
opacity: 0;
transition: opacity 0.3s cubic-bezier(0.22, 1, 0.36, 1);
will-change: opacity;
z-index: -1;
pointer-events: none;
}
.card-optimized:hover {
transform: translateY(-4px) scale(1.01);
}
.card-optimized:hover::after {
opacity: 1;
}
В этой структуре свойство
border-radius: inherit
гарантирует точное совпадение геометрии углов,
z-index: -1
уводит слой с тенью под основную карточку, а
pointer-events: none
предотвращает перехват кликов мыши псевдоэлементом. Поскольку сама геометрия тени в процессе наведения не меняется, браузер рендерит растровую маску только один раз при загрузке страницы, а при взаимодействии плавно смешивает два готовых слоя силами GPU.
Интеграция CSS-кода в проекты, препроцессоры и фреймворки
Внедрение полученного CSS-правила в архитектуру проекта требует адаптации кода под используемый стек технологий, систему дизайн-токенов и требования к поддержке различных браузерных движков. Вместо прямого копирования значений в отдельные селекторы параметры теней обычно централизуют через нативные переменные, препроцессорные шаблоны или конфигурационные файлы сборщиков.
Кроссбраузерность и использование вендорных префиксов
Стандартное свойство
box-shadow
поддерживается всеми актуальными десктопными и мобильными браузерами на базе движков Blink, WebKit и Gecko без дополнительных модификаторов. Вендорные префиксы требуются исключительно при разработке интерфейсов под устаревшее программное обеспечение или специфические встраиваемые браузеры старых ревизий.
Правила применения префиксов для ранних версий браузерных движков:
-
-webkit-box-shadow- необходим для корректного отображения эффекта в браузерах Safari до версии 5.1, iOS Safari до версии 5.0 и нативных браузерах Android до версии 4.0. -
-moz-box-shadow- используется при необходимости поддержки движка Gecko в браузере Firefox версий ниже 4.0.
При ручном написании фоллбэков префиксные свойства размещают строго перед стандартным правилом, чтобы современные парсеры перезаписывали устаревшие инструкции финальным значением по спецификации:
.legacy-compatible-box {
-webkit-box-shadow: 0px 4px 12px 0px rgba(0, 0, 0, 0.15);
-moz-box-shadow: 0px 4px 12px 0px rgba(0, 0, 0, 0.15);
box-shadow: 0px 4px 12px 0px rgba(0, 0, 0, 0.15);
}
В современных сборках на базе Webpack, Vite или Parcel добавление префиксов делегируют плагину Autoprefixer в составе PostCSS, который подставляет нужные декларации на основе целевого списка поддерживаемых платформ в файле конфигурации
.browserslistrc
.
Организация теней через CSS-переменные и темизация
Хранение параметров теней в кастомных свойствах (CSS custom properties) внутри псевдокласса
:root
упрощает поддержку дизайн-системы и переключение цветовых схем. При смене светлой темы на темную достаточно переопределить переменные прозрачности или цвета в медиазапросе
prefers-color-scheme: dark
или селекторе атрибута темы, не дублируя геометрические параметры размытия и смещения в каждом компоненте.
Доступны два подхода к декомпозиции сгенерированного кода: сохранение всей строки целиком или вынесение в переменную только цветовых каналов для динамического управления плотностью тени.
:root {
--shadow-color: 220, 40%, 15%;
--shadow-elevation-sm: 0px 2px 4px -1px hsla(var(--shadow-color), 0.08);
--shadow-elevation-md: 0px 8px 16px -4px hsla(var(--shadow-color), 0.12),
0px 2px 6px -1px hsla(var(--shadow-color), 0.06);
}
[data-theme="dark"] {
--shadow-color: 220, 80%, 2%;
--shadow-elevation-sm: 0px 2px 4px 0px hsla(var(--shadow-color), 0.45);
--shadow-elevation-md: 0px 10px 20px -2px hsla(var(--shadow-color), 0.6),
0px 4px 8px -2px hsla(var(--shadow-color), 0.4);
}
.panel-element {
box-shadow: var(--shadow-elevation-md);
}
Создание миксинов и функций в препроцессорах SASS и SCSS
В проектах с препроцессорами SCSS или SASS повторяющиеся комбинации теней инкапсулируют в директивы
@mixin
. Это позволяет передавать базовый цвет или уровень высоты элемента в качестве аргументов, а также объединять основное правило с префиксами или псевдоэлементами внутри одного вызываемого блока.
Если в миксин требуется передать многослойную тень, разделенную запятыми, в синтаксисе SCSS используют индикатор переменного числа аргументов
...
(rest argument), иначе компилятор воспримет вторую тень как следующий параметр миксина и выдаст синтаксическую ошибку.
@mixin apply-shadow($shadows...) {
-webkit-box-shadow: $shadows;
box-shadow: $shadows;
}
@mixin surface-card($bg-color: #ffffff, $shadow-alpha: 0.1) {
background-color: $bg-color;
border-radius: 8px;
@include apply-shadow(
0px 4px 6px -1px rgba(15, 23, 42, $shadow-alpha),
0px 2px 4px -2px rgba(15, 23, 42, $shadow-alpha * 0.6)
);
}
.widget-container {
@include surface-card(#f8fafc, 0.15);
}
Перенос значений в фреймворк Tailwind CSS
При использовании utility-first фреймворка Tailwind CSS полученное значение свойства
box-shadow
интегрируют двумя способами: через расширение глобальной темы проекта или локально в разметке компонента через синтаксис произвольных значений (arbitrary values).
Способы подключения кастомных теней в Tailwind CSS и их особенности приведены в таблице:
| Метод интеграции | Место объявления | Синтаксис и правила форматирования | Сценарий применения |
|---|---|---|---|
| Расширение конфигурации |
Секция
theme.extend.boxShadow
в файле
tailwind.config.js
|
Стандартная строка CSS-значения в кавычках; запятые и пробелы сохраняются без изменений | Многократное использование тени как части единой дизайн-системы проекта |
| Произвольные значения (Arbitrary values) |
Атрибут
class
непосредственно в HTML или JSX-шаблоне
|
Запись внутри квадратных скобок
shadow-[...]
; все пробелы между параметрами заменяются на символ нижнего подчеркивания
_
|
Единичные уникальные эффекты, быстрое прототипирование без перезапуска сборщика |
Для регистрации глобального утилитарного класса строку параметров без имени самого свойства
box-shadow:
и точки с запятой добавляют в объект
extend
конфигурационного файла:
// tailwind.config.js
module.exports = {
theme: {
extend: {
boxShadow: {
'custom-soft': '0px 10px 25px -5px rgba(15, 23, 42, 0.08), 0px 4px 10px -2px rgba(15, 23, 42, 0.04)',
'inner-border': 'inset 0px 0px 0px 1px rgba(255, 255, 255, 0.15)',
}
}
}
}
После сохранения конфигурации в верстке становятся доступны классы
shadow-custom-soft
и
shadow-inner-border
. Если же правка конфигурационного файла нецелесообразна, правило переносят прямо в атрибут класса элемента, заменяя каждый пробел на символ
_
, чтобы JIT-компилятор не разбивал строку на отдельные неизвестные утилиты:
<div class=" rounded-xl bg-white p-6 shadow-[0px_10px_25px_-5px_rgba(15,23,42,0.12)]">
Контент блока с инлайновой утилитой тени
</div>
Поведение теней в режиме принудительной высокой контрастности
Операционные системы со включенными специальными возможностями (например, режим контрастных тем в Windows) активируют в браузерах медиа-состояние
forced-colors: active
. В этом режиме движок принудительно отключает все декоративные эффекты страницы для обеспечения максимальной читаемости текста, автоматически сбрасывая свойство
box-shadow
в значение
none
.
Если визуальные границы карточки, модального окна или поля ввода были сформированы исключительно за счет внешней тени без использования свойства
border
или
outline
, в режиме высокой контрастности элемент полностью сольется с фоном страницы. Чтобы сохранить различимость контуров UI-компонентов для пользователей ассистивных технологий, применяют один из двух технических приемов:
-
Задают элементу базовую прозрачную рамку
border: 1px solid transparent. В обычном режиме она не видна и не мешает рендерингу тени, а при активацииforced-colorsсистема автоматически окрашивает прозрачную границу в системный контрастный цвет текста (CanvasText). -
Добавляют специальный медиазапрос
@media (forced-colors: active), внутри которого явно прописывают контур через свойствоoutlineилиborderс использованием системных ключевых слов цвета.
.accessible-card {
background-color: #ffffff;
border-radius: 8px;
box-shadow: 0px 6px 16px 0px rgba(0, 0, 0, 0.08);
border: 1px solid transparent;
}
@media (forced-colors: active) {
.accessible-card:focus-visible {
outline: 2px solid Highlight;
outline-offset: 2px;
}
}